mongoid 6.4.4 → 7.3.2

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 (1341) 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 +34 -20
  6. data/Rakefile +75 -5
  7. data/lib/config/locales/en.yml +115 -53
  8. data/lib/mongoid/association/accessors.rb +429 -0
  9. data/lib/mongoid/association/bindable.rb +200 -0
  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 +135 -0
  13. data/lib/mongoid/association/eager_loadable.rb +38 -0
  14. data/lib/mongoid/association/embedded/batchable.rb +386 -0
  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/association/embedded/embeds_many/binding.rb +48 -0
  21. data/lib/mongoid/association/embedded/embeds_many/buildable.rb +48 -0
  22. data/lib/mongoid/association/embedded/embeds_many/proxy.rb +562 -0
  23. data/lib/mongoid/association/embedded/embeds_many.rb +214 -0
  24. data/lib/mongoid/association/embedded/embeds_one/binding.rb +50 -0
  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/association/many.rb +215 -0
  31. data/lib/mongoid/association/marshalable.rb +36 -0
  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 +131 -0
  35. data/lib/mongoid/association/nested.rb +18 -0
  36. data/lib/mongoid/association/one.rb +62 -0
  37. data/lib/mongoid/association/options.rb +155 -0
  38. data/lib/mongoid/association/proxy.rb +210 -0
  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/association/referenced/has_many/binding.rb +41 -0
  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 +550 -0
  56. data/lib/mongoid/association/referenced/has_many/proxy.rb +588 -0
  57. data/lib/mongoid/association/referenced/has_many.rb +278 -0
  58. data/lib/mongoid/association/referenced/has_one/binding.rb +49 -0
  59. data/lib/mongoid/association/referenced/has_one/buildable.rb +75 -0
  60. data/lib/mongoid/association/referenced/has_one/eager.rb +37 -0
  61. data/lib/mongoid/association/referenced/has_one/nested_builder.rb +128 -0
  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 +25 -2
  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 +19 -16
  77. data/lib/mongoid/attributes/nested.rb +29 -16
  78. data/lib/mongoid/attributes/processing.rb +10 -8
  79. data/lib/mongoid/attributes/projector.rb +120 -0
  80. data/lib/mongoid/attributes/readonly.rb +5 -5
  81. data/lib/mongoid/attributes.rb +93 -57
  82. data/lib/mongoid/cacheable.rb +5 -3
  83. data/lib/mongoid/changeable.rb +4 -2
  84. data/lib/mongoid/clients/factory.rb +42 -10
  85. data/lib/mongoid/clients/options.rb +17 -13
  86. data/lib/mongoid/clients/sessions.rb +23 -4
  87. data/lib/mongoid/clients/storage_options.rb +7 -5
  88. data/lib/mongoid/clients/validators/storage.rb +2 -0
  89. data/lib/mongoid/clients/validators.rb +2 -0
  90. data/lib/mongoid/clients.rb +3 -1
  91. data/lib/mongoid/composable.rb +9 -6
  92. data/lib/mongoid/config/environment.rb +23 -8
  93. data/lib/mongoid/config/options.rb +20 -12
  94. data/lib/mongoid/config/validators/client.rb +2 -0
  95. data/lib/mongoid/config/validators/option.rb +2 -0
  96. data/lib/mongoid/config/validators.rb +2 -0
  97. data/lib/mongoid/config.rb +75 -11
  98. data/lib/mongoid/contextual/aggregable/memory.rb +3 -1
  99. data/lib/mongoid/contextual/aggregable/mongo.rb +13 -9
  100. data/lib/mongoid/contextual/atomic.rb +24 -6
  101. data/lib/mongoid/contextual/command.rb +2 -0
  102. data/lib/mongoid/contextual/geo_near.rb +6 -4
  103. data/lib/mongoid/contextual/map_reduce.rb +5 -2
  104. data/lib/mongoid/contextual/memory.rb +23 -3
  105. data/lib/mongoid/contextual/mongo.rb +39 -13
  106. data/lib/mongoid/contextual/none.rb +2 -0
  107. data/lib/mongoid/contextual/queryable.rb +2 -0
  108. data/lib/mongoid/contextual.rb +7 -4
  109. data/lib/mongoid/copyable.rb +20 -9
  110. data/lib/mongoid/criteria/findable.rb +12 -2
  111. data/lib/mongoid/criteria/includable.rb +21 -19
  112. data/lib/mongoid/criteria/inspectable.rb +2 -0
  113. data/lib/mongoid/criteria/marshalable.rb +2 -0
  114. data/lib/mongoid/criteria/modifiable.rb +10 -3
  115. data/lib/mongoid/criteria/options.rb +4 -2
  116. data/lib/mongoid/criteria/permission.rb +2 -0
  117. data/lib/mongoid/criteria/queryable/aggregable.rb +2 -0
  118. data/lib/mongoid/criteria/queryable/expandable.rb +69 -0
  119. data/lib/mongoid/criteria/queryable/extensions/array.rb +3 -1
  120. data/lib/mongoid/criteria/queryable/extensions/big_decimal.rb +3 -1
  121. data/lib/mongoid/criteria/queryable/extensions/boolean.rb +3 -1
  122. data/lib/mongoid/criteria/queryable/extensions/date.rb +3 -1
  123. data/lib/mongoid/criteria/queryable/extensions/date_time.rb +5 -6
  124. data/lib/mongoid/criteria/queryable/extensions/hash.rb +3 -1
  125. data/lib/mongoid/criteria/queryable/extensions/nil_class.rb +3 -1
  126. data/lib/mongoid/criteria/queryable/extensions/numeric.rb +4 -2
  127. data/lib/mongoid/criteria/queryable/extensions/object.rb +3 -1
  128. data/lib/mongoid/criteria/queryable/extensions/range.rb +3 -1
  129. data/lib/mongoid/criteria/queryable/extensions/regexp.rb +9 -7
  130. data/lib/mongoid/criteria/queryable/extensions/set.rb +3 -1
  131. data/lib/mongoid/criteria/queryable/extensions/string.rb +4 -2
  132. data/lib/mongoid/criteria/queryable/extensions/symbol.rb +3 -1
  133. data/lib/mongoid/criteria/queryable/extensions/time.rb +4 -2
  134. data/lib/mongoid/criteria/queryable/extensions/time_with_zone.rb +15 -1
  135. data/lib/mongoid/criteria/queryable/extensions.rb +1 -3
  136. data/lib/mongoid/criteria/queryable/key.rb +101 -14
  137. data/lib/mongoid/criteria/queryable/macroable.rb +3 -1
  138. data/lib/mongoid/criteria/queryable/mergeable.rb +184 -15
  139. data/lib/mongoid/criteria/queryable/optional.rb +5 -3
  140. data/lib/mongoid/criteria/queryable/options.rb +2 -0
  141. data/lib/mongoid/criteria/queryable/pipeline.rb +14 -6
  142. data/lib/mongoid/criteria/queryable/selectable.rb +399 -98
  143. data/lib/mongoid/criteria/queryable/selector.rb +46 -39
  144. data/lib/mongoid/criteria/queryable/smash.rb +2 -0
  145. data/lib/mongoid/criteria/queryable/storable.rb +233 -0
  146. data/lib/mongoid/criteria/queryable.rb +7 -2
  147. data/lib/mongoid/criteria/scopable.rb +2 -0
  148. data/lib/mongoid/criteria.rb +88 -18
  149. data/lib/mongoid/document.rb +32 -22
  150. data/lib/mongoid/equality.rb +3 -2
  151. data/lib/mongoid/errors/ambiguous_relationship.rb +4 -2
  152. data/lib/mongoid/errors/callback.rb +2 -0
  153. data/lib/mongoid/errors/criteria_argument_required.rb +19 -0
  154. data/lib/mongoid/errors/delete_restriction.rb +10 -10
  155. data/lib/mongoid/errors/document_not_destroyed.rb +2 -0
  156. data/lib/mongoid/errors/document_not_found.rb +2 -0
  157. data/lib/mongoid/errors/eager_load.rb +6 -2
  158. data/lib/mongoid/errors/in_memory_collation_not_supported.rb +2 -0
  159. data/lib/mongoid/errors/invalid_collection.rb +2 -0
  160. data/lib/mongoid/errors/invalid_config_option.rb +2 -0
  161. data/lib/mongoid/errors/invalid_dependent_strategy.rb +34 -0
  162. data/lib/mongoid/errors/invalid_discriminator_key_target.rb +25 -0
  163. data/lib/mongoid/errors/invalid_elem_match_operator.rb +33 -0
  164. data/lib/mongoid/errors/invalid_estimated_count_criteria.rb +26 -0
  165. data/lib/mongoid/errors/invalid_expression_operator.rb +28 -0
  166. data/lib/mongoid/errors/invalid_field.rb +2 -0
  167. data/lib/mongoid/errors/invalid_field_operator.rb +33 -0
  168. data/lib/mongoid/errors/invalid_field_option.rb +2 -0
  169. data/lib/mongoid/errors/invalid_find.rb +2 -0
  170. data/lib/mongoid/errors/invalid_includes.rb +2 -0
  171. data/lib/mongoid/errors/invalid_index.rb +2 -0
  172. data/lib/mongoid/errors/invalid_options.rb +4 -2
  173. data/lib/mongoid/errors/invalid_path.rb +2 -0
  174. data/lib/mongoid/errors/invalid_persistence_option.rb +2 -0
  175. data/lib/mongoid/errors/invalid_query.rb +41 -0
  176. data/lib/mongoid/errors/invalid_relation.rb +4 -2
  177. data/lib/mongoid/errors/invalid_relation_option.rb +31 -0
  178. data/lib/mongoid/errors/invalid_scope.rb +2 -0
  179. data/lib/mongoid/errors/invalid_session_use.rb +2 -0
  180. data/lib/mongoid/errors/invalid_set_polymorphic_relation.rb +6 -4
  181. data/lib/mongoid/errors/invalid_storage_options.rb +2 -0
  182. data/lib/mongoid/errors/invalid_storage_parent.rb +2 -0
  183. data/lib/mongoid/errors/invalid_time.rb +2 -0
  184. data/lib/mongoid/errors/invalid_value.rb +2 -0
  185. data/lib/mongoid/errors/inverse_not_found.rb +3 -1
  186. data/lib/mongoid/errors/mixed_client_configuration.rb +2 -0
  187. data/lib/mongoid/errors/mixed_relations.rb +2 -0
  188. data/lib/mongoid/errors/mongoid_error.rb +3 -1
  189. data/lib/mongoid/errors/nested_attributes_metadata_not_found.rb +3 -1
  190. data/lib/mongoid/errors/no_client_config.rb +4 -2
  191. data/lib/mongoid/errors/no_client_database.rb +2 -0
  192. data/lib/mongoid/errors/no_client_hosts.rb +2 -0
  193. data/lib/mongoid/errors/no_clients_config.rb +2 -0
  194. data/lib/mongoid/errors/no_default_client.rb +3 -1
  195. data/lib/mongoid/errors/no_environment.rb +2 -0
  196. data/lib/mongoid/errors/no_map_reduce_output.rb +2 -0
  197. data/lib/mongoid/errors/no_metadata.rb +2 -0
  198. data/lib/mongoid/errors/no_parent.rb +2 -0
  199. data/lib/mongoid/errors/readonly_attribute.rb +2 -0
  200. data/lib/mongoid/errors/readonly_document.rb +2 -0
  201. data/lib/mongoid/errors/scope_overwrite.rb +2 -0
  202. data/lib/mongoid/errors/too_many_nested_attribute_records.rb +3 -0
  203. data/lib/mongoid/errors/unknown_attribute.rb +2 -0
  204. data/lib/mongoid/errors/unknown_model.rb +27 -0
  205. data/lib/mongoid/errors/unsaved_document.rb +2 -0
  206. data/lib/mongoid/errors/unsupported_javascript.rb +2 -0
  207. data/lib/mongoid/errors/validations.rb +2 -0
  208. data/lib/mongoid/errors.rb +13 -0
  209. data/lib/mongoid/evolvable.rb +4 -2
  210. data/lib/mongoid/extensions/array.rb +28 -11
  211. data/lib/mongoid/extensions/big_decimal.rb +2 -0
  212. data/lib/mongoid/extensions/boolean.rb +3 -2
  213. data/lib/mongoid/extensions/date.rb +13 -3
  214. data/lib/mongoid/extensions/date_time.rb +4 -3
  215. data/lib/mongoid/extensions/decimal128.rb +2 -0
  216. data/lib/mongoid/extensions/false_class.rb +3 -1
  217. data/lib/mongoid/extensions/float.rb +5 -3
  218. data/lib/mongoid/extensions/hash.rb +58 -13
  219. data/lib/mongoid/extensions/integer.rb +5 -3
  220. data/lib/mongoid/extensions/module.rb +2 -0
  221. data/lib/mongoid/extensions/nil_class.rb +2 -0
  222. data/lib/mongoid/extensions/object.rb +20 -8
  223. data/lib/mongoid/extensions/object_id.rb +2 -0
  224. data/lib/mongoid/extensions/range.rb +3 -0
  225. data/lib/mongoid/extensions/regexp.rb +3 -1
  226. data/lib/mongoid/extensions/set.rb +2 -0
  227. data/lib/mongoid/extensions/string.rb +23 -12
  228. data/lib/mongoid/extensions/symbol.rb +2 -0
  229. data/lib/mongoid/extensions/time.rb +14 -0
  230. data/lib/mongoid/extensions/time_with_zone.rb +14 -0
  231. data/lib/mongoid/extensions/true_class.rb +3 -1
  232. data/lib/mongoid/extensions.rb +3 -4
  233. data/lib/mongoid/factory.rb +59 -9
  234. data/lib/mongoid/fields/foreign_key.rb +8 -6
  235. data/lib/mongoid/fields/localized.rb +2 -0
  236. data/lib/mongoid/fields/standard.rb +8 -17
  237. data/lib/mongoid/fields/validators/macro.rb +39 -12
  238. data/lib/mongoid/fields/validators.rb +2 -0
  239. data/lib/mongoid/fields.rb +54 -10
  240. data/lib/mongoid/findable.rb +59 -18
  241. data/lib/mongoid/indexable/specification.rb +3 -1
  242. data/lib/mongoid/indexable/validators/options.rb +2 -0
  243. data/lib/mongoid/indexable.rb +9 -4
  244. data/lib/mongoid/inspectable.rb +4 -2
  245. data/lib/mongoid/interceptable.rb +18 -10
  246. data/lib/mongoid/loggable.rb +13 -7
  247. data/lib/mongoid/matchable.rb +3 -148
  248. data/lib/mongoid/matcher/all.rb +22 -0
  249. data/lib/mongoid/matcher/and.rb +21 -0
  250. data/lib/mongoid/matcher/bits.rb +41 -0
  251. data/lib/mongoid/matcher/bits_all_clear.rb +20 -0
  252. data/lib/mongoid/matcher/bits_all_set.rb +20 -0
  253. data/lib/mongoid/matcher/bits_any_clear.rb +20 -0
  254. data/lib/mongoid/matcher/bits_any_set.rb +20 -0
  255. data/lib/mongoid/matcher/elem_match.rb +36 -0
  256. data/lib/mongoid/matcher/elem_match_expression.rb +20 -0
  257. data/lib/mongoid/matcher/eq.rb +11 -0
  258. data/lib/mongoid/matcher/eq_impl.rb +32 -0
  259. data/lib/mongoid/matcher/eq_impl_with_regexp.rb +21 -0
  260. data/lib/mongoid/matcher/exists.rb +15 -0
  261. data/lib/mongoid/matcher/expression.rb +35 -0
  262. data/lib/mongoid/matcher/expression_operator.rb +19 -0
  263. data/lib/mongoid/matcher/field_expression.rb +62 -0
  264. data/lib/mongoid/matcher/field_operator.rb +54 -0
  265. data/lib/mongoid/matcher/gt.rb +17 -0
  266. data/lib/mongoid/matcher/gte.rb +17 -0
  267. data/lib/mongoid/matcher/in.rb +25 -0
  268. data/lib/mongoid/matcher/lt.rb +17 -0
  269. data/lib/mongoid/matcher/lte.rb +17 -0
  270. data/lib/mongoid/matcher/mod.rb +17 -0
  271. data/lib/mongoid/matcher/ne.rb +16 -0
  272. data/lib/mongoid/matcher/nin.rb +11 -0
  273. data/lib/mongoid/matcher/nor.rb +25 -0
  274. data/lib/mongoid/matcher/not.rb +29 -0
  275. data/lib/mongoid/matcher/or.rb +21 -0
  276. data/lib/mongoid/matcher/regex.rb +41 -0
  277. data/lib/mongoid/matcher/size.rb +26 -0
  278. data/lib/mongoid/matcher/type.rb +99 -0
  279. data/lib/mongoid/matcher.rb +110 -0
  280. data/lib/mongoid/persistable/creatable.rb +3 -1
  281. data/lib/mongoid/persistable/deletable.rb +11 -9
  282. data/lib/mongoid/persistable/destroyable.rb +11 -3
  283. data/lib/mongoid/persistable/incrementable.rb +7 -3
  284. data/lib/mongoid/persistable/logical.rb +5 -2
  285. data/lib/mongoid/persistable/poppable.rb +3 -1
  286. data/lib/mongoid/persistable/pullable.rb +3 -1
  287. data/lib/mongoid/persistable/pushable.rb +14 -3
  288. data/lib/mongoid/persistable/renamable.rb +10 -3
  289. data/lib/mongoid/persistable/savable.rb +3 -1
  290. data/lib/mongoid/persistable/settable.rb +60 -13
  291. data/lib/mongoid/persistable/unsettable.rb +8 -3
  292. data/lib/mongoid/persistable/updatable.rb +30 -3
  293. data/lib/mongoid/persistable/upsertable.rb +3 -1
  294. data/lib/mongoid/persistable.rb +136 -19
  295. data/lib/mongoid/persistence_context.rb +47 -20
  296. data/lib/mongoid/positional.rb +3 -1
  297. data/lib/mongoid/query_cache.rb +132 -77
  298. data/lib/mongoid/railtie.rb +3 -1
  299. data/lib/mongoid/railties/controller_runtime.rb +4 -1
  300. data/lib/mongoid/railties/database.rake +9 -0
  301. data/lib/mongoid/reloadable.rb +11 -4
  302. data/lib/mongoid/scopable.rb +2 -1
  303. data/lib/mongoid/selectable.rb +8 -8
  304. data/lib/mongoid/serializable.rb +28 -18
  305. data/lib/mongoid/shardable.rb +80 -10
  306. data/lib/mongoid/stateful.rb +3 -1
  307. data/lib/mongoid/stringified_symbol.rb +53 -0
  308. data/lib/mongoid/tasks/database.rake +12 -5
  309. data/lib/mongoid/tasks/database.rb +85 -0
  310. data/lib/mongoid/threaded/lifecycle.rb +2 -0
  311. data/lib/mongoid/threaded.rb +2 -0
  312. data/lib/mongoid/timestamps/created/short.rb +2 -0
  313. data/lib/mongoid/timestamps/created.rb +3 -1
  314. data/lib/mongoid/timestamps/short.rb +2 -0
  315. data/lib/mongoid/timestamps/timeless.rb +6 -2
  316. data/lib/mongoid/timestamps/updated/short.rb +2 -0
  317. data/lib/mongoid/timestamps/updated.rb +3 -1
  318. data/lib/mongoid/timestamps.rb +3 -1
  319. data/lib/mongoid/touchable.rb +129 -0
  320. data/lib/mongoid/traversable.rb +118 -9
  321. data/lib/mongoid/validatable/associated.rb +5 -3
  322. data/lib/mongoid/validatable/format.rb +2 -0
  323. data/lib/mongoid/validatable/length.rb +2 -0
  324. data/lib/mongoid/validatable/localizable.rb +2 -0
  325. data/lib/mongoid/validatable/macros.rb +3 -1
  326. data/lib/mongoid/validatable/presence.rb +9 -7
  327. data/lib/mongoid/validatable/queryable.rb +2 -0
  328. data/lib/mongoid/validatable/uniqueness.rb +10 -8
  329. data/lib/mongoid/validatable.rb +15 -13
  330. data/lib/mongoid/version.rb +3 -1
  331. data/lib/mongoid.rb +35 -2
  332. data/lib/rails/generators/mongoid/config/config_generator.rb +10 -1
  333. data/lib/rails/generators/mongoid/config/templates/mongoid.yml +45 -27
  334. data/lib/rails/generators/mongoid/model/model_generator.rb +3 -1
  335. data/lib/rails/generators/mongoid/model/templates/model.rb.tt +1 -1
  336. data/lib/rails/generators/mongoid_generator.rb +2 -0
  337. data/lib/rails/mongoid.rb +4 -2
  338. data/lib/support/ruby_version.rb +3 -0
  339. data/spec/README.md +33 -0
  340. data/spec/config/mongoid.yml +14 -3
  341. data/spec/integration/app_spec.rb +344 -0
  342. data/spec/integration/associations/belongs_to_spec.rb +16 -0
  343. data/spec/integration/associations/embedded_spec.rb +269 -0
  344. data/spec/integration/associations/embeds_many_spec.rb +68 -0
  345. data/spec/integration/associations/embeds_one_spec.rb +24 -0
  346. data/spec/integration/associations/foreign_key_spec.rb +99 -0
  347. data/spec/integration/associations/foreign_key_spec_models.rb +65 -0
  348. data/spec/integration/associations/has_many_spec.rb +129 -0
  349. data/spec/integration/associations/has_one_spec.rb +177 -0
  350. data/spec/integration/associations/nested_attributes_assignment_spec.rb +116 -0
  351. data/spec/integration/associations/reverse_population_spec.rb +35 -0
  352. data/spec/integration/associations/reverse_population_spec_models.rb +37 -0
  353. data/spec/integration/atomic/modifiers_spec.rb +117 -0
  354. data/spec/integration/bson_regexp_raw_spec.rb +20 -0
  355. data/spec/integration/callbacks_models.rb +49 -0
  356. data/spec/integration/callbacks_spec.rb +216 -0
  357. data/spec/integration/criteria/date_field_spec.rb +41 -0
  358. data/spec/integration/criteria/default_scope_spec.rb +21 -0
  359. data/spec/integration/criteria/logical_spec.rb +94 -0
  360. data/spec/integration/criteria/time_with_zone_spec.rb +32 -0
  361. data/spec/integration/discriminator_key_spec.rb +354 -0
  362. data/spec/integration/discriminator_value_spec.rb +207 -0
  363. data/spec/integration/document_spec.rb +52 -0
  364. data/spec/integration/i18n_fallbacks_spec.rb +90 -0
  365. data/spec/integration/matcher_examples_spec.rb +759 -0
  366. data/spec/integration/matcher_operator_data/all.yml +140 -0
  367. data/spec/integration/matcher_operator_data/and.yml +93 -0
  368. data/spec/integration/matcher_operator_data/bits_all_clear.yml +159 -0
  369. data/spec/integration/matcher_operator_data/bits_all_set.yml +159 -0
  370. data/spec/integration/matcher_operator_data/bits_any_clear.yml +159 -0
  371. data/spec/integration/matcher_operator_data/bits_any_set.yml +159 -0
  372. data/spec/integration/matcher_operator_data/comment.yml +22 -0
  373. data/spec/integration/matcher_operator_data/elem_match.yml +409 -0
  374. data/spec/integration/matcher_operator_data/elem_match_expr.yml +213 -0
  375. data/spec/integration/matcher_operator_data/eq.yml +191 -0
  376. data/spec/integration/matcher_operator_data/exists.yml +213 -0
  377. data/spec/integration/matcher_operator_data/generic_op.yml +17 -0
  378. data/spec/integration/matcher_operator_data/gt.yml +132 -0
  379. data/spec/integration/matcher_operator_data/gt_types.yml +63 -0
  380. data/spec/integration/matcher_operator_data/gte.yml +132 -0
  381. data/spec/integration/matcher_operator_data/gte_types.yml +15 -0
  382. data/spec/integration/matcher_operator_data/implicit.yml +331 -0
  383. data/spec/integration/matcher_operator_data/implicit_traversal.yml +112 -0
  384. data/spec/integration/matcher_operator_data/in.yml +210 -0
  385. data/spec/integration/matcher_operator_data/invalid_op.yml +59 -0
  386. data/spec/integration/matcher_operator_data/invalid_syntax.yml +39 -0
  387. data/spec/integration/matcher_operator_data/lt.yml +132 -0
  388. data/spec/integration/matcher_operator_data/lt_types.yml +15 -0
  389. data/spec/integration/matcher_operator_data/lte.yml +132 -0
  390. data/spec/integration/matcher_operator_data/lte_types.yml +15 -0
  391. data/spec/integration/matcher_operator_data/mod.yml +55 -0
  392. data/spec/integration/matcher_operator_data/multiple.yml +29 -0
  393. data/spec/integration/matcher_operator_data/ne.yml +150 -0
  394. data/spec/integration/matcher_operator_data/ne_types.yml +15 -0
  395. data/spec/integration/matcher_operator_data/nin.yml +114 -0
  396. data/spec/integration/matcher_operator_data/nor.yml +126 -0
  397. data/spec/integration/matcher_operator_data/not.yml +196 -0
  398. data/spec/integration/matcher_operator_data/or.yml +137 -0
  399. data/spec/integration/matcher_operator_data/regex.yml +174 -0
  400. data/spec/integration/matcher_operator_data/regex_options.yml +72 -0
  401. data/spec/integration/matcher_operator_data/size.yml +174 -0
  402. data/spec/integration/matcher_operator_data/type.yml +70 -0
  403. data/spec/integration/matcher_operator_data/type_array.yml +16 -0
  404. data/spec/integration/matcher_operator_data/type_binary.yml +18 -0
  405. data/spec/integration/matcher_operator_data/type_boolean.yml +39 -0
  406. data/spec/integration/matcher_operator_data/type_code.yml +26 -0
  407. data/spec/integration/matcher_operator_data/type_code_with_scope.yml +26 -0
  408. data/spec/integration/matcher_operator_data/type_date.yml +39 -0
  409. data/spec/integration/matcher_operator_data/type_db_pointer.yml +19 -0
  410. data/spec/integration/matcher_operator_data/type_decimal.yml +40 -0
  411. data/spec/integration/matcher_operator_data/type_double.yml +15 -0
  412. data/spec/integration/matcher_operator_data/type_int32.yml +33 -0
  413. data/spec/integration/matcher_operator_data/type_int64.yml +33 -0
  414. data/spec/integration/matcher_operator_data/type_max_key.yml +17 -0
  415. data/spec/integration/matcher_operator_data/type_min_key.yml +17 -0
  416. data/spec/integration/matcher_operator_data/type_null.yml +23 -0
  417. data/spec/integration/matcher_operator_data/type_object.yml +23 -0
  418. data/spec/integration/matcher_operator_data/type_object_id.yml +25 -0
  419. data/spec/integration/matcher_operator_data/type_regex.yml +44 -0
  420. data/spec/integration/matcher_operator_data/type_string.yml +15 -0
  421. data/spec/integration/matcher_operator_data/type_symbol.yml +32 -0
  422. data/spec/integration/matcher_operator_data/type_timestamp.yml +25 -0
  423. data/spec/integration/matcher_operator_data/type_undefined.yml +17 -0
  424. data/spec/integration/matcher_operator_spec.rb +100 -0
  425. data/spec/integration/matcher_spec.rb +189 -0
  426. data/spec/integration/server_query_spec.rb +142 -0
  427. data/spec/integration/shardable_spec.rb +149 -0
  428. data/spec/integration/stringified_symbol_field_spec.rb +190 -0
  429. data/spec/lite_spec_helper.rb +77 -0
  430. data/spec/mongoid/association/accessors_spec.rb +1038 -0
  431. data/spec/mongoid/association/auto_save_spec.rb +365 -0
  432. data/spec/mongoid/association/builders_spec.rb +256 -0
  433. data/spec/mongoid/association/constrainable_spec.rb +118 -0
  434. data/spec/mongoid/association/counter_cache_spec.rb +453 -0
  435. data/spec/mongoid/association/depending_spec.rb +960 -0
  436. data/spec/mongoid/association/eager_spec.rb +282 -0
  437. data/spec/mongoid/association/embedded/cyclic_spec.rb +181 -0
  438. data/spec/mongoid/association/embedded/dirty_spec.rb +68 -0
  439. data/spec/mongoid/association/embedded/embedded_in/binding_spec.rb +174 -0
  440. data/spec/mongoid/association/embedded/embedded_in/buildable_spec.rb +37 -0
  441. data/spec/mongoid/association/embedded/embedded_in/proxy_spec.rb +560 -0
  442. data/spec/mongoid/association/embedded/embedded_in_spec.rb +904 -0
  443. data/spec/mongoid/association/embedded/embeds_many/binding_spec.rb +57 -0
  444. data/spec/mongoid/association/embedded/embeds_many/buildable_spec.rb +107 -0
  445. data/spec/mongoid/association/embedded/embeds_many/proxy_spec.rb +4403 -0
  446. data/spec/mongoid/association/embedded/embeds_many_models.rb +54 -0
  447. data/spec/mongoid/association/embedded/embeds_many_query_spec.rb +52 -0
  448. data/spec/mongoid/association/embedded/embeds_many_spec.rb +865 -0
  449. data/spec/mongoid/association/embedded/embeds_one/binding_spec.rb +80 -0
  450. data/spec/mongoid/association/embedded/embeds_one/buildable_spec.rb +82 -0
  451. data/spec/mongoid/association/embedded/embeds_one/proxy_spec.rb +1026 -0
  452. data/spec/mongoid/association/embedded/embeds_one_dnl_models.rb +9 -0
  453. data/spec/mongoid/association/embedded/embeds_one_models.rb +55 -0
  454. data/spec/mongoid/association/embedded/embeds_one_query_spec.rb +29 -0
  455. data/spec/mongoid/association/embedded/embeds_one_spec.rb +957 -0
  456. data/spec/mongoid/association/macros_spec.rb +1117 -0
  457. data/spec/mongoid/association/nested/many_spec.rb +233 -0
  458. data/spec/mongoid/association/nested/one_spec.rb +254 -0
  459. data/spec/mongoid/association/options_spec.rb +1324 -0
  460. data/spec/mongoid/association/polymorphic_spec.rb +163 -0
  461. data/spec/mongoid/association/referenced/belongs_to/binding_spec.rb +244 -0
  462. data/spec/mongoid/association/referenced/belongs_to/buildable_spec.rb +200 -0
  463. data/spec/mongoid/association/referenced/belongs_to/eager_spec.rb +377 -0
  464. data/spec/mongoid/association/referenced/belongs_to/proxy_spec.rb +1369 -0
  465. data/spec/mongoid/association/referenced/belongs_to_query_spec.rb +38 -0
  466. data/spec/mongoid/association/referenced/belongs_to_spec.rb +2026 -0
  467. data/spec/mongoid/association/referenced/has_and_belongs_to_many/binding_spec.rb +181 -0
  468. data/spec/mongoid/association/referenced/has_and_belongs_to_many/buildable_spec.rb +124 -0
  469. data/spec/mongoid/association/referenced/has_and_belongs_to_many/eager_spec.rb +168 -0
  470. data/spec/mongoid/association/referenced/has_and_belongs_to_many/proxy_persistence_spec.rb +77 -0
  471. data/spec/mongoid/association/referenced/has_and_belongs_to_many/proxy_spec.rb +3748 -0
  472. data/spec/mongoid/association/referenced/has_and_belongs_to_many_models.rb +50 -0
  473. data/spec/mongoid/association/referenced/has_and_belongs_to_many_query_spec.rb +40 -0
  474. data/spec/mongoid/association/referenced/has_and_belongs_to_many_spec.rb +1051 -0
  475. data/spec/mongoid/association/referenced/has_many/binding_spec.rb +156 -0
  476. data/spec/mongoid/association/referenced/has_many/buildable_spec.rb +122 -0
  477. data/spec/mongoid/association/referenced/has_many/eager_spec.rb +274 -0
  478. data/spec/mongoid/association/referenced/has_many/enumerable_spec.rb +2054 -0
  479. data/spec/mongoid/association/referenced/has_many/proxy_query_spec.rb +24 -0
  480. data/spec/mongoid/association/referenced/has_many/proxy_spec.rb +4029 -0
  481. data/spec/mongoid/association/referenced/has_many_models.rb +61 -0
  482. data/spec/mongoid/association/referenced/has_many_query_spec.rb +38 -0
  483. data/spec/mongoid/association/referenced/has_many_spec.rb +1228 -0
  484. data/spec/mongoid/association/referenced/has_one/binding_spec.rb +134 -0
  485. data/spec/mongoid/association/referenced/has_one/buildable_spec.rb +116 -0
  486. data/spec/mongoid/association/referenced/has_one/eager_spec.rb +178 -0
  487. data/spec/mongoid/association/referenced/has_one/proxy_spec.rb +1143 -0
  488. data/spec/mongoid/association/referenced/has_one_models.rb +80 -0
  489. data/spec/mongoid/association/referenced/has_one_query_spec.rb +38 -0
  490. data/spec/mongoid/association/referenced/has_one_spec.rb +1363 -0
  491. data/spec/mongoid/association/reflections_spec.rb +93 -0
  492. data/spec/mongoid/association/syncable_spec.rb +500 -0
  493. data/spec/mongoid/association_spec.rb +192 -0
  494. data/spec/mongoid/atomic/modifiers_spec.rb +52 -2
  495. data/spec/mongoid/atomic/paths/embedded/many_spec.rb +3 -0
  496. data/spec/mongoid/atomic/paths/embedded/one_spec.rb +3 -0
  497. data/spec/mongoid/atomic/paths/root_spec.rb +3 -0
  498. data/spec/mongoid/atomic/paths_spec.rb +108 -12
  499. data/spec/mongoid/atomic_spec.rb +30 -4
  500. data/spec/mongoid/attributes/dynamic_spec.rb +153 -0
  501. data/spec/mongoid/attributes/nested_spec.rb +33 -12
  502. data/spec/mongoid/attributes/projector_data/embedded.yml +105 -0
  503. data/spec/mongoid/attributes/projector_data/fields.yml +93 -0
  504. data/spec/mongoid/attributes/projector_spec.rb +41 -0
  505. data/spec/mongoid/attributes/readonly_spec.rb +83 -125
  506. data/spec/mongoid/attributes_spec.rb +393 -9
  507. data/spec/mongoid/cacheable_spec.rb +3 -0
  508. data/spec/mongoid/changeable_spec.rb +26 -0
  509. data/spec/mongoid/clients/factory_spec.rb +142 -33
  510. data/spec/mongoid/clients/options_spec.rb +83 -56
  511. data/spec/mongoid/clients/sessions_spec.rb +19 -8
  512. data/spec/mongoid/clients/transactions_spec.rb +393 -0
  513. data/spec/mongoid/clients_spec.rb +73 -10
  514. data/spec/mongoid/composable_spec.rb +3 -0
  515. data/spec/mongoid/config/environment_spec.rb +3 -0
  516. data/spec/mongoid/config/options_spec.rb +23 -3
  517. data/spec/mongoid/config_spec.rb +126 -1
  518. data/spec/mongoid/contextual/aggregable/memory_spec.rb +3 -0
  519. data/spec/mongoid/contextual/aggregable/mongo_spec.rb +3 -0
  520. data/spec/mongoid/contextual/atomic_spec.rb +137 -14
  521. data/spec/mongoid/contextual/geo_near_spec.rb +15 -2
  522. data/spec/mongoid/contextual/map_reduce_spec.rb +23 -5
  523. data/spec/mongoid/contextual/memory_spec.rb +22 -0
  524. data/spec/mongoid/contextual/mongo_spec.rb +185 -75
  525. data/spec/mongoid/contextual/none_spec.rb +3 -0
  526. data/spec/mongoid/copyable_spec.rb +289 -23
  527. data/spec/mongoid/copyable_spec_models.rb +48 -0
  528. data/spec/mongoid/criteria/findable_spec.rb +58 -0
  529. data/spec/mongoid/criteria/inspectable_spec.rb +3 -0
  530. data/spec/mongoid/criteria/marshalable_spec.rb +3 -0
  531. data/spec/mongoid/criteria/modifiable_spec.rb +181 -5
  532. data/spec/mongoid/criteria/options_spec.rb +3 -0
  533. data/spec/mongoid/criteria/queryable/aggregable_spec.rb +3 -0
  534. data/spec/mongoid/criteria/queryable/expandable_spec.rb +62 -0
  535. data/spec/mongoid/criteria/queryable/extensions/array_spec.rb +3 -0
  536. data/spec/mongoid/criteria/queryable/extensions/big_decimal_spec.rb +3 -0
  537. data/spec/mongoid/criteria/queryable/extensions/bignum_spec.rb +3 -0
  538. data/spec/mongoid/criteria/queryable/extensions/boolean_spec.rb +4 -1
  539. data/spec/mongoid/criteria/queryable/extensions/date_spec.rb +3 -0
  540. data/spec/mongoid/criteria/queryable/extensions/date_time_spec.rb +36 -17
  541. data/spec/mongoid/criteria/queryable/extensions/fixnum_spec.rb +3 -0
  542. data/spec/mongoid/criteria/queryable/extensions/float_spec.rb +3 -0
  543. data/spec/mongoid/criteria/queryable/extensions/hash_spec.rb +3 -0
  544. data/spec/mongoid/criteria/queryable/extensions/integer_spec.rb +3 -0
  545. data/spec/mongoid/criteria/queryable/extensions/nil_class_spec.rb +3 -0
  546. data/spec/mongoid/criteria/queryable/extensions/numeric_spec.rb +54 -0
  547. data/spec/mongoid/criteria/queryable/extensions/object_spec.rb +3 -0
  548. data/spec/mongoid/criteria/queryable/extensions/range_spec.rb +3 -0
  549. data/spec/mongoid/criteria/queryable/extensions/regexp_raw_spec.rb +4 -1
  550. data/spec/mongoid/criteria/queryable/extensions/regexp_spec.rb +10 -7
  551. data/spec/mongoid/criteria/queryable/extensions/set_spec.rb +3 -0
  552. data/spec/mongoid/criteria/queryable/extensions/string_spec.rb +47 -1
  553. data/spec/mongoid/criteria/queryable/extensions/symbol_spec.rb +3 -0
  554. data/spec/mongoid/criteria/queryable/extensions/time_spec.rb +43 -23
  555. data/spec/mongoid/criteria/queryable/extensions/time_with_zone_spec.rb +31 -1
  556. data/spec/mongoid/criteria/queryable/key_spec.rb +51 -6
  557. data/spec/mongoid/criteria/queryable/mergeable_spec.rb +146 -12
  558. data/spec/mongoid/criteria/queryable/optional_spec.rb +3 -0
  559. data/spec/mongoid/criteria/queryable/options_spec.rb +3 -0
  560. data/spec/mongoid/criteria/queryable/pipeline_spec.rb +15 -0
  561. data/spec/mongoid/criteria/queryable/queryable_spec.rb +3 -0
  562. data/spec/mongoid/criteria/queryable/selectable_logical_spec.rb +2070 -0
  563. data/spec/mongoid/criteria/queryable/selectable_shared_examples.rb +39 -0
  564. data/spec/mongoid/criteria/queryable/selectable_spec.rb +993 -2937
  565. data/spec/mongoid/criteria/queryable/selectable_where_spec.rb +590 -0
  566. data/spec/mongoid/criteria/queryable/selector_spec.rb +40 -0
  567. data/spec/mongoid/criteria/queryable/smash_spec.rb +3 -0
  568. data/spec/mongoid/criteria/queryable/storable_spec.rb +190 -0
  569. data/spec/mongoid/criteria/scopable_spec.rb +3 -0
  570. data/spec/mongoid/criteria_projection_spec.rb +411 -0
  571. data/spec/mongoid/criteria_spec.rb +280 -297
  572. data/spec/mongoid/document_fields_spec.rb +114 -0
  573. data/spec/mongoid/document_persistence_context_spec.rb +33 -0
  574. data/spec/mongoid/document_query_spec.rb +90 -0
  575. data/spec/mongoid/document_spec.rb +121 -19
  576. data/spec/mongoid/equality_spec.rb +3 -1
  577. data/spec/mongoid/errors/ambiguous_relationship_spec.rb +6 -3
  578. data/spec/mongoid/errors/callback_spec.rb +3 -0
  579. data/spec/mongoid/errors/delete_restriction_spec.rb +5 -2
  580. data/spec/mongoid/errors/document_not_destroyed_spec.rb +3 -0
  581. data/spec/mongoid/errors/document_not_found_spec.rb +3 -0
  582. data/spec/mongoid/errors/eager_load_spec.rb +3 -0
  583. data/spec/mongoid/errors/invalid_collection_spec.rb +3 -0
  584. data/spec/mongoid/errors/invalid_config_option_spec.rb +3 -0
  585. data/spec/mongoid/errors/invalid_field_option_spec.rb +3 -0
  586. data/spec/mongoid/errors/invalid_field_spec.rb +3 -0
  587. data/spec/mongoid/errors/invalid_find_spec.rb +3 -0
  588. data/spec/mongoid/errors/invalid_includes_spec.rb +3 -0
  589. data/spec/mongoid/errors/invalid_index_spec.rb +3 -0
  590. data/spec/mongoid/errors/invalid_options_spec.rb +5 -2
  591. data/spec/mongoid/errors/invalid_path_spec.rb +3 -0
  592. data/spec/mongoid/errors/invalid_relation_spec.rb +5 -2
  593. data/spec/mongoid/errors/invalid_scope_spec.rb +3 -0
  594. data/spec/mongoid/errors/invalid_set_polymorphic_relation_spec.rb +3 -0
  595. data/spec/mongoid/errors/invalid_storage_options_spec.rb +3 -0
  596. data/spec/mongoid/errors/invalid_time_spec.rb +3 -0
  597. data/spec/mongoid/errors/inverse_not_found_spec.rb +4 -1
  598. data/spec/mongoid/errors/mixed_client_configuration_spec.rb +3 -0
  599. data/spec/mongoid/errors/mixed_relations_spec.rb +3 -0
  600. data/spec/mongoid/errors/mongoid_error_spec.rb +23 -8
  601. data/spec/mongoid/errors/nested_attributes_metadata_not_found_spec.rb +6 -3
  602. data/spec/mongoid/errors/no_client_config_spec.rb +5 -2
  603. data/spec/mongoid/errors/no_client_database_spec.rb +6 -3
  604. data/spec/mongoid/errors/no_client_hosts_spec.rb +6 -3
  605. data/spec/mongoid/errors/no_clients_config_spec.rb +3 -0
  606. data/spec/mongoid/errors/no_environment_spec.rb +3 -0
  607. data/spec/mongoid/errors/no_map_reduce_output_spec.rb +3 -0
  608. data/spec/mongoid/errors/no_metadata_spec.rb +5 -2
  609. data/spec/mongoid/errors/no_parent_spec.rb +4 -1
  610. data/spec/mongoid/errors/readonly_attribute_spec.rb +3 -0
  611. data/spec/mongoid/errors/readonly_document_spec.rb +3 -0
  612. data/spec/mongoid/errors/scope_overwrite_spec.rb +3 -0
  613. data/spec/mongoid/errors/too_many_nested_attribute_records_spec.rb +3 -0
  614. data/spec/mongoid/errors/unknown_attribute_spec.rb +3 -0
  615. data/spec/mongoid/errors/unsaved_document_spec.rb +4 -1
  616. data/spec/mongoid/errors/unsupported_javascript_spec.rb +3 -0
  617. data/spec/mongoid/errors/validations_spec.rb +3 -0
  618. data/spec/mongoid/extensions/array_spec.rb +37 -58
  619. data/spec/mongoid/extensions/big_decimal_spec.rb +3 -0
  620. data/spec/mongoid/extensions/binary_spec.rb +3 -0
  621. data/spec/mongoid/extensions/boolean_spec.rb +3 -0
  622. data/spec/mongoid/extensions/date_class_mongoize_spec.rb +336 -0
  623. data/spec/mongoid/extensions/date_spec.rb +9 -160
  624. data/spec/mongoid/extensions/date_time_spec.rb +18 -60
  625. data/spec/mongoid/extensions/decimal128_spec.rb +3 -0
  626. data/spec/mongoid/extensions/false_class_spec.rb +4 -1
  627. data/spec/mongoid/extensions/float_spec.rb +18 -3
  628. data/spec/mongoid/extensions/hash_spec.rb +124 -1
  629. data/spec/mongoid/extensions/integer_spec.rb +15 -2
  630. data/spec/mongoid/extensions/module_spec.rb +3 -0
  631. data/spec/mongoid/extensions/nil_class_spec.rb +3 -0
  632. data/spec/mongoid/extensions/object_id_spec.rb +3 -0
  633. data/spec/mongoid/extensions/object_spec.rb +21 -35
  634. data/spec/mongoid/extensions/range_spec.rb +10 -0
  635. data/spec/mongoid/extensions/regexp_spec.rb +3 -0
  636. data/spec/mongoid/extensions/set_spec.rb +3 -0
  637. data/spec/mongoid/extensions/string_spec.rb +94 -32
  638. data/spec/mongoid/extensions/stringified_symbol_spec.rb +85 -0
  639. data/spec/mongoid/extensions/symbol_spec.rb +3 -0
  640. data/spec/mongoid/extensions/time_spec.rb +30 -0
  641. data/spec/mongoid/extensions/time_with_zone_spec.rb +34 -0
  642. data/spec/mongoid/extensions/true_class_spec.rb +4 -1
  643. data/spec/mongoid/extensions_spec.rb +3 -0
  644. data/spec/mongoid/factory_spec.rb +301 -23
  645. data/spec/mongoid/fields/foreign_key_spec.rb +27 -32
  646. data/spec/mongoid/fields/localized_spec.rb +7 -4
  647. data/spec/mongoid/fields/standard_spec.rb +3 -0
  648. data/spec/mongoid/fields_spec.rb +94 -7
  649. data/spec/mongoid/findable_spec.rb +36 -1
  650. data/spec/mongoid/indexable/specification_spec.rb +3 -0
  651. data/spec/mongoid/indexable_spec.rb +55 -14
  652. data/spec/mongoid/inspectable_spec.rb +40 -2
  653. data/spec/mongoid/interceptable_spec.rb +89 -3
  654. data/spec/mongoid/interceptable_spec_models.rb +76 -0
  655. data/spec/mongoid/loggable_spec.rb +3 -0
  656. data/spec/mongoid/matcher/extract_attribute_data/numeric_keys.yml +104 -0
  657. data/spec/mongoid/matcher/extract_attribute_data/traversal.yml +239 -0
  658. data/spec/mongoid/matcher/extract_attribute_spec.rb +37 -0
  659. data/spec/mongoid/persistable/creatable_spec.rb +111 -25
  660. data/spec/mongoid/persistable/deletable_spec.rb +264 -1
  661. data/spec/mongoid/persistable/destroyable_spec.rb +194 -3
  662. data/spec/mongoid/persistable/incrementable_spec.rb +17 -0
  663. data/spec/mongoid/persistable/logical_spec.rb +17 -0
  664. data/spec/mongoid/persistable/poppable_spec.rb +17 -0
  665. data/spec/mongoid/persistable/pullable_spec.rb +31 -0
  666. data/spec/mongoid/persistable/pushable_spec.rb +86 -1
  667. data/spec/mongoid/persistable/renamable_spec.rb +17 -0
  668. data/spec/mongoid/persistable/savable_spec.rb +176 -17
  669. data/spec/mongoid/persistable/settable_spec.rb +142 -10
  670. data/spec/mongoid/persistable/unsettable_spec.rb +17 -0
  671. data/spec/mongoid/persistable/updatable_spec.rb +3 -0
  672. data/spec/mongoid/persistable/upsertable_spec.rb +4 -1
  673. data/spec/mongoid/persistable_spec.rb +106 -14
  674. data/spec/mongoid/persistence_context_spec.rb +4 -1
  675. data/spec/mongoid/positional_spec.rb +3 -0
  676. data/spec/mongoid/query_cache_middleware_spec.rb +69 -0
  677. data/spec/mongoid/query_cache_spec.rb +532 -65
  678. data/spec/mongoid/relations/proxy_spec.rb +127 -124
  679. data/spec/mongoid/reloadable_spec.rb +93 -1
  680. data/spec/mongoid/scopable_spec.rb +5 -1
  681. data/spec/mongoid/selectable_spec.rb +3 -0
  682. data/spec/mongoid/serializable_spec.rb +152 -20
  683. data/spec/mongoid/shardable_models.rb +61 -0
  684. data/spec/mongoid/shardable_spec.rb +146 -26
  685. data/spec/mongoid/stateful_spec.rb +3 -0
  686. data/spec/mongoid/tasks/database_rake_spec.rb +16 -13
  687. data/spec/mongoid/tasks/database_spec.rb +4 -1
  688. data/spec/mongoid/threaded_spec.rb +3 -0
  689. data/spec/mongoid/timestamps/created/short_spec.rb +3 -0
  690. data/spec/mongoid/timestamps/created_spec.rb +3 -0
  691. data/spec/mongoid/timestamps/timeless_spec.rb +3 -0
  692. data/spec/mongoid/timestamps/updated/short_spec.rb +3 -0
  693. data/spec/mongoid/timestamps/updated_spec.rb +3 -0
  694. data/spec/mongoid/timestamps_spec.rb +3 -0
  695. data/spec/mongoid/touchable_spec.rb +575 -0
  696. data/spec/mongoid/touchable_spec_models.rb +52 -0
  697. data/spec/mongoid/traversable_spec.rb +1103 -0
  698. data/spec/mongoid/validatable/associated_spec.rb +4 -1
  699. data/spec/mongoid/validatable/format_spec.rb +3 -0
  700. data/spec/mongoid/validatable/length_spec.rb +3 -0
  701. data/spec/mongoid/validatable/numericality_spec.rb +3 -0
  702. data/spec/mongoid/validatable/presence_spec.rb +10 -6
  703. data/spec/mongoid/validatable/uniqueness_spec.rb +36 -6
  704. data/spec/mongoid/validatable_spec.rb +4 -1
  705. data/spec/mongoid_spec.rb +3 -0
  706. data/spec/rails/controller_extension/controller_runtime_spec.rb +4 -1
  707. data/spec/rails/mongoid_spec.rb +5 -2
  708. data/spec/shared/LICENSE +20 -0
  709. data/spec/shared/bin/get-mongodb-download-url +17 -0
  710. data/spec/shared/bin/s3-copy +45 -0
  711. data/spec/shared/bin/s3-upload +69 -0
  712. data/spec/shared/lib/mrss/child_process_helper.rb +80 -0
  713. data/spec/shared/lib/mrss/cluster_config.rb +226 -0
  714. data/spec/shared/lib/mrss/constraints.rb +368 -0
  715. data/spec/shared/lib/mrss/docker_runner.rb +271 -0
  716. data/spec/shared/lib/mrss/lite_constraints.rb +191 -0
  717. data/spec/shared/lib/mrss/server_version_registry.rb +115 -0
  718. data/spec/shared/lib/mrss/spec_organizer.rb +179 -0
  719. data/spec/shared/lib/mrss/utils.rb +15 -0
  720. data/spec/shared/share/Dockerfile.erb +322 -0
  721. data/spec/shared/share/haproxy-1.conf +16 -0
  722. data/spec/shared/share/haproxy-2.conf +17 -0
  723. data/spec/shared/shlib/distro.sh +73 -0
  724. data/spec/shared/shlib/server.sh +317 -0
  725. data/spec/shared/shlib/set_env.sh +131 -0
  726. data/spec/spec_helper.rb +65 -58
  727. data/spec/support/authorization.rb +3 -0
  728. data/spec/support/client_registry.rb +9 -0
  729. data/spec/support/constraints.rb +54 -0
  730. data/spec/support/expectations.rb +22 -3
  731. data/spec/support/helpers.rb +11 -0
  732. data/spec/support/macros.rb +21 -0
  733. data/spec/support/models/account.rb +39 -0
  734. data/spec/support/models/acolyte.rb +20 -0
  735. data/spec/support/models/actor.rb +21 -0
  736. data/spec/support/models/actress.rb +5 -0
  737. data/spec/support/models/address.rb +86 -0
  738. data/spec/support/models/address_component.rb +8 -0
  739. data/spec/support/models/address_number.rb +9 -0
  740. data/spec/support/models/agency.rb +8 -0
  741. data/spec/support/models/agent.rb +19 -0
  742. data/spec/support/models/album.rb +21 -0
  743. data/spec/support/models/alert.rb +10 -0
  744. data/spec/support/models/animal.rb +29 -0
  745. data/spec/support/models/answer.rb +9 -0
  746. data/spec/support/models/appointment.rb +10 -0
  747. data/spec/support/models/armrest.rb +10 -0
  748. data/spec/support/models/array_field.rb +8 -0
  749. data/spec/support/models/article.rb +15 -0
  750. data/spec/support/models/artist.rb +90 -0
  751. data/spec/support/models/artwork.rb +7 -0
  752. data/spec/support/models/audio.rb +8 -0
  753. data/spec/support/models/augmentation.rb +14 -0
  754. data/spec/support/models/author.rb +9 -0
  755. data/spec/support/models/baby.rb +7 -0
  756. data/spec/support/models/band.rb +34 -0
  757. data/spec/support/models/bar.rb +13 -0
  758. data/spec/support/models/basic.rb +9 -0
  759. data/spec/support/models/bed.rb +4 -0
  760. data/spec/support/models/big_palette.rb +5 -0
  761. data/spec/support/models/birthday.rb +16 -0
  762. data/spec/support/models/bolt.rb +8 -0
  763. data/spec/support/models/bomb.rb +7 -0
  764. data/spec/support/models/book.rb +19 -0
  765. data/spec/support/models/breed.rb +7 -0
  766. data/spec/support/models/browser.rb +9 -0
  767. data/spec/support/models/building.rb +9 -0
  768. data/spec/support/models/building_address.rb +10 -0
  769. data/spec/support/models/bus.rb +10 -0
  770. data/spec/support/models/business.rb +8 -0
  771. data/spec/support/models/callback_test.rb +12 -0
  772. data/spec/support/models/canvas.rb +28 -0
  773. data/spec/support/models/car.rb +4 -0
  774. data/spec/support/models/cat.rb +11 -0
  775. data/spec/support/models/category.rb +11 -0
  776. data/spec/support/models/child.rb +7 -0
  777. data/spec/support/models/child_doc.rb +25 -0
  778. data/spec/support/models/church.rb +9 -0
  779. data/spec/support/models/circle.rb +6 -0
  780. data/spec/support/models/circuit.rb +7 -0
  781. data/spec/support/models/circus.rb +10 -0
  782. data/spec/support/models/code.rb +14 -0
  783. data/spec/support/models/coding/pull_request.rb +12 -0
  784. data/spec/support/models/coding.rb +4 -0
  785. data/spec/support/models/comment.rb +19 -0
  786. data/spec/support/models/company.rb +8 -0
  787. data/spec/support/models/consumption_period.rb +10 -0
  788. data/spec/support/models/contextable_item.rb +8 -0
  789. data/spec/support/models/contractor.rb +8 -0
  790. data/spec/support/models/cookie.rb +9 -0
  791. data/spec/support/models/country_code.rb +11 -0
  792. data/spec/support/models/courier_job.rb +7 -0
  793. data/spec/support/models/crate.rb +13 -0
  794. data/spec/support/models/customer.rb +11 -0
  795. data/spec/support/models/customer_address.rb +12 -0
  796. data/spec/support/models/deed.rb +8 -0
  797. data/spec/support/models/definition.rb +12 -0
  798. data/spec/support/models/delegating_patient.rb +16 -0
  799. data/spec/support/models/description.rb +14 -0
  800. data/spec/support/models/dictionary.rb +19 -0
  801. data/spec/support/models/division.rb +13 -0
  802. data/spec/support/models/doctor.rb +15 -0
  803. data/spec/support/models/dog.rb +10 -0
  804. data/spec/support/models/dokument.rb +9 -0
  805. data/spec/support/models/draft.rb +12 -0
  806. data/spec/support/models/dragon.rb +7 -0
  807. data/spec/support/models/driver.rb +10 -0
  808. data/spec/support/models/drug.rb +9 -0
  809. data/spec/support/models/dungeon.rb +7 -0
  810. data/spec/support/models/edit.rb +8 -0
  811. data/spec/support/models/email.rb +9 -0
  812. data/spec/support/models/employer.rb +8 -0
  813. data/spec/support/models/entry.rb +9 -0
  814. data/spec/support/models/eraser.rb +4 -0
  815. data/spec/support/models/even.rb +10 -0
  816. data/spec/support/models/event.rb +25 -0
  817. data/spec/support/models/exhibition.rb +7 -0
  818. data/spec/support/models/exhibitor.rb +9 -0
  819. data/spec/support/models/explosion.rb +7 -0
  820. data/spec/support/models/eye.rb +12 -0
  821. data/spec/support/models/eye_bowl.rb +12 -0
  822. data/spec/support/models/face.rb +11 -0
  823. data/spec/support/models/favorite.rb +9 -0
  824. data/spec/support/models/filesystem.rb +8 -0
  825. data/spec/support/models/fire_hydrant.rb +9 -0
  826. data/spec/support/models/firefox.rb +7 -0
  827. data/spec/support/models/fish.rb +10 -0
  828. data/spec/support/models/folder.rb +10 -0
  829. data/spec/support/models/folder_item.rb +12 -0
  830. data/spec/support/models/fruits.rb +37 -0
  831. data/spec/support/models/game.rb +22 -0
  832. data/spec/support/models/ghost.rb +10 -0
  833. data/spec/support/models/guitar.rb +5 -0
  834. data/spec/support/models/hole.rb +13 -0
  835. data/spec/support/models/home.rb +7 -0
  836. data/spec/support/models/house.rb +9 -0
  837. data/spec/support/models/html_writer.rb +6 -0
  838. data/spec/support/models/id_key.rb +9 -0
  839. data/spec/support/models/idnodef.rb +8 -0
  840. data/spec/support/models/image.rb +25 -0
  841. data/spec/support/models/implant.rb +19 -0
  842. data/spec/support/models/instrument.rb +9 -0
  843. data/spec/support/models/item.rb +11 -0
  844. data/spec/support/models/jar.rb +10 -0
  845. data/spec/support/models/kaleidoscope.rb +9 -0
  846. data/spec/support/models/kangaroo.rb +7 -0
  847. data/spec/support/models/label.rb +50 -0
  848. data/spec/support/models/language.rb +8 -0
  849. data/spec/support/models/lat_lng.rb +18 -0
  850. data/spec/support/models/league.rb +14 -0
  851. data/spec/support/models/learner.rb +5 -0
  852. data/spec/support/models/line_item.rb +9 -0
  853. data/spec/support/models/location.rb +11 -0
  854. data/spec/support/models/login.rb +11 -0
  855. data/spec/support/models/manufacturer.rb +10 -0
  856. data/spec/support/models/meat.rb +7 -0
  857. data/spec/support/models/membership.rb +7 -0
  858. data/spec/support/models/message.rb +14 -0
  859. data/spec/support/models/minim.rb +7 -0
  860. data/spec/support/models/mixed_drink.rb +7 -0
  861. data/spec/support/models/mop.rb +25 -0
  862. data/spec/support/models/movie.rb +16 -0
  863. data/spec/support/models/my_hash.rb +5 -0
  864. data/spec/support/models/name.rb +27 -0
  865. data/spec/support/models/name_only.rb +9 -0
  866. data/spec/support/models/node.rb +8 -0
  867. data/spec/support/models/note.rb +20 -0
  868. data/spec/support/models/nut.rb +8 -0
  869. data/spec/support/models/odd.rb +10 -0
  870. data/spec/support/models/order.rb +11 -0
  871. data/spec/support/models/ordered_post.rb +14 -0
  872. data/spec/support/models/ordered_preference.rb +9 -0
  873. data/spec/support/models/oscar.rb +17 -0
  874. data/spec/support/models/other_owner_object.rb +5 -0
  875. data/spec/support/models/override.rb +19 -0
  876. data/spec/support/models/ownable.rb +9 -0
  877. data/spec/support/models/owner.rb +11 -0
  878. data/spec/support/models/pack.rb +6 -0
  879. data/spec/support/models/page.rb +19 -0
  880. data/spec/support/models/page_question.rb +7 -0
  881. data/spec/support/models/palette.rb +10 -0
  882. data/spec/support/models/parent.rb +8 -0
  883. data/spec/support/models/parent_doc.rb +9 -0
  884. data/spec/support/models/passport.rb +9 -0
  885. data/spec/support/models/patient.rb +12 -0
  886. data/spec/support/models/pdf_writer.rb +6 -0
  887. data/spec/support/models/pencil.rb +4 -0
  888. data/spec/support/models/person.rb +230 -0
  889. data/spec/support/models/pet.rb +26 -0
  890. data/spec/support/models/pet_owner.rb +9 -0
  891. data/spec/support/models/phone.rb +13 -0
  892. data/spec/support/models/piano.rb +5 -0
  893. data/spec/support/models/pizza.rb +10 -0
  894. data/spec/support/models/player.rb +38 -0
  895. data/spec/support/models/post.rb +53 -0
  896. data/spec/support/models/post_genre.rb +9 -0
  897. data/spec/support/models/powerup.rb +14 -0
  898. data/spec/support/models/preference.rb +12 -0
  899. data/spec/support/models/princess.rb +13 -0
  900. data/spec/support/models/product.rb +20 -0
  901. data/spec/support/models/profile.rb +18 -0
  902. data/spec/support/models/pronunciation.rb +8 -0
  903. data/spec/support/models/pub.rb +9 -0
  904. data/spec/support/models/publication/encyclopedia.rb +12 -0
  905. data/spec/support/models/publication/review.rb +14 -0
  906. data/spec/support/models/publication.rb +5 -0
  907. data/spec/support/models/purchase.rb +7 -0
  908. data/spec/support/models/question.rb +11 -0
  909. data/spec/support/models/quiz.rb +10 -0
  910. data/spec/support/models/rating.rb +11 -0
  911. data/spec/support/models/record.rb +55 -0
  912. data/spec/support/models/registry.rb +7 -0
  913. data/spec/support/models/role.rb +10 -0
  914. data/spec/support/models/root_category.rb +7 -0
  915. data/spec/support/models/sandwich.rb +12 -0
  916. data/spec/support/models/scheduler.rb +10 -0
  917. data/spec/support/models/scribe.rb +8 -0
  918. data/spec/support/models/sealer.rb +8 -0
  919. data/spec/support/models/seat.rb +25 -0
  920. data/spec/support/models/seo.rb +10 -0
  921. data/spec/support/models/series.rb +8 -0
  922. data/spec/support/models/server.rb +16 -0
  923. data/spec/support/models/service.rb +25 -0
  924. data/spec/support/models/shape.rb +15 -0
  925. data/spec/support/models/shelf.rb +8 -0
  926. data/spec/support/models/shipment_address.rb +6 -0
  927. data/spec/support/models/shipping_container.rb +8 -0
  928. data/spec/support/models/shipping_pack.rb +6 -0
  929. data/spec/support/models/shirt.rb +12 -0
  930. data/spec/support/models/shop.rb +9 -0
  931. data/spec/support/models/short_agent.rb +7 -0
  932. data/spec/support/models/short_quiz.rb +8 -0
  933. data/spec/support/models/simple.rb +8 -0
  934. data/spec/support/models/slave.rb +9 -0
  935. data/spec/support/models/song.rb +11 -0
  936. data/spec/support/models/sound.rb +8 -0
  937. data/spec/support/models/spacer.rb +8 -0
  938. data/spec/support/models/square.rb +7 -0
  939. data/spec/support/models/staff.rb +10 -0
  940. data/spec/support/models/store_as_dup_test1.rb +8 -0
  941. data/spec/support/models/store_as_dup_test2.rb +8 -0
  942. data/spec/support/models/store_as_dup_test3.rb +8 -0
  943. data/spec/support/models/store_as_dup_test4.rb +8 -0
  944. data/spec/support/models/strategy.rb +6 -0
  945. data/spec/support/models/sub_item.rb +6 -0
  946. data/spec/support/models/subscription.rb +8 -0
  947. data/spec/support/models/survey.rb +8 -0
  948. data/spec/support/models/symptom.rb +9 -0
  949. data/spec/support/models/system_role.rb +7 -0
  950. data/spec/support/models/tag.rb +11 -0
  951. data/spec/support/models/target.rb +8 -0
  952. data/spec/support/models/template.rb +8 -0
  953. data/spec/support/models/thing.rb +12 -0
  954. data/spec/support/models/threadlocker.rb +8 -0
  955. data/spec/support/models/title.rb +6 -0
  956. data/spec/support/models/tool.rb +11 -0
  957. data/spec/support/models/topping.rb +8 -0
  958. data/spec/support/models/toy.rb +10 -0
  959. data/spec/support/models/track.rb +41 -0
  960. data/spec/support/models/translation.rb +8 -0
  961. data/spec/support/models/tree.rb +12 -0
  962. data/spec/support/models/truck.rb +8 -0
  963. data/spec/support/models/updatable.rb +8 -0
  964. data/spec/support/models/user.rb +24 -0
  965. data/spec/support/models/user_account.rb +13 -0
  966. data/spec/support/models/validation_callback.rb +13 -0
  967. data/spec/support/models/vehicle.rb +19 -0
  968. data/spec/support/models/version.rb +8 -0
  969. data/spec/support/models/vertex.rb +9 -0
  970. data/spec/support/models/vet_visit.rb +8 -0
  971. data/spec/support/models/video.rb +16 -0
  972. data/spec/support/models/video_game.rb +4 -0
  973. data/spec/support/models/washer.rb +8 -0
  974. data/spec/support/models/weapon.rb +14 -0
  975. data/spec/support/models/wiki_page.rb +18 -0
  976. data/spec/support/models/word.rb +18 -0
  977. data/spec/support/models/word_origin.rb +14 -0
  978. data/spec/support/models/writer.rb +14 -0
  979. data/spec/support/session_registry.rb +50 -0
  980. data/spec/support/shared/time.rb +54 -0
  981. data/spec/support/spec_config.rb +58 -0
  982. data.tar.gz.sig +0 -0
  983. metadata +1226 -814
  984. metadata.gz.sig +0 -0
  985. data/lib/mongoid/criteria/queryable/forwardable.rb +0 -65
  986. data/lib/mongoid/matchable/all.rb +0 -27
  987. data/lib/mongoid/matchable/and.rb +0 -30
  988. data/lib/mongoid/matchable/default.rb +0 -72
  989. data/lib/mongoid/matchable/elem_match.rb +0 -28
  990. data/lib/mongoid/matchable/exists.rb +0 -23
  991. data/lib/mongoid/matchable/gt.rb +0 -23
  992. data/lib/mongoid/matchable/gte.rb +0 -23
  993. data/lib/mongoid/matchable/in.rb +0 -24
  994. data/lib/mongoid/matchable/lt.rb +0 -23
  995. data/lib/mongoid/matchable/lte.rb +0 -23
  996. data/lib/mongoid/matchable/ne.rb +0 -21
  997. data/lib/mongoid/matchable/nin.rb +0 -22
  998. data/lib/mongoid/matchable/nor.rb +0 -37
  999. data/lib/mongoid/matchable/or.rb +0 -33
  1000. data/lib/mongoid/matchable/regexp.rb +0 -27
  1001. data/lib/mongoid/matchable/size.rb +0 -21
  1002. data/lib/mongoid/relations/accessors.rb +0 -267
  1003. data/lib/mongoid/relations/auto_save.rb +0 -94
  1004. data/lib/mongoid/relations/binding.rb +0 -218
  1005. data/lib/mongoid/relations/bindings/embedded/in.rb +0 -59
  1006. data/lib/mongoid/relations/bindings/embedded/many.rb +0 -43
  1007. data/lib/mongoid/relations/bindings/embedded/one.rb +0 -45
  1008. data/lib/mongoid/relations/bindings/referenced/in.rb +0 -65
  1009. data/lib/mongoid/relations/bindings/referenced/many.rb +0 -38
  1010. data/lib/mongoid/relations/bindings/referenced/many_to_many.rb +0 -70
  1011. data/lib/mongoid/relations/bindings/referenced/one.rb +0 -44
  1012. data/lib/mongoid/relations/bindings.rb +0 -9
  1013. data/lib/mongoid/relations/builder.rb +0 -57
  1014. data/lib/mongoid/relations/builders/embedded/in.rb +0 -29
  1015. data/lib/mongoid/relations/builders/embedded/many.rb +0 -36
  1016. data/lib/mongoid/relations/builders/embedded/one.rb +0 -30
  1017. data/lib/mongoid/relations/builders/nested_attributes/many.rb +0 -199
  1018. data/lib/mongoid/relations/builders/nested_attributes/one.rb +0 -126
  1019. data/lib/mongoid/relations/builders/referenced/in.rb +0 -26
  1020. data/lib/mongoid/relations/builders/referenced/many.rb +0 -26
  1021. data/lib/mongoid/relations/builders/referenced/many_to_many.rb +0 -39
  1022. data/lib/mongoid/relations/builders/referenced/one.rb +0 -26
  1023. data/lib/mongoid/relations/builders.rb +0 -106
  1024. data/lib/mongoid/relations/cascading/delete.rb +0 -44
  1025. data/lib/mongoid/relations/cascading/destroy.rb +0 -43
  1026. data/lib/mongoid/relations/cascading/nullify.rb +0 -35
  1027. data/lib/mongoid/relations/cascading/restrict.rb +0 -39
  1028. data/lib/mongoid/relations/cascading.rb +0 -56
  1029. data/lib/mongoid/relations/constraint.rb +0 -55
  1030. data/lib/mongoid/relations/conversions.rb +0 -34
  1031. data/lib/mongoid/relations/counter_cache.rb +0 -160
  1032. data/lib/mongoid/relations/cyclic.rb +0 -107
  1033. data/lib/mongoid/relations/eager/base.rb +0 -153
  1034. data/lib/mongoid/relations/eager/belongs_to.rb +0 -31
  1035. data/lib/mongoid/relations/eager/has_and_belongs_to_many.rb +0 -47
  1036. data/lib/mongoid/relations/eager/has_many.rb +0 -38
  1037. data/lib/mongoid/relations/eager/has_one.rb +0 -30
  1038. data/lib/mongoid/relations/eager.rb +0 -36
  1039. data/lib/mongoid/relations/embedded/batchable.rb +0 -384
  1040. data/lib/mongoid/relations/embedded/in.rb +0 -241
  1041. data/lib/mongoid/relations/embedded/many.rb +0 -683
  1042. data/lib/mongoid/relations/embedded/one.rb +0 -235
  1043. data/lib/mongoid/relations/macros.rb +0 -367
  1044. data/lib/mongoid/relations/many.rb +0 -242
  1045. data/lib/mongoid/relations/marshalable.rb +0 -32
  1046. data/lib/mongoid/relations/metadata.rb +0 -1179
  1047. data/lib/mongoid/relations/nested_builder.rb +0 -74
  1048. data/lib/mongoid/relations/one.rb +0 -60
  1049. data/lib/mongoid/relations/options.rb +0 -49
  1050. data/lib/mongoid/relations/polymorphic.rb +0 -39
  1051. data/lib/mongoid/relations/proxy.rb +0 -215
  1052. data/lib/mongoid/relations/referenced/in.rb +0 -304
  1053. data/lib/mongoid/relations/referenced/many.rb +0 -812
  1054. data/lib/mongoid/relations/referenced/many_to_many.rb +0 -479
  1055. data/lib/mongoid/relations/referenced/one.rb +0 -290
  1056. data/lib/mongoid/relations/reflections.rb +0 -64
  1057. data/lib/mongoid/relations/synchronization.rb +0 -169
  1058. data/lib/mongoid/relations/targets/enumerable.rb +0 -493
  1059. data/lib/mongoid/relations/targets.rb +0 -2
  1060. data/lib/mongoid/relations/touchable.rb +0 -97
  1061. data/lib/mongoid/relations.rb +0 -148
  1062. data/spec/app/models/account.rb +0 -36
  1063. data/spec/app/models/acolyte.rb +0 -17
  1064. data/spec/app/models/actor.rb +0 -18
  1065. data/spec/app/models/actress.rb +0 -2
  1066. data/spec/app/models/address.rb +0 -79
  1067. data/spec/app/models/address_component.rb +0 -5
  1068. data/spec/app/models/address_number.rb +0 -6
  1069. data/spec/app/models/agency.rb +0 -5
  1070. data/spec/app/models/agent.rb +0 -16
  1071. data/spec/app/models/album.rb +0 -18
  1072. data/spec/app/models/alert.rb +0 -7
  1073. data/spec/app/models/animal.rb +0 -25
  1074. data/spec/app/models/answer.rb +0 -6
  1075. data/spec/app/models/appointment.rb +0 -7
  1076. data/spec/app/models/array_field.rb +0 -7
  1077. data/spec/app/models/article.rb +0 -12
  1078. data/spec/app/models/artist.rb +0 -87
  1079. data/spec/app/models/artwork.rb +0 -4
  1080. data/spec/app/models/audio.rb +0 -5
  1081. data/spec/app/models/augmentation.rb +0 -11
  1082. data/spec/app/models/author.rb +0 -6
  1083. data/spec/app/models/baby.rb +0 -4
  1084. data/spec/app/models/band.rb +0 -31
  1085. data/spec/app/models/bar.rb +0 -10
  1086. data/spec/app/models/basic.rb +0 -6
  1087. data/spec/app/models/bed.rb +0 -1
  1088. data/spec/app/models/big_palette.rb +0 -2
  1089. data/spec/app/models/birthday.rb +0 -13
  1090. data/spec/app/models/bomb.rb +0 -4
  1091. data/spec/app/models/book.rb +0 -16
  1092. data/spec/app/models/breed.rb +0 -4
  1093. data/spec/app/models/browser.rb +0 -6
  1094. data/spec/app/models/building.rb +0 -6
  1095. data/spec/app/models/building_address.rb +0 -7
  1096. data/spec/app/models/bus.rb +0 -7
  1097. data/spec/app/models/business.rb +0 -5
  1098. data/spec/app/models/callback_test.rb +0 -9
  1099. data/spec/app/models/canvas.rb +0 -25
  1100. data/spec/app/models/car.rb +0 -1
  1101. data/spec/app/models/cat.rb +0 -8
  1102. data/spec/app/models/category.rb +0 -8
  1103. data/spec/app/models/child.rb +0 -4
  1104. data/spec/app/models/child_doc.rb +0 -22
  1105. data/spec/app/models/church.rb +0 -6
  1106. data/spec/app/models/circle.rb +0 -3
  1107. data/spec/app/models/circuit.rb +0 -4
  1108. data/spec/app/models/circus.rb +0 -7
  1109. data/spec/app/models/code.rb +0 -11
  1110. data/spec/app/models/comment.rb +0 -16
  1111. data/spec/app/models/company.rb +0 -5
  1112. data/spec/app/models/consumption_period.rb +0 -7
  1113. data/spec/app/models/contextable_item.rb +0 -5
  1114. data/spec/app/models/contractor.rb +0 -5
  1115. data/spec/app/models/cookie.rb +0 -6
  1116. data/spec/app/models/country_code.rb +0 -8
  1117. data/spec/app/models/courier_job.rb +0 -4
  1118. data/spec/app/models/definition.rb +0 -9
  1119. data/spec/app/models/description.rb +0 -11
  1120. data/spec/app/models/dictionary.rb +0 -10
  1121. data/spec/app/models/division.rb +0 -10
  1122. data/spec/app/models/doctor.rb +0 -12
  1123. data/spec/app/models/dog.rb +0 -7
  1124. data/spec/app/models/dokument.rb +0 -6
  1125. data/spec/app/models/draft.rb +0 -9
  1126. data/spec/app/models/dragon.rb +0 -4
  1127. data/spec/app/models/driver.rb +0 -7
  1128. data/spec/app/models/drug.rb +0 -6
  1129. data/spec/app/models/dungeon.rb +0 -4
  1130. data/spec/app/models/edit.rb +0 -5
  1131. data/spec/app/models/email.rb +0 -6
  1132. data/spec/app/models/employer.rb +0 -5
  1133. data/spec/app/models/entry.rb +0 -6
  1134. data/spec/app/models/eraser.rb +0 -1
  1135. data/spec/app/models/even.rb +0 -7
  1136. data/spec/app/models/event.rb +0 -22
  1137. data/spec/app/models/exhibition.rb +0 -4
  1138. data/spec/app/models/exhibitor.rb +0 -6
  1139. data/spec/app/models/explosion.rb +0 -4
  1140. data/spec/app/models/eye.rb +0 -9
  1141. data/spec/app/models/eye_bowl.rb +0 -9
  1142. data/spec/app/models/face.rb +0 -8
  1143. data/spec/app/models/favorite.rb +0 -6
  1144. data/spec/app/models/filesystem.rb +0 -5
  1145. data/spec/app/models/fire_hydrant.rb +0 -6
  1146. data/spec/app/models/firefox.rb +0 -4
  1147. data/spec/app/models/fish.rb +0 -7
  1148. data/spec/app/models/folder.rb +0 -7
  1149. data/spec/app/models/folder_item.rb +0 -9
  1150. data/spec/app/models/fruits.rb +0 -34
  1151. data/spec/app/models/game.rb +0 -19
  1152. data/spec/app/models/ghost.rb +0 -7
  1153. data/spec/app/models/home.rb +0 -4
  1154. data/spec/app/models/house.rb +0 -6
  1155. data/spec/app/models/html_writer.rb +0 -3
  1156. data/spec/app/models/id_key.rb +0 -6
  1157. data/spec/app/models/image.rb +0 -22
  1158. data/spec/app/models/implant.rb +0 -16
  1159. data/spec/app/models/item.rb +0 -8
  1160. data/spec/app/models/jar.rb +0 -7
  1161. data/spec/app/models/kaleidoscope.rb +0 -6
  1162. data/spec/app/models/kangaroo.rb +0 -4
  1163. data/spec/app/models/label.rb +0 -47
  1164. data/spec/app/models/language.rb +0 -5
  1165. data/spec/app/models/lat_lng.rb +0 -15
  1166. data/spec/app/models/league.rb +0 -11
  1167. data/spec/app/models/learner.rb +0 -2
  1168. data/spec/app/models/line_item.rb +0 -6
  1169. data/spec/app/models/location.rb +0 -8
  1170. data/spec/app/models/login.rb +0 -8
  1171. data/spec/app/models/manufacturer.rb +0 -7
  1172. data/spec/app/models/meat.rb +0 -4
  1173. data/spec/app/models/membership.rb +0 -4
  1174. data/spec/app/models/message.rb +0 -11
  1175. data/spec/app/models/mixed_drink.rb +0 -4
  1176. data/spec/app/models/movie.rb +0 -13
  1177. data/spec/app/models/my_hash.rb +0 -2
  1178. data/spec/app/models/name.rb +0 -24
  1179. data/spec/app/models/node.rb +0 -5
  1180. data/spec/app/models/note.rb +0 -17
  1181. data/spec/app/models/odd.rb +0 -7
  1182. data/spec/app/models/ordered_post.rb +0 -11
  1183. data/spec/app/models/ordered_preference.rb +0 -6
  1184. data/spec/app/models/oscar.rb +0 -14
  1185. data/spec/app/models/override.rb +0 -16
  1186. data/spec/app/models/ownable.rb +0 -6
  1187. data/spec/app/models/owner.rb +0 -6
  1188. data/spec/app/models/pack.rb +0 -3
  1189. data/spec/app/models/page.rb +0 -16
  1190. data/spec/app/models/page_question.rb +0 -4
  1191. data/spec/app/models/palette.rb +0 -7
  1192. data/spec/app/models/parent.rb +0 -5
  1193. data/spec/app/models/parent_doc.rb +0 -6
  1194. data/spec/app/models/passport.rb +0 -5
  1195. data/spec/app/models/patient.rb +0 -9
  1196. data/spec/app/models/pdf_writer.rb +0 -3
  1197. data/spec/app/models/pencil.rb +0 -1
  1198. data/spec/app/models/person.rb +0 -207
  1199. data/spec/app/models/pet.rb +0 -23
  1200. data/spec/app/models/pet_owner.rb +0 -6
  1201. data/spec/app/models/phone.rb +0 -9
  1202. data/spec/app/models/pizza.rb +0 -7
  1203. data/spec/app/models/player.rb +0 -35
  1204. data/spec/app/models/post.rb +0 -50
  1205. data/spec/app/models/post_genre.rb +0 -6
  1206. data/spec/app/models/powerup.rb +0 -11
  1207. data/spec/app/models/preference.rb +0 -9
  1208. data/spec/app/models/princess.rb +0 -10
  1209. data/spec/app/models/product.rb +0 -17
  1210. data/spec/app/models/profile.rb +0 -5
  1211. data/spec/app/models/pronunciation.rb +0 -5
  1212. data/spec/app/models/pub.rb +0 -6
  1213. data/spec/app/models/purchase.rb +0 -4
  1214. data/spec/app/models/question.rb +0 -8
  1215. data/spec/app/models/quiz.rb +0 -7
  1216. data/spec/app/models/rating.rb +0 -8
  1217. data/spec/app/models/record.rb +0 -52
  1218. data/spec/app/models/registry.rb +0 -4
  1219. data/spec/app/models/role.rb +0 -7
  1220. data/spec/app/models/root_category.rb +0 -4
  1221. data/spec/app/models/sandwich.rb +0 -9
  1222. data/spec/app/models/scheduler.rb +0 -7
  1223. data/spec/app/models/seo.rb +0 -7
  1224. data/spec/app/models/series.rb +0 -4
  1225. data/spec/app/models/server.rb +0 -13
  1226. data/spec/app/models/service.rb +0 -22
  1227. data/spec/app/models/shape.rb +0 -12
  1228. data/spec/app/models/shelf.rb +0 -5
  1229. data/spec/app/models/shipment_address.rb +0 -2
  1230. data/spec/app/models/shipping_container.rb +0 -5
  1231. data/spec/app/models/shipping_pack.rb +0 -3
  1232. data/spec/app/models/shop.rb +0 -6
  1233. data/spec/app/models/short_agent.rb +0 -4
  1234. data/spec/app/models/short_quiz.rb +0 -5
  1235. data/spec/app/models/simple.rb +0 -5
  1236. data/spec/app/models/slave.rb +0 -6
  1237. data/spec/app/models/song.rb +0 -8
  1238. data/spec/app/models/sound.rb +0 -5
  1239. data/spec/app/models/square.rb +0 -4
  1240. data/spec/app/models/staff.rb +0 -7
  1241. data/spec/app/models/store_as_dup_test1.rb +0 -5
  1242. data/spec/app/models/store_as_dup_test2.rb +0 -5
  1243. data/spec/app/models/strategy.rb +0 -3
  1244. data/spec/app/models/sub_item.rb +0 -3
  1245. data/spec/app/models/subscription.rb +0 -5
  1246. data/spec/app/models/survey.rb +0 -5
  1247. data/spec/app/models/symptom.rb +0 -6
  1248. data/spec/app/models/tag.rb +0 -8
  1249. data/spec/app/models/target.rb +0 -5
  1250. data/spec/app/models/template.rb +0 -5
  1251. data/spec/app/models/thing.rb +0 -9
  1252. data/spec/app/models/title.rb +0 -3
  1253. data/spec/app/models/tool.rb +0 -8
  1254. data/spec/app/models/topping.rb +0 -5
  1255. data/spec/app/models/track.rb +0 -38
  1256. data/spec/app/models/translation.rb +0 -5
  1257. data/spec/app/models/tree.rb +0 -9
  1258. data/spec/app/models/truck.rb +0 -3
  1259. data/spec/app/models/user.rb +0 -21
  1260. data/spec/app/models/user_account.rb +0 -10
  1261. data/spec/app/models/validation_callback.rb +0 -10
  1262. data/spec/app/models/vehicle.rb +0 -11
  1263. data/spec/app/models/version.rb +0 -5
  1264. data/spec/app/models/vet_visit.rb +0 -5
  1265. data/spec/app/models/video.rb +0 -13
  1266. data/spec/app/models/video_game.rb +0 -1
  1267. data/spec/app/models/weapon.rb +0 -11
  1268. data/spec/app/models/wiki_page.rb +0 -14
  1269. data/spec/app/models/word.rb +0 -15
  1270. data/spec/app/models/word_origin.rb +0 -11
  1271. data/spec/app/models/writer.rb +0 -11
  1272. data/spec/mongoid/criteria/queryable/forwardable_spec.rb +0 -87
  1273. data/spec/mongoid/fields/internal/foreign_keys/array_spec.rb +0 -184
  1274. data/spec/mongoid/fields/internal/foreign_keys/object_spec.rb +0 -201
  1275. data/spec/mongoid/matchable/all_spec.rb +0 -31
  1276. data/spec/mongoid/matchable/and_spec.rb +0 -187
  1277. data/spec/mongoid/matchable/default_spec.rb +0 -130
  1278. data/spec/mongoid/matchable/elem_match_spec.rb +0 -86
  1279. data/spec/mongoid/matchable/exists_spec.rb +0 -57
  1280. data/spec/mongoid/matchable/gt_spec.rb +0 -86
  1281. data/spec/mongoid/matchable/gte_spec.rb +0 -84
  1282. data/spec/mongoid/matchable/in_spec.rb +0 -49
  1283. data/spec/mongoid/matchable/lt_spec.rb +0 -85
  1284. data/spec/mongoid/matchable/lte_spec.rb +0 -85
  1285. data/spec/mongoid/matchable/ne_spec.rb +0 -46
  1286. data/spec/mongoid/matchable/nin_spec.rb +0 -48
  1287. data/spec/mongoid/matchable/nor_spec.rb +0 -209
  1288. data/spec/mongoid/matchable/or_spec.rb +0 -131
  1289. data/spec/mongoid/matchable/regexp_spec.rb +0 -59
  1290. data/spec/mongoid/matchable/size_spec.rb +0 -25
  1291. data/spec/mongoid/matchable_spec.rb +0 -853
  1292. data/spec/mongoid/relations/accessors_spec.rb +0 -821
  1293. data/spec/mongoid/relations/auto_save_spec.rb +0 -314
  1294. data/spec/mongoid/relations/bindings/embedded/in_spec.rb +0 -171
  1295. data/spec/mongoid/relations/bindings/embedded/many_spec.rb +0 -54
  1296. data/spec/mongoid/relations/bindings/embedded/one_spec.rb +0 -77
  1297. data/spec/mongoid/relations/bindings/referenced/in_spec.rb +0 -241
  1298. data/spec/mongoid/relations/bindings/referenced/many_spec.rb +0 -153
  1299. data/spec/mongoid/relations/bindings/referenced/many_to_many_spec.rb +0 -178
  1300. data/spec/mongoid/relations/bindings/referenced/one_spec.rb +0 -131
  1301. data/spec/mongoid/relations/builders/embedded/in_spec.rb +0 -34
  1302. data/spec/mongoid/relations/builders/embedded/many_spec.rb +0 -132
  1303. data/spec/mongoid/relations/builders/embedded/one_spec.rb +0 -99
  1304. data/spec/mongoid/relations/builders/nested_attributes/many_spec.rb +0 -233
  1305. data/spec/mongoid/relations/builders/nested_attributes/one_spec.rb +0 -250
  1306. data/spec/mongoid/relations/builders/referenced/in_spec.rb +0 -230
  1307. data/spec/mongoid/relations/builders/referenced/many_spec.rb +0 -137
  1308. data/spec/mongoid/relations/builders/referenced/many_to_many_spec.rb +0 -178
  1309. data/spec/mongoid/relations/builders/referenced/one_spec.rb +0 -111
  1310. data/spec/mongoid/relations/builders_spec.rb +0 -253
  1311. data/spec/mongoid/relations/cascading/delete_spec.rb +0 -101
  1312. data/spec/mongoid/relations/cascading/destroy_spec.rb +0 -47
  1313. data/spec/mongoid/relations/cascading/nullify_spec.rb +0 -32
  1314. data/spec/mongoid/relations/cascading/restrict_spec.rb +0 -68
  1315. data/spec/mongoid/relations/cascading_spec.rb +0 -355
  1316. data/spec/mongoid/relations/constraint_spec.rb +0 -75
  1317. data/spec/mongoid/relations/conversions_spec.rb +0 -128
  1318. data/spec/mongoid/relations/counter_cache_spec.rb +0 -450
  1319. data/spec/mongoid/relations/cyclic_spec.rb +0 -178
  1320. data/spec/mongoid/relations/eager/belongs_to_spec.rb +0 -163
  1321. data/spec/mongoid/relations/eager/has_and_belongs_to_many_spec.rb +0 -133
  1322. data/spec/mongoid/relations/eager/has_many_spec.rb +0 -244
  1323. data/spec/mongoid/relations/eager/has_one_spec.rb +0 -163
  1324. data/spec/mongoid/relations/eager_spec.rb +0 -279
  1325. data/spec/mongoid/relations/embedded/dirty_spec.rb +0 -65
  1326. data/spec/mongoid/relations/embedded/in_spec.rb +0 -579
  1327. data/spec/mongoid/relations/embedded/many_spec.rb +0 -4412
  1328. data/spec/mongoid/relations/embedded/one_spec.rb +0 -1068
  1329. data/spec/mongoid/relations/macros_spec.rb +0 -1039
  1330. data/spec/mongoid/relations/metadata_spec.rb +0 -1985
  1331. data/spec/mongoid/relations/options_spec.rb +0 -35
  1332. data/spec/mongoid/relations/polymorphic_spec.rb +0 -128
  1333. data/spec/mongoid/relations/referenced/in_spec.rb +0 -1366
  1334. data/spec/mongoid/relations/referenced/many_spec.rb +0 -3816
  1335. data/spec/mongoid/relations/referenced/many_to_many_spec.rb +0 -3577
  1336. data/spec/mongoid/relations/referenced/one_spec.rb +0 -1240
  1337. data/spec/mongoid/relations/reflections_spec.rb +0 -101
  1338. data/spec/mongoid/relations/synchronization_spec.rb +0 -495
  1339. data/spec/mongoid/relations/targets/enumerable_spec.rb +0 -1825
  1340. data/spec/mongoid/relations/touchable_spec.rb +0 -402
  1341. data/spec/mongoid/relations_spec.rb +0 -189
