mongoid 5.4.1 → 7.4.0

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