mongoid 6.4.8 → 7.5.4

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