@@ -0,0 +1,2054 @@
1
+ # frozen_string_literal: true
2
+ # encoding: utf-8
3
+
4
+ require "spec_helper"
5
+
6
+ describe Mongoid::Association::Referenced::HasMany::Enumerable do
7
+
8
+ describe "#==" do
9
+
10
+ context "when comparing with an enumerable" do
11
+
12
+ let(:person) do
13
+ Person.create
14
+ end
15
+
16
+ let!(:post) do
17
+ Post.create(person_id: person.id)
18
+ end
19
+
20
+ context "when only a criteria target exists" do
21
+
22
+ let(:criteria) do
23
+ Post.where(person_id: person.id)
24
+ end
25
+
26
+ let!(:enumerable) do
27
+ described_class.new(criteria)
28
+ end
29
+
30
+ it "returns the equality check" do
31
+ expect(enumerable).to eq([ post ])
32
+ end
33
+ end
34
+
35
+ context "when only an array target exists" do
36
+
37
+ let!(:enumerable) do
38
+ described_class.new([ post ])
39
+ end
40
+
41
+ it "returns the equality check" do
42
+ expect(enumerable._loaded.values).to eq([ post ])
43
+ end
44
+ end
45
+
46
+ context "when a criteria and added exist" do
47
+
48
+ let(:criteria) do
49
+ Post.where(person_id: person.id)
50
+ end
51
+
52
+ let(:enumerable) do
53
+ described_class.new(criteria)
54
+ end
55
+
56
+ let(:post_two) do
57
+ Post.new
58
+ end
59
+
60
+ context "when the added does not contain unloaded docs" do
61
+
62
+ before do
63
+ enumerable << post_two
64
+ end
65
+
66
+ it "returns the equality check" do
67
+ expect(enumerable).to eq([ post, post_two ])
68
+ end
69
+ end
70
+
71
+ context "when the added contains unloaded docs" do
72
+
73
+ before do
74
+ enumerable << post
75
+ end
76
+
77
+ it "returns the equality check" do
78
+ expect(enumerable).to eq([ post ])
79
+ end
80
+ end
81
+
82
+ context "when the enumerable is loaded" do
83
+
84
+ before do
85
+ enumerable.instance_variable_set(:@executed, true)
86
+ end
87
+
88
+ context "when the loaded has no docs and added is persisted" do
89
+
90
+ before do
91
+ post.save
92
+ enumerable._added[post.id] = post
93
+ end
94
+
95
+ it "returns the equality check" do
96
+ expect(enumerable).to eq([ post ])
97
+ end
98
+ end
99
+ end
100
+ end
101
+ end
102
+
103
+ context "when comparing with a non enumerable" do
104
+
105
+ let(:enumerable) do
106
+ described_class.new([])
107
+ end
108
+
109
+ it "returns false" do
110
+ expect(enumerable).to_not eq("person")
111
+ end
112
+ end
113
+ end
114
+
115
+ describe "#===" do
116
+
117
+ let(:enumerable) do
118
+ described_class.new([])
119
+ end
120
+
121
+ context "when compared to an array class" do
122
+
123
+ it "returns true" do
124
+ expect(enumerable === Array).to be true
125
+ end
126
+ end
127
+
128
+ context "when compared to an enumerable class" do
129
+
130
+ it "returns true" do
131
+ expect(enumerable === described_class).to be true
132
+ end
133
+ end
134
+
135
+ context "when compared to a different class" do
136
+
137
+ it "returns false" do
138
+ expect(enumerable === Mongoid::Document).to be false
139
+ end
140
+ end
141
+
142
+ context "when compared to an array instance" do
143
+
144
+ context "when the entries are equal" do
145
+
146
+ let(:other) do
147
+ described_class.new([])
148
+ end
149
+
150
+ it "returns true" do
151
+ expect(enumerable === other).to be true
152
+ end
153
+ end
154
+
155
+ context "when the entries are not equal" do
156
+
157
+ let(:other) do
158
+ described_class.new([ Band.new ])
159
+ end
160
+
161
+ it "returns false" do
162
+ expect(enumerable === other).to be false
163
+ end
164
+ end
165
+ end
166
+ end
167
+
168
+ describe "#<<" do
169
+
170
+ let(:person) do
171
+ Person.create
172
+ end
173
+
174
+ let!(:post) do
175
+ Post.create(person_id: person.id)
176
+ end
177
+
178
+ let!(:enumerable) do
179
+ described_class.new([])
180
+ end
181
+
182
+ context "when the relation is empty" do
183
+
184
+ let!(:added) do
185
+ enumerable << post
186
+ end
187
+
188
+ it "adds the document to the added target" do
189
+ expect(enumerable._added).to eq({ post.id => post })
190
+ end
191
+
192
+ it "returns the added documents" do
193
+ expect(added).to eq([ post ])
194
+ end
195
+
196
+ it "sets the base on the new document" do
197
+ expect_query(0) do
198
+ added.collect(&:person)
199
+ end
200
+ end
201
+ end
202
+ end
203
+
204
+ describe "#any?" do
205
+
206
+ let(:person) do
207
+ Person.create
208
+ end
209
+
210
+ let!(:post_one) do
211
+ Post.create(person_id: person.id)
212
+ end
213
+
214
+ let!(:post_two) do
215
+ Post.create(person_id: person.id)
216
+ end
217
+
218
+ context "when only a criteria target exists" do
219
+
220
+ let(:criteria) do
221
+ Post.where(person_id: person.id)
222
+ end
223
+
224
+ let!(:enumerable) do
225
+ described_class.new(criteria)
226
+ end
227
+
228
+ let!(:any) do
229
+ enumerable.any?
230
+ end
231
+
232
+ it "returns true" do
233
+ expect(any).to be true
234
+ end
235
+
236
+ it "retains the correct length" do
237
+ expect(enumerable.length).to eq(2)
238
+ end
239
+
240
+ it "retains the correct length when calling to_a" do
241
+ expect(enumerable.to_a.length).to eq(2)
242
+ end
243
+
244
+ context "when iterating over the relation a second time" do
245
+
246
+ before do
247
+ enumerable.each { |post| post }
248
+ end
249
+
250
+ it "retains the correct length" do
251
+ expect(enumerable.length).to eq(2)
252
+ end
253
+
254
+ it "retains the correct length when calling to_a" do
255
+ expect(enumerable.to_a.length).to eq(2)
256
+ end
257
+ end
258
+ end
259
+
260
+ context "when the documents have been loaded" do
261
+ let(:criteria) do
262
+ Post.where(person_id: person.id)
263
+ end
264
+
265
+ let!(:enumerable) do
266
+ described_class.new(criteria)
267
+ end
268
+
269
+ before do
270
+ enumerable.load_all!
271
+ end
272
+
273
+ it "is _loaded" do
274
+ expect(enumerable._loaded?).to be true
275
+ end
276
+
277
+ context "when a block is given" do
278
+ it "returns true when the predicate is true" do
279
+ expect(
280
+ enumerable.any? { |doc| true }
281
+ ).to be true
282
+ end
283
+
284
+ it "returns false when the predicate is false" do
285
+ expect(
286
+ enumerable.any? { |doc| false }
287
+ ).to be false
288
+ end
289
+ end
290
+
291
+ context "when an argument is given" do
292
+ ruby_version_gte '2.5'
293
+
294
+ it "returns true when the argument is true" do
295
+ expect(enumerable.any?(Post)).to be true
296
+ end
297
+
298
+ it "returns false when the argument is false" do
299
+ expect(enumerable.any?(Sandwich)).to be false
300
+ end
301
+ end
302
+
303
+ context "when both an argument and a block are given" do
304
+ ruby_version_gte '2.5'
305
+
306
+ it "gives precedence to the pattern" do
307
+ expect(
308
+ enumerable.any?(Post) { |doc| false }
309
+ ).to be true
310
+ end
311
+ end
312
+ end
313
+
314
+ context "when the documents are not loaded" do
315
+
316
+ let(:criteria) do
317
+ Post.where(person_id: person.id)
318
+ end
319
+
320
+ let!(:enumerable) do
321
+ described_class.new(criteria)
322
+ end
323
+
324
+ it "is not _loaded" do
325
+ expect(enumerable._loaded?).to be false
326
+ end
327
+
328
+ context "when a block is given" do
329
+ it "returns true when the predicate is true" do
330
+ expect(
331
+ enumerable.any? { |doc| true }
332
+ ).to be true
333
+ end
334
+
335
+ it "returns false when the predicate is false" do
336
+ expect(
337
+ enumerable.any? { |doc| false }
338
+ ).to be false
339
+ end
340
+ end
341
+
342
+ context "when an argument is given" do
343
+ ruby_version_gte '2.5'
344
+
345
+ it "returns true when the argument is true" do
346
+ expect(enumerable.any?(Post)).to be true
347
+ end
348
+
349
+ it "returns false when the argument is false" do
350
+ expect(enumerable.any?(Sandwich)).to be false
351
+ end
352
+ end
353
+
354
+ context "when both an argument and a block are given" do
355
+ ruby_version_gte '2.5'
356
+
357
+ it "gives precedence to the pattern" do
358
+ expect(
359
+ enumerable.any?(Post) { |doc| false }
360
+ ).to be true
361
+ end
362
+ end
363
+ end
364
+ end
365
+
366
+ describe "#clear" do
367
+
368
+ let(:person) do
369
+ Person.create
370
+ end
371
+
372
+ let!(:post) do
373
+ Post.create(person_id: person.id)
374
+ end
375
+
376
+ let!(:post_two) do
377
+ Post.create(person_id: person.id)
378
+ end
379
+
380
+ let(:criteria) do
381
+ Post.where(person_id: person.id)
382
+ end
383
+
384
+ let(:enumerable) do
385
+ described_class.new(criteria)
386
+ end
387
+
388
+ before do
389
+ enumerable._loaded[post.id] = post
390
+ enumerable << post
391
+ end
392
+
393
+ let!(:clear) do
394
+ enumerable.clear do |doc|
395
+ expect(doc).to be_a(Post)
396
+ end
397
+ end
398
+
399
+ it "clears out the loaded docs" do
400
+ expect(enumerable._loaded).to be_empty
401
+ end
402
+
403
+ it "clears out the added docs" do
404
+ expect(enumerable._added).to be_empty
405
+ end
406
+
407
+ it "retains its loaded state" do
408
+ expect(enumerable).to_not be__loaded
409
+ end
410
+ end
411
+
412
+ describe "#clone" do
413
+
414
+ let(:person) do
415
+ Person.create
416
+ end
417
+
418
+ let!(:post) do
419
+ Post.create(title: "one", person_id: person.id)
420
+ end
421
+
422
+ let!(:post_two) do
423
+ Post.create(title: "two", person_id: person.id)
424
+ end
425
+
426
+ let(:criteria) do
427
+ Post.where(person_id: person.id)
428
+ end
429
+
430
+ let(:enumerable) do
431
+ described_class.new(criteria)
432
+ end
433
+
434
+ before do
435
+ enumerable << post
436
+ enumerable << post_two
437
+ end
438
+
439
+ let(:cloned) do
440
+ enumerable.clone
441
+ end
442
+
443
+ it "does not retain the first id" do
444
+ expect(cloned.first).to_not eq(post)
445
+ end
446
+
447
+ it "does not retain the last id" do
448
+ expect(cloned.last).to_not eq(post_two)
449
+ end
450
+ end
451
+
452
+ describe "#delete" do
453
+
454
+ let(:person) do
455
+ Person.create
456
+ end
457
+
458
+ context "when the document is loaded" do
459
+
460
+ let!(:post) do
461
+ Post.create(person_id: person.id)
462
+ end
463
+
464
+ let!(:enumerable) do
465
+ described_class.new([ post ])
466
+ end
467
+
468
+ let!(:deleted) do
469
+ enumerable.delete(post)
470
+ end
471
+
472
+ it "deletes the document from the enumerable" do
473
+ expect(enumerable._loaded).to be_empty
474
+ end
475
+
476
+ it "returns the document" do
477
+ expect(deleted).to eq(post)
478
+ end
479
+ end
480
+
481
+ context "when the document is added" do
482
+
483
+ let!(:post) do
484
+ Post.new
485
+ end
486
+
487
+ let(:criteria) do
488
+ Person.where(person_id: person.id)
489
+ end
490
+
491
+ let!(:enumerable) do
492
+ described_class.new(criteria)
493
+ end
494
+
495
+ before do
496
+ enumerable << post
497
+ end
498
+
499
+ let!(:deleted) do
500
+ enumerable.delete(post)
501
+ end
502
+
503
+ it "removes the document from the added docs" do
504
+ expect(enumerable._added).to be_empty
505
+ end
506
+
507
+ it "returns the document" do
508
+ expect(deleted).to eq(post)
509
+ end
510
+ end
511
+
512
+ context "when the document is unloaded" do
513
+
514
+ let!(:post) do
515
+ Post.create(person_id: person.id)
516
+ end
517
+
518
+ let(:criteria) do
519
+ Post.where(person_id: person.id)
520
+ end
521
+
522
+ let!(:enumerable) do
523
+ described_class.new(criteria)
524
+ end
525
+
526
+ let!(:deleted) do
527
+ enumerable.delete(post)
528
+ end
529
+
530
+ it "does not load the document" do
531
+ expect(enumerable._loaded).to be_empty
532
+ end
533
+
534
+ it "returns the document" do
535
+ expect(deleted).to eq(post)
536
+ end
537
+ end
538
+
539
+ context "when the document is not found" do
540
+
541
+ let!(:post) do
542
+ Post.create(person_id: person.id)
543
+ end
544
+
545
+ let(:criteria) do
546
+ Person.where(person_id: person.id)
547
+ end
548
+
549
+ let!(:enumerable) do
550
+ described_class.new([ post ])
551
+ end
552
+
553
+ let!(:deleted) do
554
+ enumerable.delete(Post.new) do |doc|
555
+ expect(doc).to be_nil
556
+ end
557
+ end
558
+
559
+ it "returns nil" do
560
+ expect(deleted).to be_nil
561
+ end
562
+ end
563
+ end
564
+
565
+ describe "#delete_if" do
566
+
567
+ let(:person) do
568
+ Person.create
569
+ end
570
+
571
+ context "when the document is loaded" do
572
+
573
+ let!(:post) do
574
+ Post.create(person_id: person.id)
575
+ end
576
+
577
+ let!(:enumerable) do
578
+ described_class.new([ post ])
579
+ end
580
+
581
+ let!(:deleted) do
582
+ enumerable.delete_if { |doc| doc == post }
583
+ end
584
+
585
+ it "deletes the document from the enumerable" do
586
+ expect(enumerable._loaded).to be_empty
587
+ end
588
+
589
+ it "returns the remaining docs" do
590
+ expect(deleted).to be_empty
591
+ end
592
+ end
593
+
594
+ context "when the document is added" do
595
+
596
+ let!(:post) do
597
+ Post.new
598
+ end
599
+
600
+ let(:criteria) do
601
+ Person.where(person_id: person.id)
602
+ end
603
+
604
+ let!(:enumerable) do
605
+ described_class.new(criteria)
606
+ end
607
+
608
+ before do
609
+ enumerable << post
610
+ end
611
+
612
+ let!(:deleted) do
613
+ enumerable.delete_if { |doc| doc == post }
614
+ end
615
+
616
+ it "removes the document from the added docs" do
617
+ expect(enumerable._added).to be_empty
618
+ end
619
+
620
+ it "returns the remaining docs" do
621
+ expect(deleted).to be_empty
622
+ end
623
+ end
624
+
625
+ context "when the document is unloaded" do
626
+
627
+ let!(:post) do
628
+ Post.create(person_id: person.id)
629
+ end
630
+
631
+ let(:criteria) do
632
+ Post.where(person_id: person.id)
633
+ end
634
+
635
+ let!(:enumerable) do
636
+ described_class.new(criteria)
637
+ end
638
+
639
+ let!(:deleted) do
640
+ enumerable.delete_if { |doc| doc == post }
641
+ end
642
+
643
+ it "does not load the document" do
644
+ expect(enumerable._loaded).to be_empty
645
+ end
646
+
647
+ it "returns the remaining docs" do
648
+ expect(deleted).to be_empty
649
+ end
650
+ end
651
+
652
+ context "when the block doesn't match" do
653
+
654
+ let!(:post) do
655
+ Post.create(person_id: person.id)
656
+ end
657
+
658
+ let(:criteria) do
659
+ Person.where(person_id: person.id)
660
+ end
661
+
662
+ let!(:enumerable) do
663
+ described_class.new([ post ])
664
+ end
665
+
666
+ let!(:deleted) do
667
+ enumerable.delete_if { |doc| doc == Post.new }
668
+ end
669
+
670
+ it "returns the remaining docs" do
671
+ expect(deleted).to eq([ post ])
672
+ end
673
+ end
674
+ end
675
+
676
+ describe "#detect" do
677
+
678
+ let(:person) do
679
+ Person.create
680
+ end
681
+
682
+ let!(:post) do
683
+ Post.create(person: person, title: "test")
684
+ end
685
+
686
+ let(:criteria) do
687
+ Post.where(person_id: person.id)
688
+ end
689
+
690
+ let!(:enumerable) do
691
+ described_class.new(criteria)
692
+ end
693
+
694
+ context "when setting a value on the matching document" do
695
+
696
+ before do
697
+ enumerable.detect{ |post| post.title = "test" }.rating = 10
698
+ end
699
+
700
+ it "sets the value on the instance" do
701
+ expect(enumerable.detect{ |post| post.title = "test" }.rating).to eq(10)
702
+ end
703
+ end
704
+ end
705
+
706
+ describe "#each" do
707
+
708
+ let(:person) do
709
+ Person.create
710
+ end
711
+
712
+ let!(:post) do
713
+ Post.create(person_id: person.id)
714
+ end
715
+
716
+ context "when only a criteria target exists" do
717
+
718
+ let(:criteria) do
719
+ Post.where(person_id: person.id)
720
+ end
721
+
722
+ let!(:enumerable) do
723
+ described_class.new(criteria)
724
+ end
725
+
726
+ let!(:iterated) do
727
+ enumerable.each do |doc|
728
+ expect(doc).to be_a(Post)
729
+ end
730
+ end
731
+
732
+ it "loads each document" do
733
+ expect(enumerable._loaded).to eq({ post.id => post })
734
+ end
735
+
736
+ it "becomes loaded" do
737
+ expect(enumerable).to be__loaded
738
+ end
739
+
740
+ context 'when the base relation is accessed from each document' do
741
+
742
+ let(:persons) do
743
+ described_class.new(criteria).collect(&:person)
744
+ end
745
+
746
+ before do
747
+ Post.create(person_id: person.id)
748
+ Post.create(person_id: person.id)
749
+ end
750
+
751
+ it 'sets the base relation from the criteria' do
752
+ expect(persons.uniq.size).to eq(1)
753
+ end
754
+ end
755
+ end
756
+
757
+ context "when only an array target exists" do
758
+
759
+ let!(:enumerable) do
760
+ described_class.new([ post ])
761
+ end
762
+
763
+ let!(:iterated) do
764
+ enumerable.each do |doc|
765
+ expect(doc).to be_a(Post)
766
+ end
767
+ end
768
+
769
+ it "does not alter the loaded docs" do
770
+ expect(enumerable._loaded).to eq({ post.id => post })
771
+ end
772
+
773
+ it "stays loaded" do
774
+ expect(enumerable).to be__loaded
775
+ end
776
+ end
777
+
778
+ context "when a criteria and added exist" do
779
+
780
+ let(:criteria) do
781
+ Post.where(person_id: person.id)
782
+ end
783
+
784
+ let!(:enumerable) do
785
+ described_class.new(criteria)
786
+ end
787
+
788
+ let(:post_two) do
789
+ Post.new
790
+ end
791
+
792
+ context "when the added does not contain unloaded docs" do
793
+
794
+ before do
795
+ enumerable << post_two
796
+ end
797
+
798
+ let!(:iterated) do
799
+ enumerable.each do |doc|
800
+ expect(doc).to be_a(Post)
801
+ end
802
+ end
803
+
804
+ it "adds the unloaded to the loaded docs" do
805
+ expect(enumerable._loaded).to eq({ post.id => post })
806
+ end
807
+
808
+ it "keeps the appended in the added docs" do
809
+ expect(enumerable._added).to eq({ post_two.id => post_two })
810
+ end
811
+
812
+ it "stays loaded" do
813
+ expect(enumerable).to be__loaded
814
+ end
815
+ end
816
+
817
+ context "when the added contains unloaded docs" do
818
+
819
+ before do
820
+ enumerable << post
821
+ end
822
+
823
+ let!(:iterated) do
824
+ enumerable.each do |doc|
825
+ expect(doc).to be_a(Post)
826
+ end
827
+ end
828
+
829
+ it "adds the persisted added doc to the loaded" do
830
+ expect(enumerable._loaded).to eq({ post.id => post })
831
+ end
832
+
833
+ it "stays loaded" do
834
+ expect(enumerable).to be__loaded
835
+ end
836
+ end
837
+ end
838
+
839
+ context "when no block is passed" do
840
+
841
+ let(:criteria) do
842
+ Post.where(person_id: person.id)
843
+ end
844
+
845
+ let!(:enumerable) do
846
+ described_class.new(criteria)
847
+ end
848
+
849
+ it "returns an enumerator" do
850
+ expect(enumerable.each.class.include?(Enumerable)).to be true
851
+ end
852
+
853
+ end
854
+ end
855
+
856
+ describe "#entries" do
857
+
858
+ let(:person) do
859
+ Person.create
860
+ end
861
+
862
+ let(:criteria) do
863
+ Post.where(person_id: person.id)
864
+ end
865
+
866
+ let!(:enumerable) do
867
+ described_class.new(criteria)
868
+ end
869
+
870
+ context "when the added contains a persisted document" do
871
+
872
+ let!(:post) do
873
+ Post.create(person_id: person.id)
874
+ end
875
+
876
+ before do
877
+ enumerable << post
878
+ end
879
+
880
+ let(:entries) do
881
+ enumerable.entries
882
+ end
883
+
884
+ it "yields to the in memory documents first" do
885
+ expect(entries.first).to equal(post)
886
+ end
887
+ end
888
+ end
889
+
890
+ describe "#first" do
891
+
892
+ let(:person) do
893
+ Person.create
894
+ end
895
+
896
+ context "when the enumerable is not loaded" do
897
+
898
+ let(:criteria) do
899
+ Post.where(person_id: person.id)
900
+ end
901
+
902
+ let(:enumerable) do
903
+ described_class.new(criteria)
904
+ end
905
+
906
+ context "when unloaded is not empty" do
907
+
908
+ context "when added is empty" do
909
+
910
+ let!(:post) do
911
+ Post.create(person_id: person.id)
912
+ end
913
+
914
+ let(:first) do
915
+ enumerable.first
916
+ end
917
+
918
+ it "returns the first unloaded doc" do
919
+ expect(first).to eq(post)
920
+ end
921
+
922
+ it "does not load the enumerable" do
923
+ expect(enumerable).to_not be__loaded
924
+ end
925
+
926
+ it "receives query only once" do
927
+ expect(criteria).to receive(:first).once
928
+ first
929
+ end
930
+ end
931
+
932
+ context "when added is not empty" do
933
+
934
+ let!(:post) do
935
+ Post.create(person_id: person.id)
936
+ end
937
+
938
+ let(:post_two) do
939
+ Post.new(person_id: person.id)
940
+ end
941
+
942
+ before do
943
+ enumerable << post_two
944
+ end
945
+
946
+ let(:first) do
947
+ enumerable.first
948
+ end
949
+
950
+ context "when a perviously persisted unloaded doc exists" do
951
+
952
+ it "returns the first added doc" do
953
+ expect(first).to eq(post)
954
+ end
955
+
956
+ it "does not load the enumerable" do
957
+ expect(enumerable).to_not be__loaded
958
+ end
959
+ end
960
+ end
961
+ end
962
+
963
+ context "when unloaded is empty" do
964
+
965
+ let!(:post) do
966
+ Post.new(person_id: person.id)
967
+ end
968
+
969
+ before do
970
+ enumerable << post
971
+ end
972
+
973
+ let(:first) do
974
+ enumerable.first
975
+ end
976
+
977
+ it "returns the first loaded doc" do
978
+ expect(first).to eq(post)
979
+ end
980
+
981
+ it "does not load the enumerable" do
982
+ expect(enumerable).to_not be__loaded
983
+ end
984
+ end
985
+
986
+ context "when unloaded and added are empty" do
987
+
988
+ let(:first) do
989
+ enumerable.first
990
+ end
991
+
992
+ it "returns nil" do
993
+ expect(first).to be_nil
994
+ end
995
+
996
+ it "does not load the enumerable" do
997
+ expect(enumerable).to_not be__loaded
998
+ end
999
+ end
1000
+ end
1001
+
1002
+ context "when the enumerable is loaded" do
1003
+
1004
+ context "when loaded is not empty" do
1005
+
1006
+ let!(:post) do
1007
+ Post.create(person_id: person.id)
1008
+ end
1009
+
1010
+ let(:enumerable) do
1011
+ described_class.new([ post ])
1012
+ end
1013
+
1014
+ let(:first) do
1015
+ enumerable.first
1016
+ end
1017
+
1018
+ it "returns the first loaded doc" do
1019
+ expect(first).to eq(post)
1020
+ end
1021
+ end
1022
+
1023
+ context "when loaded is empty" do
1024
+
1025
+ let!(:post) do
1026
+ Post.create(person_id: person.id)
1027
+ end
1028
+
1029
+ let(:enumerable) do
1030
+ described_class.new([])
1031
+ end
1032
+
1033
+ before do
1034
+ enumerable << post
1035
+ end
1036
+
1037
+ let(:first) do
1038
+ enumerable.first
1039
+ end
1040
+
1041
+ it "returns the first added doc" do
1042
+ expect(first).to eq(post)
1043
+ end
1044
+ end
1045
+
1046
+ context "when loaded and added are empty" do
1047
+
1048
+ let(:enumerable) do
1049
+ described_class.new([])
1050
+ end
1051
+
1052
+ let(:first) do
1053
+ enumerable.first
1054
+ end
1055
+
1056
+ it "returns nil" do
1057
+ expect(first).to be_nil
1058
+ end
1059
+ end
1060
+ end
1061
+
1062
+ context 'when the id_sort option is none' do
1063
+
1064
+ let(:person) do
1065
+ Person.create
1066
+ end
1067
+
1068
+ let(:criteria) do
1069
+ Post.where(person_id: person.id)
1070
+ end
1071
+
1072
+ let(:enumerable) do
1073
+ described_class.new(criteria)
1074
+ end
1075
+
1076
+ let!(:first_post) do
1077
+ person.posts.create(title: "One")
1078
+ end
1079
+
1080
+ let!(:second_post) do
1081
+ person.posts.create(title: "Two")
1082
+ end
1083
+
1084
+ it 'does not use the sort on id' do
1085
+ expect(enumerable.first(id_sort: :none)).to eq(first_post)
1086
+ end
1087
+ end
1088
+
1089
+ context 'when the id_sort option is not provided' do
1090
+
1091
+ let(:person) do
1092
+ Person.create
1093
+ end
1094
+
1095
+ let(:criteria) do
1096
+ Post.where(person_id: person.id)
1097
+ end
1098
+
1099
+ let(:enumerable) do
1100
+ described_class.new(criteria)
1101
+ end
1102
+
1103
+ let!(:first_post) do
1104
+ person.posts.create(title: "One")
1105
+ end
1106
+
1107
+ let!(:second_post) do
1108
+ person.posts.create(title: "Two")
1109
+ end
1110
+
1111
+ it 'uses the sort on id' do
1112
+ expect(enumerable.first).to eq(first_post)
1113
+ end
1114
+ end
1115
+ end
1116
+
1117
+ describe "#include?" do
1118
+
1119
+ let(:person) do
1120
+ Person.create
1121
+ end
1122
+
1123
+ let!(:post_one) do
1124
+ Post.create(person_id: person.id)
1125
+ end
1126
+
1127
+ let!(:post_two) do
1128
+ Post.create(person_id: person.id)
1129
+ end
1130
+
1131
+ context "when no criteria exists" do
1132
+
1133
+ context "when the enumerable is loaded" do
1134
+
1135
+ let!(:enumerable) do
1136
+ described_class.new([ post_one, post_two ])
1137
+ end
1138
+
1139
+ let!(:included) do
1140
+ enumerable.include?(post_two)
1141
+ end
1142
+
1143
+ it "returns true" do
1144
+ expect(included).to be true
1145
+ end
1146
+
1147
+ it "retains the correct length" do
1148
+ expect(enumerable.length).to eq(2)
1149
+ end
1150
+
1151
+ it "retains the correct length when calling to_a" do
1152
+ expect(enumerable.to_a.length).to eq(2)
1153
+ end
1154
+ end
1155
+
1156
+ context "when the enumerable contains an added document" do
1157
+
1158
+ let!(:enumerable) do
1159
+ described_class.new([])
1160
+ end
1161
+
1162
+ let(:post_three) do
1163
+ Post.new(person_id: person)
1164
+ end
1165
+
1166
+ before do
1167
+ enumerable.push(post_three)
1168
+ end
1169
+
1170
+ let!(:included) do
1171
+ enumerable.include?(post_three)
1172
+ end
1173
+
1174
+ it "returns true" do
1175
+ expect(included).to be true
1176
+ end
1177
+ end
1178
+ end
1179
+
1180
+ context "when the document is present and not the first" do
1181
+
1182
+ let(:criteria) do
1183
+ Post.where(person_id: person.id)
1184
+ end
1185
+
1186
+ let!(:enumerable) do
1187
+ described_class.new(criteria)
1188
+ end
1189
+
1190
+ let!(:included) do
1191
+ enumerable.include?(post_two)
1192
+ end
1193
+
1194
+ it "returns true" do
1195
+ expect(included).to be true
1196
+ end
1197
+
1198
+ it "retains the correct length" do
1199
+ expect(enumerable.length).to eq(2)
1200
+ end
1201
+
1202
+ it "retains the correct length when calling to_a" do
1203
+ expect(enumerable.to_a.length).to eq(2)
1204
+ end
1205
+
1206
+ context "when iterating over the relation a second time" do
1207
+
1208
+ before do
1209
+ enumerable.each { |post| post }
1210
+ end
1211
+
1212
+ it "retains the correct length" do
1213
+ expect(enumerable.length).to eq(2)
1214
+ end
1215
+
1216
+ it "retains the correct length when calling to_a" do
1217
+ expect(enumerable.to_a.length).to eq(2)
1218
+ end
1219
+ end
1220
+ end
1221
+ end
1222
+
1223
+ describe "#initialize" do
1224
+
1225
+ let(:person) do
1226
+ Person.new
1227
+ end
1228
+
1229
+ context "when provided with a criteria" do
1230
+
1231
+ let(:criteria) do
1232
+ Post.where(person_id: person.id)
1233
+ end
1234
+
1235
+ let(:enumerable) do
1236
+ described_class.new(criteria)
1237
+ end
1238
+
1239
+ it "sets the criteria" do
1240
+ expect(enumerable._unloaded).to eq(criteria)
1241
+ end
1242
+
1243
+ it "is not loaded" do
1244
+ expect(enumerable).to_not be__loaded
1245
+ end
1246
+ end
1247
+
1248
+ context "when provided an array" do
1249
+
1250
+ let(:post) do
1251
+ Post.new
1252
+ end
1253
+
1254
+ let(:enumerable) do
1255
+ described_class.new([ post ])
1256
+ end
1257
+
1258
+ it "does not set a criteria" do
1259
+ expect(enumerable._unloaded).to be_nil
1260
+ end
1261
+
1262
+ it "is loaded" do
1263
+ expect(enumerable).to be__loaded
1264
+ end
1265
+ end
1266
+ end
1267
+
1268
+ describe "#in_memory" do
1269
+
1270
+ let(:person) do
1271
+ Person.new
1272
+ end
1273
+
1274
+ context "when the enumerable is loaded" do
1275
+
1276
+ let(:post) do
1277
+ Post.new
1278
+ end
1279
+
1280
+ let(:enumerable) do
1281
+ described_class.new([ post ])
1282
+ end
1283
+
1284
+ let(:post_two) do
1285
+ Post.new
1286
+ end
1287
+
1288
+ before do
1289
+ enumerable << post_two
1290
+ end
1291
+
1292
+ let(:in_memory) do
1293
+ enumerable.in_memory
1294
+ end
1295
+
1296
+ it "returns the loaded and added docs" do
1297
+ expect(in_memory).to eq([ post, post_two ])
1298
+ end
1299
+ end
1300
+
1301
+ context "when the enumerable is not loaded" do
1302
+
1303
+ let(:post) do
1304
+ Post.new(person_id: person.id)
1305
+ end
1306
+
1307
+ let(:enumerable) do
1308
+ described_class.new(Post.where(person_id: person.id))
1309
+ end
1310
+
1311
+ let(:post_two) do
1312
+ Post.new(person_id: person.id)
1313
+ end
1314
+
1315
+ before do
1316
+ enumerable << post_two
1317
+ end
1318
+
1319
+ let(:in_memory) do
1320
+ enumerable.in_memory
1321
+ end
1322
+
1323
+ it "returns the added docs" do
1324
+ expect(in_memory).to eq([ post_two ])
1325
+ end
1326
+ end
1327
+
1328
+ context "when passed a block" do
1329
+
1330
+ let(:enumerable) do
1331
+ described_class.new(Post.where(person_id: person.id))
1332
+ end
1333
+
1334
+ let(:post_two) do
1335
+ Post.new(person_id: person.id)
1336
+ end
1337
+
1338
+ before do
1339
+ enumerable << post_two
1340
+ end
1341
+
1342
+ it "yields to each in memory document" do
1343
+ enumerable.in_memory do |doc|
1344
+ expect(doc).to eq(post_two)
1345
+ end
1346
+ end
1347
+ end
1348
+ end
1349
+
1350
+ describe "#is_a?" do
1351
+
1352
+ let(:enumerable) do
1353
+ described_class.new(Post.all)
1354
+ end
1355
+
1356
+ context "when checking against enumerable" do
1357
+
1358
+ it "returns true" do
1359
+ expect(enumerable.is_a?(::Enumerable)).to be true
1360
+ end
1361
+ end
1362
+
1363
+ context "when checking against array" do
1364
+
1365
+ it "returns true" do
1366
+ expect(enumerable.is_a?(Array)).to be true
1367
+ end
1368
+ end
1369
+ end
1370
+
1371
+ describe "#last" do
1372
+
1373
+ let(:person) do
1374
+ Person.create
1375
+ end
1376
+
1377
+ context "when the enumerable is not loaded" do
1378
+
1379
+ let(:criteria) do
1380
+ Post.asc(:_id).where(person_id: person.id)
1381
+ end
1382
+
1383
+ let(:enumerable) do
1384
+ described_class.new(criteria)
1385
+ end
1386
+
1387
+ context "when unloaded is not empty" do
1388
+
1389
+ let!(:post) do
1390
+ Post.create(person_id: person.id)
1391
+ end
1392
+
1393
+ let(:last) do
1394
+ enumerable.last
1395
+ end
1396
+
1397
+ it "returns the last unloaded doc" do
1398
+ expect(last).to eq(post)
1399
+ end
1400
+
1401
+ it "does not load the enumerable" do
1402
+ expect(enumerable).to_not be__loaded
1403
+ end
1404
+
1405
+ it "receives query only once" do
1406
+ expect(criteria).to receive(:last).once
1407
+ last
1408
+ end
1409
+ end
1410
+
1411
+ context "when unloaded is empty" do
1412
+
1413
+ let!(:post) do
1414
+ Post.new(person_id: person.id)
1415
+ end
1416
+
1417
+ before do
1418
+ enumerable << post
1419
+ end
1420
+
1421
+ let(:last) do
1422
+ enumerable.last
1423
+ end
1424
+
1425
+ it "returns the last unloaded doc" do
1426
+ expect(last).to eq(post)
1427
+ end
1428
+
1429
+ it "does not load the enumerable" do
1430
+ expect(enumerable).to_not be__loaded
1431
+ end
1432
+ end
1433
+
1434
+ context "when unloaded and added are empty" do
1435
+
1436
+ let(:last) do
1437
+ enumerable.last
1438
+ end
1439
+
1440
+ it "returns nil" do
1441
+ expect(last).to be_nil
1442
+ end
1443
+
1444
+ it "does not load the enumerable" do
1445
+ expect(enumerable).to_not be__loaded
1446
+ end
1447
+ end
1448
+
1449
+ context "when added is not empty" do
1450
+
1451
+ let!(:post_one) do
1452
+ person.posts.create
1453
+ end
1454
+
1455
+ let!(:post_two) do
1456
+ person.posts.create
1457
+ end
1458
+
1459
+ let(:last) do
1460
+ enumerable.last
1461
+ end
1462
+
1463
+ context "when accessing from a reloaded child" do
1464
+
1465
+ it "returns the last document" do
1466
+ expect(post_one.reload.person.posts.asc(:_id).last).to eq(post_two)
1467
+ end
1468
+ end
1469
+ end
1470
+ end
1471
+
1472
+ context "when the enumerable is loaded" do
1473
+
1474
+ context "when loaded is not empty" do
1475
+
1476
+ let!(:post) do
1477
+ Post.create(person_id: person.id)
1478
+ end
1479
+
1480
+ let(:enumerable) do
1481
+ described_class.new([ post ])
1482
+ end
1483
+
1484
+ let(:last) do
1485
+ enumerable.last
1486
+ end
1487
+
1488
+ it "returns the last loaded doc" do
1489
+ expect(last).to eq(post)
1490
+ end
1491
+ end
1492
+
1493
+ context "when loaded is empty" do
1494
+
1495
+ let!(:post) do
1496
+ Post.create(person_id: person.id)
1497
+ end
1498
+
1499
+ let(:enumerable) do
1500
+ described_class.new([])
1501
+ end
1502
+
1503
+ before do
1504
+ enumerable << post
1505
+ end
1506
+
1507
+ let(:last) do
1508
+ enumerable.last
1509
+ end
1510
+
1511
+ it "returns the last added doc" do
1512
+ expect(last).to eq(post)
1513
+ end
1514
+ end
1515
+
1516
+ context "when loaded and added are empty" do
1517
+
1518
+ let(:enumerable) do
1519
+ described_class.new([])
1520
+ end
1521
+
1522
+ let(:last) do
1523
+ enumerable.last
1524
+ end
1525
+
1526
+ it "returns nil" do
1527
+ expect(last).to be_nil
1528
+ end
1529
+ end
1530
+ end
1531
+
1532
+ context 'when the id_sort option is none' do
1533
+
1534
+ let(:person) do
1535
+ Person.create
1536
+ end
1537
+
1538
+ let(:criteria) do
1539
+ Post.where(person_id: person.id)
1540
+ end
1541
+
1542
+ let(:enumerable) do
1543
+ described_class.new(criteria)
1544
+ end
1545
+
1546
+ let!(:first_post) do
1547
+ person.posts.create(title: "One")
1548
+ end
1549
+
1550
+ let!(:second_post) do
1551
+ person.posts.create(title: "Two")
1552
+ end
1553
+
1554
+ it 'does not use the sort on id' do
1555
+ expect(enumerable.last(id_sort: :none)).to eq(first_post)
1556
+ end
1557
+ end
1558
+
1559
+ context 'when the id_sort option is not provided' do
1560
+
1561
+ let(:person) do
1562
+ Person.create
1563
+ end
1564
+
1565
+ let(:criteria) do
1566
+ Post.where(person_id: person.id)
1567
+ end
1568
+
1569
+ let(:enumerable) do
1570
+ described_class.new(criteria)
1571
+ end
1572
+
1573
+ let!(:first_post) do
1574
+ person.posts.create(title: "One")
1575
+ end
1576
+
1577
+ let!(:second_post) do
1578
+ person.posts.create(title: "Two")
1579
+ end
1580
+
1581
+ it 'uses the sort on id' do
1582
+ expect(enumerable.last).to eq(second_post)
1583
+ end
1584
+ end
1585
+ end
1586
+
1587
+ describe "#kind_of?" do
1588
+
1589
+ let(:enumerable) do
1590
+ described_class.new(Post.all)
1591
+ end
1592
+
1593
+ context "when checking against enumerable" do
1594
+
1595
+ it "returns true" do
1596
+ expect(enumerable.kind_of?(::Enumerable)).to be true
1597
+ end
1598
+ end
1599
+
1600
+ context "when checking against array" do
1601
+
1602
+ it "returns true" do
1603
+ expect(enumerable.kind_of?(Array)).to be true
1604
+ end
1605
+ end
1606
+ end
1607
+
1608
+ describe "#load_all!" do
1609
+
1610
+ let(:person) do
1611
+ Person.create
1612
+ end
1613
+
1614
+ let!(:post) do
1615
+ Post.create(person_id: person.id)
1616
+ end
1617
+
1618
+ let(:criteria) do
1619
+ Post.where(person_id: person.id)
1620
+ end
1621
+
1622
+ let!(:enumerable) do
1623
+ described_class.new(criteria)
1624
+ end
1625
+
1626
+ let!(:loaded) do
1627
+ enumerable.load_all!
1628
+ end
1629
+
1630
+ it "loads all the unloaded documents" do
1631
+ expect(enumerable._loaded).to eq({ post.id => post })
1632
+ end
1633
+
1634
+ it "returns the object" do
1635
+ expect(loaded).to eq([post])
1636
+ end
1637
+
1638
+ it "sets loaded to true" do
1639
+ expect(enumerable).to be__loaded
1640
+ end
1641
+ end
1642
+
1643
+ describe "#reset" do
1644
+
1645
+ let(:person) do
1646
+ Person.create
1647
+ end
1648
+
1649
+ let(:post) do
1650
+ Post.create(person_id: person.id)
1651
+ end
1652
+
1653
+ let(:post_two) do
1654
+ Post.create(person_id: person.id)
1655
+ end
1656
+
1657
+ let(:enumerable) do
1658
+ described_class.new([ post ])
1659
+ end
1660
+
1661
+ before do
1662
+ enumerable << post_two
1663
+ end
1664
+
1665
+ let!(:reset) do
1666
+ enumerable.reset
1667
+ end
1668
+
1669
+ it "is not loaded" do
1670
+ expect(enumerable).to_not be__loaded
1671
+ end
1672
+
1673
+ it "clears out the loaded docs" do
1674
+ expect(enumerable._loaded).to be_empty
1675
+ end
1676
+
1677
+ it "clears out the added docs" do
1678
+ expect(enumerable._added).to be_empty
1679
+ end
1680
+ end
1681
+
1682
+ describe "#respond_to?" do
1683
+
1684
+ let(:enumerable) do
1685
+ described_class.new([])
1686
+ end
1687
+
1688
+ context "when checking against array methods" do
1689
+
1690
+ [].methods.each do |method|
1691
+
1692
+ it "returns true for #{method}" do
1693
+ expect(enumerable).to respond_to(method)
1694
+ end
1695
+ end
1696
+ end
1697
+ end
1698
+
1699
+ describe "#size" do
1700
+
1701
+ let(:person) do
1702
+ Person.create
1703
+ end
1704
+
1705
+ let!(:post) do
1706
+ Post.create(person_id: person.id)
1707
+ end
1708
+
1709
+ context "when the base is new" do
1710
+
1711
+ let!(:person) do
1712
+ Person.new
1713
+ end
1714
+
1715
+ context "when the added contains a persisted document" do
1716
+
1717
+ let!(:post) do
1718
+ Post.create(person_id: person.id)
1719
+ end
1720
+
1721
+ context "when the enumerable is not loaded" do
1722
+
1723
+ let(:enumerable) do
1724
+ described_class.new(Post.where(person_id: person.id))
1725
+ end
1726
+
1727
+ it "includes the number of all added documents" do
1728
+ expect(enumerable.size).to eq(1)
1729
+ end
1730
+ end
1731
+ end
1732
+ end
1733
+
1734
+ context "when the enumerable is loaded" do
1735
+
1736
+ let(:enumerable) do
1737
+ described_class.new([ post ])
1738
+ end
1739
+
1740
+ let(:post_two) do
1741
+ Post.new(person_id: person.id)
1742
+ end
1743
+
1744
+ before do
1745
+ enumerable << post_two
1746
+ end
1747
+
1748
+ let(:size) do
1749
+ enumerable.size
1750
+ end
1751
+
1752
+ it "returns the loaded size plus added size" do
1753
+ expect(size).to eq(2)
1754
+ end
1755
+
1756
+ it "matches the size of the loaded enumerable" do
1757
+ expect(size).to eq(enumerable.to_a.size)
1758
+ end
1759
+ end
1760
+
1761
+ context "when the enumerable is not loaded" do
1762
+
1763
+ let(:enumerable) do
1764
+ described_class.new(Post.where(person_id: person.id))
1765
+ end
1766
+
1767
+ context "when the added contains new documents" do
1768
+
1769
+ let(:post_two) do
1770
+ Post.new(person_id: person.id)
1771
+ end
1772
+
1773
+ before do
1774
+ enumerable << post_two
1775
+ end
1776
+
1777
+ let(:size) do
1778
+ enumerable.size
1779
+ end
1780
+
1781
+ it "returns the unloaded count plus added new size" do
1782
+ expect(size).to eq(2)
1783
+ end
1784
+ end
1785
+
1786
+ context "when the added contains persisted documents" do
1787
+
1788
+ let(:post_two) do
1789
+ Post.create(person_id: person.id)
1790
+ end
1791
+
1792
+ before do
1793
+ enumerable << post_two
1794
+ end
1795
+
1796
+ let(:size) do
1797
+ enumerable.size
1798
+ end
1799
+
1800
+ it "returns the unloaded count plus added new size" do
1801
+ expect(size).to eq(2)
1802
+ end
1803
+ end
1804
+ end
1805
+ end
1806
+
1807
+ describe "#to_json" do
1808
+
1809
+ let(:person) do
1810
+ Person.create
1811
+ end
1812
+
1813
+ let!(:post) do
1814
+ Post.create(title: "test", person_id: person.id)
1815
+ end
1816
+
1817
+ let(:criteria) do
1818
+ Post.where(person_id: person.id)
1819
+ end
1820
+
1821
+ let!(:enumerable) do
1822
+ described_class.new(criteria)
1823
+ end
1824
+
1825
+ before do
1826
+ enumerable << post
1827
+ end
1828
+
1829
+ let!(:json) do
1830
+ enumerable.to_json
1831
+ end
1832
+
1833
+ it "serializes the enumerable" do
1834
+ expect(json).to include(post.title)
1835
+ end
1836
+ end
1837
+
1838
+ describe "#to_json(parameters)" do
1839
+
1840
+ let(:person) do
1841
+ Person.create
1842
+ end
1843
+
1844
+ let!(:post) do
1845
+ Post.create(title: "test", person_id: person.id)
1846
+ end
1847
+
1848
+ let(:criteria) do
1849
+ Post.where(person_id: person.id)
1850
+ end
1851
+
1852
+ let!(:json) do
1853
+ person.posts.to_json({except: 'title'})
1854
+ end
1855
+
1856
+ it "serializes the enumerable" do
1857
+ expect(json).to_not include(post.title)
1858
+ end
1859
+ end
1860
+
1861
+ describe "#as_json" do
1862
+
1863
+ let(:person) do
1864
+ Person.create
1865
+ end
1866
+
1867
+ let!(:post) do
1868
+ Post.create(title: "test", person_id: person.id)
1869
+ end
1870
+
1871
+ let(:criteria) do
1872
+ Post.where(person_id: person.id)
1873
+ end
1874
+
1875
+ let!(:enumerable) do
1876
+ described_class.new(criteria)
1877
+ end
1878
+
1879
+ before do
1880
+ enumerable << post
1881
+ end
1882
+
1883
+ let!(:json) do
1884
+ enumerable.as_json
1885
+ end
1886
+
1887
+ it "serializes the enumerable" do
1888
+ expect(json.size).to eq(1)
1889
+ expect(json[0]['title']).to eq(post.title)
1890
+ end
1891
+ end
1892
+
1893
+ describe "#as_json(parameters)" do
1894
+
1895
+ let(:person) do
1896
+ Person.create
1897
+ end
1898
+
1899
+ let!(:post) do
1900
+ Post.create(title: "test", person_id: person.id)
1901
+ end
1902
+
1903
+ let(:criteria) do
1904
+ Post.where(person_id: person.id)
1905
+ end
1906
+
1907
+ let!(:json) do
1908
+ person.posts.as_json({except: "title"})
1909
+ end
1910
+
1911
+ it "serializes the enumerable" do
1912
+ expect(json.size).to eq(1)
1913
+ end
1914
+
1915
+ it "includes the proper fields" do
1916
+ expect(json[0].keys).to_not include("title")
1917
+ end
1918
+ end
1919
+
1920
+ describe "#uniq" do
1921
+
1922
+ let(:person) do
1923
+ Person.create
1924
+ end
1925
+
1926
+ let!(:post) do
1927
+ Post.create(person_id: person.id)
1928
+ end
1929
+
1930
+ let(:criteria) do
1931
+ Post.where(person_id: person.id)
1932
+ end
1933
+
1934
+ let!(:enumerable) do
1935
+ described_class.new(criteria)
1936
+ end
1937
+
1938
+ before do
1939
+ enumerable << post
1940
+ enumerable._loaded[post.id] = post
1941
+ end
1942
+
1943
+ let!(:uniq) do
1944
+ enumerable.uniq
1945
+ end
1946
+
1947
+ it "returns the unique documents" do
1948
+ expect(uniq).to eq([ post ])
1949
+ end
1950
+
1951
+ it "sets loaded to true" do
1952
+ expect(enumerable).to be__loaded
1953
+ end
1954
+ end
1955
+
1956
+ describe 'setting the same parent object on enumerated children objects' do
1957
+
1958
+ let(:person) do
1959
+ Person.create
1960
+ end
1961
+
1962
+ context 'when a single child is fetched' do
1963
+
1964
+ let!(:post) do
1965
+ person.posts << Post.new
1966
+ person.posts.first
1967
+ end
1968
+
1969
+ it 'does not query the database to access the parent' do
1970
+ expect_query(0) do
1971
+ expect(post.person).to eq(person)
1972
+ end
1973
+ end
1974
+ end
1975
+
1976
+ context 'when a single child is fetched with a scope' do
1977
+
1978
+ let!(:post) do
1979
+ person.posts << Post.new(title: 'open')
1980
+ person.posts.open.first
1981
+ end
1982
+
1983
+ it 'does not query the database to access the parent' do
1984
+ expect_query(0) do
1985
+ expect(post.person).to eq(person)
1986
+ end
1987
+ end
1988
+ end
1989
+
1990
+ context 'when multiple children are fetched' do
1991
+
1992
+ let!(:posts) do
1993
+ person.posts << Post.new
1994
+ person.posts << Post.new
1995
+ person.posts << Post.new
1996
+ person.posts.to_a
1997
+ end
1998
+
1999
+ it 'does not query the database to access the parent' do
2000
+ expect_query(0) do
2001
+ expect(posts.all? { |post| post.person == person }).to be(true)
2002
+ end
2003
+ end
2004
+ end
2005
+
2006
+ context 'when multiple children are fetched with query criteria' do
2007
+
2008
+ let!(:posts) do
2009
+ person.posts << Post.new(title: 'open')
2010
+ person.posts << Post.new(title: 'open')
2011
+ person.posts << Post.new(title: 'not-a-test')
2012
+ person.posts.where(title: 'open').to_a
2013
+ end
2014
+
2015
+ it 'does not query the database to access the parent' do
2016
+ expect_query(0) do
2017
+ expect(posts.all? { |post| post.person == person }).to be(true)
2018
+ end
2019
+ end
2020
+ end
2021
+
2022
+ context 'when multiple children are fetched with a scope' do
2023
+
2024
+ let!(:posts) do
2025
+ person.posts << Post.new(title: 'open')
2026
+ person.posts << Post.new(title: 'open')
2027
+ person.posts << Post.new(title: 'not-a-test')
2028
+ person.posts.open.to_a
2029
+ end
2030
+
2031
+ it 'does not query the database to access the parent' do
2032
+ expect_query(0) do
2033
+ expect(posts.all? { |post| post.person == person }).to be(true)
2034
+ end
2035
+ end
2036
+ end
2037
+
2038
+ context 'when the parent is updated in memory' do
2039
+
2040
+ let!(:posts) do
2041
+ person.posts << Post.new
2042
+ person.posts << Post.new
2043
+ person.username = 'emily'
2044
+ person.posts.to_a
2045
+ end
2046
+
2047
+ it 'does not query the database to access the parent' do
2048
+ expect_query(0) do
2049
+ expect(posts.all? { |post| post.person.username == 'emily' }).to be(true)
2050
+ end
2051
+ end
2052
+ end
2053
+ end
2054
+ end