mongoid_rails4 4.0.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 (659) hide show
  1. checksums.yaml +7 -0
  2. data/CHANGELOG.md +3213 -0
  3. data/LICENSE +20 -0
  4. data/README.md +62 -0
  5. data/Rakefile +35 -0
  6. data/lib/config/locales/en.yml +448 -0
  7. data/lib/mongoid.rb +104 -0
  8. data/lib/mongoid/atomic.rb +384 -0
  9. data/lib/mongoid/atomic/modifiers.rb +317 -0
  10. data/lib/mongoid/atomic/paths.rb +3 -0
  11. data/lib/mongoid/atomic/paths/embedded.rb +28 -0
  12. data/lib/mongoid/atomic/paths/embedded/many.rb +44 -0
  13. data/lib/mongoid/atomic/paths/embedded/one.rb +43 -0
  14. data/lib/mongoid/atomic/paths/root.rb +39 -0
  15. data/lib/mongoid/attributes.rb +284 -0
  16. data/lib/mongoid/attributes/dynamic.rb +154 -0
  17. data/lib/mongoid/attributes/nested.rb +82 -0
  18. data/lib/mongoid/attributes/processing.rb +147 -0
  19. data/lib/mongoid/attributes/readonly.rb +56 -0
  20. data/lib/mongoid/changeable.rb +379 -0
  21. data/lib/mongoid/composable.rb +104 -0
  22. data/lib/mongoid/config.rb +263 -0
  23. data/lib/mongoid/config/environment.rb +44 -0
  24. data/lib/mongoid/config/options.rb +74 -0
  25. data/lib/mongoid/config/validators.rb +3 -0
  26. data/lib/mongoid/config/validators/option.rb +25 -0
  27. data/lib/mongoid/config/validators/session.rb +140 -0
  28. data/lib/mongoid/contextual.rb +54 -0
  29. data/lib/mongoid/contextual/aggregable/memory.rb +109 -0
  30. data/lib/mongoid/contextual/aggregable/mongo.rb +147 -0
  31. data/lib/mongoid/contextual/atomic.rb +180 -0
  32. data/lib/mongoid/contextual/command.rb +61 -0
  33. data/lib/mongoid/contextual/eager.rb +158 -0
  34. data/lib/mongoid/contextual/find_and_modify.rb +69 -0
  35. data/lib/mongoid/contextual/geo_near.rb +238 -0
  36. data/lib/mongoid/contextual/map_reduce.rb +324 -0
  37. data/lib/mongoid/contextual/memory.rb +440 -0
  38. data/lib/mongoid/contextual/mongo.rb +676 -0
  39. data/lib/mongoid/contextual/queryable.rb +25 -0
  40. data/lib/mongoid/contextual/text_search.rb +180 -0
  41. data/lib/mongoid/copyable.rb +67 -0
  42. data/lib/mongoid/criteria.rb +562 -0
  43. data/lib/mongoid/criteria/findable.rb +179 -0
  44. data/lib/mongoid/criteria/inspectable.rb +25 -0
  45. data/lib/mongoid/criteria/marshalable.rb +50 -0
  46. data/lib/mongoid/criteria/modifiable.rb +189 -0
  47. data/lib/mongoid/criteria/scopable.rb +158 -0
  48. data/lib/mongoid/document.rb +361 -0
  49. data/lib/mongoid/equality.rb +66 -0
  50. data/lib/mongoid/errors.rb +40 -0
  51. data/lib/mongoid/errors/ambiguous_relationship.rb +51 -0
  52. data/lib/mongoid/errors/callback.rb +25 -0
  53. data/lib/mongoid/errors/delete_restriction.rb +29 -0
  54. data/lib/mongoid/errors/document_not_found.rb +111 -0
  55. data/lib/mongoid/errors/eager_load.rb +22 -0
  56. data/lib/mongoid/errors/invalid_collection.rb +18 -0
  57. data/lib/mongoid/errors/invalid_config_option.rb +27 -0
  58. data/lib/mongoid/errors/invalid_field.rb +64 -0
  59. data/lib/mongoid/errors/invalid_field_option.rb +35 -0
  60. data/lib/mongoid/errors/invalid_find.rb +19 -0
  61. data/lib/mongoid/errors/invalid_includes.rb +32 -0
  62. data/lib/mongoid/errors/invalid_index.rb +28 -0
  63. data/lib/mongoid/errors/invalid_options.rb +28 -0
  64. data/lib/mongoid/errors/invalid_path.rb +21 -0
  65. data/lib/mongoid/errors/invalid_scope.rb +24 -0
  66. data/lib/mongoid/errors/invalid_set_polymorphic_relation.rb +38 -0
  67. data/lib/mongoid/errors/invalid_storage_options.rb +27 -0
  68. data/lib/mongoid/errors/invalid_time.rb +22 -0
  69. data/lib/mongoid/errors/inverse_not_found.rb +29 -0
  70. data/lib/mongoid/errors/mixed_relations.rb +32 -0
  71. data/lib/mongoid/errors/mixed_session_configuration.rb +28 -0
  72. data/lib/mongoid/errors/mongoid_error.rb +92 -0
  73. data/lib/mongoid/errors/nested_attributes_metadata_not_found.rb +28 -0
  74. data/lib/mongoid/errors/no_default_session.rb +23 -0
  75. data/lib/mongoid/errors/no_environment.rb +19 -0
  76. data/lib/mongoid/errors/no_map_reduce_output.rb +24 -0
  77. data/lib/mongoid/errors/no_metadata.rb +21 -0
  78. data/lib/mongoid/errors/no_parent.rb +24 -0
  79. data/lib/mongoid/errors/no_session_config.rb +22 -0
  80. data/lib/mongoid/errors/no_session_database.rb +27 -0
  81. data/lib/mongoid/errors/no_session_hosts.rb +27 -0
  82. data/lib/mongoid/errors/no_sessions_config.rb +20 -0
  83. data/lib/mongoid/errors/readonly_attribute.rb +25 -0
  84. data/lib/mongoid/errors/scope_overwrite.rb +21 -0
  85. data/lib/mongoid/errors/too_many_nested_attribute_records.rb +20 -0
  86. data/lib/mongoid/errors/unknown_attribute.rb +25 -0
  87. data/lib/mongoid/errors/unsaved_document.rb +19 -0
  88. data/lib/mongoid/errors/unsupported_javascript.rb +27 -0
  89. data/lib/mongoid/errors/validations.rb +29 -0
  90. data/lib/mongoid/evolvable.rb +19 -0
  91. data/lib/mongoid/extensions.rb +35 -0
  92. data/lib/mongoid/extensions/array.rb +180 -0
  93. data/lib/mongoid/extensions/big_decimal.rb +69 -0
  94. data/lib/mongoid/extensions/boolean.rb +21 -0
  95. data/lib/mongoid/extensions/date.rb +77 -0
  96. data/lib/mongoid/extensions/date_time.rb +73 -0
  97. data/lib/mongoid/extensions/false_class.rb +38 -0
  98. data/lib/mongoid/extensions/float.rb +56 -0
  99. data/lib/mongoid/extensions/hash.rb +209 -0
  100. data/lib/mongoid/extensions/integer.rb +67 -0
  101. data/lib/mongoid/extensions/module.rb +28 -0
  102. data/lib/mongoid/extensions/nil_class.rb +33 -0
  103. data/lib/mongoid/extensions/object.rb +274 -0
  104. data/lib/mongoid/extensions/object_id.rb +54 -0
  105. data/lib/mongoid/extensions/range.rb +79 -0
  106. data/lib/mongoid/extensions/regexp.rb +27 -0
  107. data/lib/mongoid/extensions/set.rb +55 -0
  108. data/lib/mongoid/extensions/string.rb +199 -0
  109. data/lib/mongoid/extensions/symbol.rb +54 -0
  110. data/lib/mongoid/extensions/time.rb +88 -0
  111. data/lib/mongoid/extensions/time_with_zone.rb +56 -0
  112. data/lib/mongoid/extensions/true_class.rb +38 -0
  113. data/lib/mongoid/factory.rb +46 -0
  114. data/lib/mongoid/fields.rb +542 -0
  115. data/lib/mongoid/fields/foreign_key.rb +174 -0
  116. data/lib/mongoid/fields/localized.rb +73 -0
  117. data/lib/mongoid/fields/standard.rb +273 -0
  118. data/lib/mongoid/fields/validators.rb +2 -0
  119. data/lib/mongoid/fields/validators/macro.rb +92 -0
  120. data/lib/mongoid/findable.rb +133 -0
  121. data/lib/mongoid/identity_map.rb +163 -0
  122. data/lib/mongoid/indexable.rb +147 -0
  123. data/lib/mongoid/indexable/specification.rb +115 -0
  124. data/lib/mongoid/indexable/validators/options.rb +103 -0
  125. data/lib/mongoid/inspectable.rb +59 -0
  126. data/lib/mongoid/interceptable.rb +265 -0
  127. data/lib/mongoid/loggable.rb +69 -0
  128. data/lib/mongoid/matchable.rb +152 -0
  129. data/lib/mongoid/matchable/all.rb +27 -0
  130. data/lib/mongoid/matchable/and.rb +30 -0
  131. data/lib/mongoid/matchable/default.rb +72 -0
  132. data/lib/mongoid/matchable/exists.rb +23 -0
  133. data/lib/mongoid/matchable/gt.rb +21 -0
  134. data/lib/mongoid/matchable/gte.rb +21 -0
  135. data/lib/mongoid/matchable/in.rb +24 -0
  136. data/lib/mongoid/matchable/lt.rb +21 -0
  137. data/lib/mongoid/matchable/lte.rb +21 -0
  138. data/lib/mongoid/matchable/ne.rb +21 -0
  139. data/lib/mongoid/matchable/nin.rb +21 -0
  140. data/lib/mongoid/matchable/or.rb +33 -0
  141. data/lib/mongoid/matchable/size.rb +21 -0
  142. data/lib/mongoid/persistable.rb +207 -0
  143. data/lib/mongoid/persistable/creatable.rb +189 -0
  144. data/lib/mongoid/persistable/deletable.rb +149 -0
  145. data/lib/mongoid/persistable/destroyable.rb +55 -0
  146. data/lib/mongoid/persistable/incrementable.rb +36 -0
  147. data/lib/mongoid/persistable/logical.rb +38 -0
  148. data/lib/mongoid/persistable/poppable.rb +39 -0
  149. data/lib/mongoid/persistable/pullable.rb +55 -0
  150. data/lib/mongoid/persistable/pushable.rb +62 -0
  151. data/lib/mongoid/persistable/renamable.rb +35 -0
  152. data/lib/mongoid/persistable/savable.rb +52 -0
  153. data/lib/mongoid/persistable/settable.rb +33 -0
  154. data/lib/mongoid/persistable/unsettable.rb +36 -0
  155. data/lib/mongoid/persistable/updatable.rb +151 -0
  156. data/lib/mongoid/persistable/upsertable.rb +55 -0
  157. data/lib/mongoid/positional.rb +71 -0
  158. data/lib/mongoid/railtie.rb +156 -0
  159. data/lib/mongoid/railties/database.rake +97 -0
  160. data/lib/mongoid/railties/document.rb +12 -0
  161. data/lib/mongoid/relations.rb +162 -0
  162. data/lib/mongoid/relations/accessors.rb +299 -0
  163. data/lib/mongoid/relations/auto_save.rb +106 -0
  164. data/lib/mongoid/relations/binding.rb +218 -0
  165. data/lib/mongoid/relations/bindings.rb +9 -0
  166. data/lib/mongoid/relations/bindings/embedded/in.rb +63 -0
  167. data/lib/mongoid/relations/bindings/embedded/many.rb +50 -0
  168. data/lib/mongoid/relations/bindings/embedded/one.rb +55 -0
  169. data/lib/mongoid/relations/bindings/referenced/in.rb +65 -0
  170. data/lib/mongoid/relations/bindings/referenced/many.rb +42 -0
  171. data/lib/mongoid/relations/bindings/referenced/many_to_many.rb +67 -0
  172. data/lib/mongoid/relations/bindings/referenced/one.rb +44 -0
  173. data/lib/mongoid/relations/builder.rb +57 -0
  174. data/lib/mongoid/relations/builders.rb +104 -0
  175. data/lib/mongoid/relations/builders/embedded/in.rb +29 -0
  176. data/lib/mongoid/relations/builders/embedded/many.rb +36 -0
  177. data/lib/mongoid/relations/builders/embedded/one.rb +30 -0
  178. data/lib/mongoid/relations/builders/nested_attributes/many.rb +174 -0
  179. data/lib/mongoid/relations/builders/nested_attributes/one.rb +126 -0
  180. data/lib/mongoid/relations/builders/referenced/in.rb +26 -0
  181. data/lib/mongoid/relations/builders/referenced/many.rb +27 -0
  182. data/lib/mongoid/relations/builders/referenced/many_to_many.rb +40 -0
  183. data/lib/mongoid/relations/builders/referenced/one.rb +26 -0
  184. data/lib/mongoid/relations/cascading.rb +56 -0
  185. data/lib/mongoid/relations/cascading/delete.rb +44 -0
  186. data/lib/mongoid/relations/cascading/destroy.rb +43 -0
  187. data/lib/mongoid/relations/cascading/nullify.rb +35 -0
  188. data/lib/mongoid/relations/cascading/restrict.rb +39 -0
  189. data/lib/mongoid/relations/constraint.rb +49 -0
  190. data/lib/mongoid/relations/conversions.rb +34 -0
  191. data/lib/mongoid/relations/counter_cache.rb +105 -0
  192. data/lib/mongoid/relations/cyclic.rb +107 -0
  193. data/lib/mongoid/relations/embedded/batchable.rb +355 -0
  194. data/lib/mongoid/relations/embedded/in.rb +231 -0
  195. data/lib/mongoid/relations/embedded/many.rb +639 -0
  196. data/lib/mongoid/relations/embedded/one.rb +223 -0
  197. data/lib/mongoid/relations/macros.rb +356 -0
  198. data/lib/mongoid/relations/many.rb +208 -0
  199. data/lib/mongoid/relations/marshalable.rb +32 -0
  200. data/lib/mongoid/relations/metadata.rb +1174 -0
  201. data/lib/mongoid/relations/nested_builder.rb +74 -0
  202. data/lib/mongoid/relations/one.rb +48 -0
  203. data/lib/mongoid/relations/options.rb +48 -0
  204. data/lib/mongoid/relations/polymorphic.rb +39 -0
  205. data/lib/mongoid/relations/proxy.rb +270 -0
  206. data/lib/mongoid/relations/referenced/in.rb +297 -0
  207. data/lib/mongoid/relations/referenced/many.rb +787 -0
  208. data/lib/mongoid/relations/referenced/many_to_many.rb +486 -0
  209. data/lib/mongoid/relations/referenced/one.rb +290 -0
  210. data/lib/mongoid/relations/reflections.rb +62 -0
  211. data/lib/mongoid/relations/synchronization.rb +169 -0
  212. data/lib/mongoid/relations/targets.rb +2 -0
  213. data/lib/mongoid/relations/targets/enumerable.rb +473 -0
  214. data/lib/mongoid/relations/touchable.rb +94 -0
  215. data/lib/mongoid/reloadable.rb +95 -0
  216. data/lib/mongoid/scopable.rb +379 -0
  217. data/lib/mongoid/selectable.rb +59 -0
  218. data/lib/mongoid/serializable.rb +170 -0
  219. data/lib/mongoid/sessions.rb +330 -0
  220. data/lib/mongoid/sessions/factory.rb +129 -0
  221. data/lib/mongoid/sessions/mongo_uri.rb +93 -0
  222. data/lib/mongoid/sessions/options.rb +141 -0
  223. data/lib/mongoid/sessions/validators.rb +2 -0
  224. data/lib/mongoid/sessions/validators/storage.rb +49 -0
  225. data/lib/mongoid/shardable.rb +65 -0
  226. data/lib/mongoid/state.rb +97 -0
  227. data/lib/mongoid/threaded.rb +383 -0
  228. data/lib/mongoid/threaded/lifecycle.rb +164 -0
  229. data/lib/mongoid/timestamps.rb +15 -0
  230. data/lib/mongoid/timestamps/created.rb +30 -0
  231. data/lib/mongoid/timestamps/created/short.rb +19 -0
  232. data/lib/mongoid/timestamps/short.rb +10 -0
  233. data/lib/mongoid/timestamps/updated.rb +39 -0
  234. data/lib/mongoid/timestamps/updated/short.rb +19 -0
  235. data/lib/mongoid/traversable.rb +192 -0
  236. data/lib/mongoid/unit_of_work.rb +61 -0
  237. data/lib/mongoid/validatable.rb +180 -0
  238. data/lib/mongoid/validatable/associated.rb +48 -0
  239. data/lib/mongoid/validatable/format.rb +20 -0
  240. data/lib/mongoid/validatable/length.rb +20 -0
  241. data/lib/mongoid/validatable/localizable.rb +30 -0
  242. data/lib/mongoid/validatable/macros.rb +94 -0
  243. data/lib/mongoid/validatable/presence.rb +86 -0
  244. data/lib/mongoid/validatable/queryable.rb +30 -0
  245. data/lib/mongoid/validatable/uniqueness.rb +330 -0
  246. data/lib/mongoid/version.rb +4 -0
  247. data/lib/rack/mongoid.rb +2 -0
  248. data/lib/rack/mongoid/middleware/identity_map.rb +39 -0
  249. data/lib/rails/generators/mongoid/config/config_generator.rb +25 -0
  250. data/lib/rails/generators/mongoid/config/templates/mongoid.yml +76 -0
  251. data/lib/rails/generators/mongoid/model/model_generator.rb +25 -0
  252. data/lib/rails/generators/mongoid/model/templates/model.rb.tt +19 -0
  253. data/lib/rails/generators/mongoid/observer/observer_generator.rb +17 -0
  254. data/lib/rails/generators/mongoid/observer/templates/observer.rb.tt +4 -0
  255. data/lib/rails/generators/mongoid_generator.rb +65 -0
  256. data/lib/rails/mongoid.rb +180 -0
  257. data/lib/support/ruby_version.rb +26 -0
  258. data/spec/app/models/account.rb +28 -0
  259. data/spec/app/models/acolyte.rb +17 -0
  260. data/spec/app/models/actor.rb +18 -0
  261. data/spec/app/models/actress.rb +2 -0
  262. data/spec/app/models/address.rb +77 -0
  263. data/spec/app/models/address_component.rb +5 -0
  264. data/spec/app/models/address_number.rb +6 -0
  265. data/spec/app/models/agency.rb +5 -0
  266. data/spec/app/models/agent.rb +12 -0
  267. data/spec/app/models/album.rb +14 -0
  268. data/spec/app/models/alert.rb +5 -0
  269. data/spec/app/models/animal.rb +25 -0
  270. data/spec/app/models/answer.rb +4 -0
  271. data/spec/app/models/appointment.rb +7 -0
  272. data/spec/app/models/article.rb +10 -0
  273. data/spec/app/models/artist.rb +66 -0
  274. data/spec/app/models/artwork.rb +4 -0
  275. data/spec/app/models/audio.rb +5 -0
  276. data/spec/app/models/augmentation.rb +11 -0
  277. data/spec/app/models/author.rb +4 -0
  278. data/spec/app/models/band.rb +26 -0
  279. data/spec/app/models/bar.rb +10 -0
  280. data/spec/app/models/basic.rb +6 -0
  281. data/spec/app/models/bed.rb +1 -0
  282. data/spec/app/models/big_palette.rb +2 -0
  283. data/spec/app/models/birthday.rb +13 -0
  284. data/spec/app/models/book.rb +13 -0
  285. data/spec/app/models/breed.rb +4 -0
  286. data/spec/app/models/browser.rb +6 -0
  287. data/spec/app/models/building.rb +5 -0
  288. data/spec/app/models/building_address.rb +5 -0
  289. data/spec/app/models/bus.rb +7 -0
  290. data/spec/app/models/business.rb +5 -0
  291. data/spec/app/models/callback_recorder.rb +25 -0
  292. data/spec/app/models/callback_test.rb +9 -0
  293. data/spec/app/models/canvas.rb +25 -0
  294. data/spec/app/models/car.rb +1 -0
  295. data/spec/app/models/cat.rb +8 -0
  296. data/spec/app/models/category.rb +8 -0
  297. data/spec/app/models/child.rb +4 -0
  298. data/spec/app/models/child_doc.rb +22 -0
  299. data/spec/app/models/church.rb +4 -0
  300. data/spec/app/models/circle.rb +3 -0
  301. data/spec/app/models/circuit.rb +4 -0
  302. data/spec/app/models/circus.rb +7 -0
  303. data/spec/app/models/code.rb +5 -0
  304. data/spec/app/models/comment.rb +16 -0
  305. data/spec/app/models/contractor.rb +5 -0
  306. data/spec/app/models/cookie.rb +6 -0
  307. data/spec/app/models/country_code.rb +8 -0
  308. data/spec/app/models/definition.rb +7 -0
  309. data/spec/app/models/description.rb +11 -0
  310. data/spec/app/models/dictionary.rb +10 -0
  311. data/spec/app/models/division.rb +10 -0
  312. data/spec/app/models/doctor.rb +12 -0
  313. data/spec/app/models/dog.rb +7 -0
  314. data/spec/app/models/dokument.rb +5 -0
  315. data/spec/app/models/dragon.rb +4 -0
  316. data/spec/app/models/driver.rb +7 -0
  317. data/spec/app/models/drug.rb +6 -0
  318. data/spec/app/models/dungeon.rb +4 -0
  319. data/spec/app/models/email.rb +6 -0
  320. data/spec/app/models/employer.rb +5 -0
  321. data/spec/app/models/entry.rb +6 -0
  322. data/spec/app/models/eraser.rb +1 -0
  323. data/spec/app/models/event.rb +22 -0
  324. data/spec/app/models/exhibition.rb +4 -0
  325. data/spec/app/models/exhibitor.rb +5 -0
  326. data/spec/app/models/eye.rb +9 -0
  327. data/spec/app/models/eye_bowl.rb +9 -0
  328. data/spec/app/models/face.rb +8 -0
  329. data/spec/app/models/favorite.rb +6 -0
  330. data/spec/app/models/filesystem.rb +5 -0
  331. data/spec/app/models/fire_hydrant.rb +6 -0
  332. data/spec/app/models/firefox.rb +4 -0
  333. data/spec/app/models/fish.rb +7 -0
  334. data/spec/app/models/folder.rb +7 -0
  335. data/spec/app/models/folder_item.rb +9 -0
  336. data/spec/app/models/fruits.rb +28 -0
  337. data/spec/app/models/game.rb +19 -0
  338. data/spec/app/models/ghost.rb +7 -0
  339. data/spec/app/models/home.rb +4 -0
  340. data/spec/app/models/house.rb +6 -0
  341. data/spec/app/models/html_writer.rb +3 -0
  342. data/spec/app/models/image.rb +22 -0
  343. data/spec/app/models/implant.rb +16 -0
  344. data/spec/app/models/item.rb +8 -0
  345. data/spec/app/models/jar.rb +7 -0
  346. data/spec/app/models/label.rb +40 -0
  347. data/spec/app/models/language.rb +5 -0
  348. data/spec/app/models/lat_lng.rb +15 -0
  349. data/spec/app/models/league.rb +11 -0
  350. data/spec/app/models/learner.rb +2 -0
  351. data/spec/app/models/line_item.rb +6 -0
  352. data/spec/app/models/location.rb +8 -0
  353. data/spec/app/models/login.rb +8 -0
  354. data/spec/app/models/manufacturer.rb +7 -0
  355. data/spec/app/models/meat.rb +4 -0
  356. data/spec/app/models/membership.rb +4 -0
  357. data/spec/app/models/mixed_drink.rb +4 -0
  358. data/spec/app/models/movie.rb +13 -0
  359. data/spec/app/models/my_hash.rb +2 -0
  360. data/spec/app/models/name.rb +23 -0
  361. data/spec/app/models/node.rb +5 -0
  362. data/spec/app/models/note.rb +12 -0
  363. data/spec/app/models/ordered_post.rb +6 -0
  364. data/spec/app/models/ordered_preference.rb +6 -0
  365. data/spec/app/models/oscar.rb +15 -0
  366. data/spec/app/models/override.rb +16 -0
  367. data/spec/app/models/ownable.rb +6 -0
  368. data/spec/app/models/owner.rb +6 -0
  369. data/spec/app/models/pack.rb +3 -0
  370. data/spec/app/models/page.rb +5 -0
  371. data/spec/app/models/page_question.rb +4 -0
  372. data/spec/app/models/palette.rb +7 -0
  373. data/spec/app/models/parent.rb +5 -0
  374. data/spec/app/models/parent_doc.rb +6 -0
  375. data/spec/app/models/passport.rb +5 -0
  376. data/spec/app/models/patient.rb +9 -0
  377. data/spec/app/models/pdf_writer.rb +3 -0
  378. data/spec/app/models/pencil.rb +1 -0
  379. data/spec/app/models/person.rb +205 -0
  380. data/spec/app/models/pet.rb +23 -0
  381. data/spec/app/models/pet_owner.rb +6 -0
  382. data/spec/app/models/phone.rb +11 -0
  383. data/spec/app/models/pizza.rb +7 -0
  384. data/spec/app/models/player.rb +35 -0
  385. data/spec/app/models/post.rb +44 -0
  386. data/spec/app/models/powerup.rb +11 -0
  387. data/spec/app/models/preference.rb +9 -0
  388. data/spec/app/models/princess.rb +8 -0
  389. data/spec/app/models/product.rb +15 -0
  390. data/spec/app/models/profile.rb +5 -0
  391. data/spec/app/models/pronunciation.rb +5 -0
  392. data/spec/app/models/purchase.rb +4 -0
  393. data/spec/app/models/question.rb +8 -0
  394. data/spec/app/models/quiz.rb +7 -0
  395. data/spec/app/models/rating.rb +8 -0
  396. data/spec/app/models/record.rb +46 -0
  397. data/spec/app/models/registry.rb +4 -0
  398. data/spec/app/models/role.rb +7 -0
  399. data/spec/app/models/root_category.rb +4 -0
  400. data/spec/app/models/sandwich.rb +4 -0
  401. data/spec/app/models/scheduler.rb +7 -0
  402. data/spec/app/models/seo.rb +7 -0
  403. data/spec/app/models/series.rb +4 -0
  404. data/spec/app/models/server.rb +13 -0
  405. data/spec/app/models/service.rb +22 -0
  406. data/spec/app/models/shape.rb +12 -0
  407. data/spec/app/models/shelf.rb +5 -0
  408. data/spec/app/models/shipping_container.rb +5 -0
  409. data/spec/app/models/shipping_pack.rb +3 -0
  410. data/spec/app/models/shop.rb +6 -0
  411. data/spec/app/models/short_agent.rb +4 -0
  412. data/spec/app/models/short_quiz.rb +5 -0
  413. data/spec/app/models/slave.rb +6 -0
  414. data/spec/app/models/song.rb +8 -0
  415. data/spec/app/models/sound.rb +5 -0
  416. data/spec/app/models/square.rb +4 -0
  417. data/spec/app/models/strategy.rb +3 -0
  418. data/spec/app/models/sub_item.rb +3 -0
  419. data/spec/app/models/subscription.rb +4 -0
  420. data/spec/app/models/survey.rb +5 -0
  421. data/spec/app/models/symptom.rb +6 -0
  422. data/spec/app/models/tag.rb +8 -0
  423. data/spec/app/models/target.rb +5 -0
  424. data/spec/app/models/template.rb +5 -0
  425. data/spec/app/models/thing.rb +9 -0
  426. data/spec/app/models/title.rb +3 -0
  427. data/spec/app/models/tool.rb +8 -0
  428. data/spec/app/models/topping.rb +5 -0
  429. data/spec/app/models/track.rb +38 -0
  430. data/spec/app/models/translation.rb +5 -0
  431. data/spec/app/models/tree.rb +9 -0
  432. data/spec/app/models/truck.rb +3 -0
  433. data/spec/app/models/user.rb +21 -0
  434. data/spec/app/models/user_account.rb +10 -0
  435. data/spec/app/models/validation_callback.rb +10 -0
  436. data/spec/app/models/vehicle.rb +11 -0
  437. data/spec/app/models/version.rb +5 -0
  438. data/spec/app/models/vet_visit.rb +5 -0
  439. data/spec/app/models/video.rb +13 -0
  440. data/spec/app/models/weapon.rb +11 -0
  441. data/spec/app/models/wiki_page.rb +14 -0
  442. data/spec/app/models/word.rb +15 -0
  443. data/spec/app/models/word_origin.rb +11 -0
  444. data/spec/app/models/writer.rb +11 -0
  445. data/spec/config/mongoid.yml +38 -0
  446. data/spec/mongoid/atomic/modifiers_spec.rb +456 -0
  447. data/spec/mongoid/atomic/paths/embedded/many_spec.rb +118 -0
  448. data/spec/mongoid/atomic/paths/embedded/one_spec.rb +110 -0
  449. data/spec/mongoid/atomic/paths/root_spec.rb +48 -0
  450. data/spec/mongoid/atomic/paths_spec.rb +270 -0
  451. data/spec/mongoid/atomic_spec.rb +365 -0
  452. data/spec/mongoid/attributes/nested_spec.rb +4832 -0
  453. data/spec/mongoid/attributes/readonly_spec.rb +169 -0
  454. data/spec/mongoid/attributes_spec.rb +1412 -0
  455. data/spec/mongoid/changeable_spec.rb +1507 -0
  456. data/spec/mongoid/composable_spec.rb +24 -0
  457. data/spec/mongoid/config/environment_spec.rb +83 -0
  458. data/spec/mongoid/config/options_spec.rb +56 -0
  459. data/spec/mongoid/config_spec.rb +318 -0
  460. data/spec/mongoid/contextual/aggregable/memory_spec.rb +293 -0
  461. data/spec/mongoid/contextual/aggregable/mongo_spec.rb +455 -0
  462. data/spec/mongoid/contextual/atomic_spec.rb +529 -0
  463. data/spec/mongoid/contextual/find_and_modify_spec.rb +220 -0
  464. data/spec/mongoid/contextual/geo_near_spec.rb +405 -0
  465. data/spec/mongoid/contextual/map_reduce_spec.rb +464 -0
  466. data/spec/mongoid/contextual/memory_spec.rb +1236 -0
  467. data/spec/mongoid/contextual/mongo_spec.rb +1843 -0
  468. data/spec/mongoid/contextual/text_search_spec.rb +207 -0
  469. data/spec/mongoid/copyable_spec.rb +393 -0
  470. data/spec/mongoid/criteria/findable_spec.rb +1189 -0
  471. data/spec/mongoid/criteria/inspectable_spec.rb +27 -0
  472. data/spec/mongoid/criteria/marshalable_spec.rb +28 -0
  473. data/spec/mongoid/criteria/modifiable_spec.rb +1063 -0
  474. data/spec/mongoid/criteria/scopable_spec.rb +391 -0
  475. data/spec/mongoid/criteria_spec.rb +3821 -0
  476. data/spec/mongoid/document_spec.rb +1205 -0
  477. data/spec/mongoid/equality_spec.rb +241 -0
  478. data/spec/mongoid/errors/ambiguous_relationship_spec.rb +29 -0
  479. data/spec/mongoid/errors/callback_spec.rb +29 -0
  480. data/spec/mongoid/errors/delete_restriction_spec.rb +29 -0
  481. data/spec/mongoid/errors/document_not_found_spec.rb +104 -0
  482. data/spec/mongoid/errors/eager_load_spec.rb +29 -0
  483. data/spec/mongoid/errors/invalid_collection_spec.rb +36 -0
  484. data/spec/mongoid/errors/invalid_config_option_spec.rb +29 -0
  485. data/spec/mongoid/errors/invalid_field_option_spec.rb +29 -0
  486. data/spec/mongoid/errors/invalid_field_spec.rb +37 -0
  487. data/spec/mongoid/errors/invalid_find_spec.rb +29 -0
  488. data/spec/mongoid/errors/invalid_includes_spec.rb +40 -0
  489. data/spec/mongoid/errors/invalid_index_spec.rb +29 -0
  490. data/spec/mongoid/errors/invalid_options_spec.rb +29 -0
  491. data/spec/mongoid/errors/invalid_path_spec.rb +23 -0
  492. data/spec/mongoid/errors/invalid_scope_spec.rb +29 -0
  493. data/spec/mongoid/errors/invalid_set_polymorphic_relation_spec.rb +17 -0
  494. data/spec/mongoid/errors/invalid_storage_options_spec.rb +29 -0
  495. data/spec/mongoid/errors/invalid_time_spec.rb +29 -0
  496. data/spec/mongoid/errors/inverse_not_found_spec.rb +29 -0
  497. data/spec/mongoid/errors/mixed_relations_spec.rb +29 -0
  498. data/spec/mongoid/errors/mixed_session_configuration_spec.rb +29 -0
  499. data/spec/mongoid/errors/mongoid_error_spec.rb +48 -0
  500. data/spec/mongoid/errors/nested_attributes_metadata_not_found_spec.rb +29 -0
  501. data/spec/mongoid/errors/no_environment_spec.rb +29 -0
  502. data/spec/mongoid/errors/no_map_reduce_output_spec.rb +29 -0
  503. data/spec/mongoid/errors/no_metadata_spec.rb +23 -0
  504. data/spec/mongoid/errors/no_parent_spec.rb +29 -0
  505. data/spec/mongoid/errors/no_session_config_spec.rb +29 -0
  506. data/spec/mongoid/errors/no_session_database_spec.rb +29 -0
  507. data/spec/mongoid/errors/no_session_hosts_spec.rb +29 -0
  508. data/spec/mongoid/errors/no_sessions_config_spec.rb +29 -0
  509. data/spec/mongoid/errors/readonly_attribute_spec.rb +29 -0
  510. data/spec/mongoid/errors/scope_overwrite_spec.rb +29 -0
  511. data/spec/mongoid/errors/too_many_nested_attribute_records_spec.rb +29 -0
  512. data/spec/mongoid/errors/unknown_attribute_spec.rb +29 -0
  513. data/spec/mongoid/errors/unsaved_document_spec.rb +37 -0
  514. data/spec/mongoid/errors/unsupported_javascript_spec.rb +29 -0
  515. data/spec/mongoid/errors/validations_spec.rb +45 -0
  516. data/spec/mongoid/extensions/array_spec.rb +638 -0
  517. data/spec/mongoid/extensions/big_decimal_spec.rb +104 -0
  518. data/spec/mongoid/extensions/binary_spec.rb +60 -0
  519. data/spec/mongoid/extensions/boolean_spec.rb +135 -0
  520. data/spec/mongoid/extensions/date_spec.rb +235 -0
  521. data/spec/mongoid/extensions/date_time_spec.rb +155 -0
  522. data/spec/mongoid/extensions/false_class_spec.rb +42 -0
  523. data/spec/mongoid/extensions/float_spec.rb +133 -0
  524. data/spec/mongoid/extensions/hash_spec.rb +333 -0
  525. data/spec/mongoid/extensions/integer_spec.rb +136 -0
  526. data/spec/mongoid/extensions/module_spec.rb +42 -0
  527. data/spec/mongoid/extensions/nil_class_spec.rb +11 -0
  528. data/spec/mongoid/extensions/object_id_spec.rb +946 -0
  529. data/spec/mongoid/extensions/object_spec.rb +292 -0
  530. data/spec/mongoid/extensions/range_spec.rb +105 -0
  531. data/spec/mongoid/extensions/regexp_spec.rb +47 -0
  532. data/spec/mongoid/extensions/set_spec.rb +33 -0
  533. data/spec/mongoid/extensions/string_spec.rb +357 -0
  534. data/spec/mongoid/extensions/symbol_spec.rb +76 -0
  535. data/spec/mongoid/extensions/time_spec.rb +467 -0
  536. data/spec/mongoid/extensions/time_with_zone_spec.rb +405 -0
  537. data/spec/mongoid/extensions/true_class_spec.rb +42 -0
  538. data/spec/mongoid/extensions_spec.rb +15 -0
  539. data/spec/mongoid/factory_spec.rb +185 -0
  540. data/spec/mongoid/fields/foreign_key_spec.rb +694 -0
  541. data/spec/mongoid/fields/internal/foreign_keys/array_spec.rb +184 -0
  542. data/spec/mongoid/fields/internal/foreign_keys/object_spec.rb +201 -0
  543. data/spec/mongoid/fields/localized_spec.rb +386 -0
  544. data/spec/mongoid/fields/standard_spec.rb +166 -0
  545. data/spec/mongoid/fields_spec.rb +1229 -0
  546. data/spec/mongoid/findable_spec.rb +342 -0
  547. data/spec/mongoid/identity_map_spec.rb +564 -0
  548. data/spec/mongoid/indexable/specification_spec.rb +87 -0
  549. data/spec/mongoid/indexable_spec.rb +504 -0
  550. data/spec/mongoid/inspectable_spec.rb +49 -0
  551. data/spec/mongoid/interceptable_spec.rb +1564 -0
  552. data/spec/mongoid/loggable_spec.rb +21 -0
  553. data/spec/mongoid/matchable/all_spec.rb +31 -0
  554. data/spec/mongoid/matchable/and_spec.rb +162 -0
  555. data/spec/mongoid/matchable/default_spec.rb +130 -0
  556. data/spec/mongoid/matchable/exists_spec.rb +57 -0
  557. data/spec/mongoid/matchable/gt_spec.rb +75 -0
  558. data/spec/mongoid/matchable/gte_spec.rb +74 -0
  559. data/spec/mongoid/matchable/in_spec.rb +25 -0
  560. data/spec/mongoid/matchable/lt_spec.rb +74 -0
  561. data/spec/mongoid/matchable/lte_spec.rb +74 -0
  562. data/spec/mongoid/matchable/ne_spec.rb +25 -0
  563. data/spec/mongoid/matchable/nin_spec.rb +25 -0
  564. data/spec/mongoid/matchable/or_spec.rb +106 -0
  565. data/spec/mongoid/matchable/size_spec.rb +25 -0
  566. data/spec/mongoid/matchable_spec.rb +532 -0
  567. data/spec/mongoid/persistable/creatable_spec.rb +512 -0
  568. data/spec/mongoid/persistable/deletable_spec.rb +205 -0
  569. data/spec/mongoid/persistable/destroyable_spec.rb +148 -0
  570. data/spec/mongoid/persistable/incrementable_spec.rb +173 -0
  571. data/spec/mongoid/persistable/logical_spec.rb +143 -0
  572. data/spec/mongoid/persistable/poppable_spec.rb +115 -0
  573. data/spec/mongoid/persistable/pullable_spec.rb +228 -0
  574. data/spec/mongoid/persistable/pushable_spec.rb +258 -0
  575. data/spec/mongoid/persistable/renamable_spec.rb +135 -0
  576. data/spec/mongoid/persistable/savable_spec.rb +432 -0
  577. data/spec/mongoid/persistable/settable_spec.rb +139 -0
  578. data/spec/mongoid/persistable/unsettable_spec.rb +155 -0
  579. data/spec/mongoid/persistable/updatable_spec.rb +522 -0
  580. data/spec/mongoid/persistable/upsertable_spec.rb +106 -0
  581. data/spec/mongoid/persistable_spec.rb +206 -0
  582. data/spec/mongoid/positional_spec.rb +227 -0
  583. data/spec/mongoid/railties/document_spec.rb +24 -0
  584. data/spec/mongoid/relations/accessors_spec.rb +736 -0
  585. data/spec/mongoid/relations/auto_save_spec.rb +261 -0
  586. data/spec/mongoid/relations/bindings/embedded/in_spec.rb +171 -0
  587. data/spec/mongoid/relations/bindings/embedded/many_spec.rb +54 -0
  588. data/spec/mongoid/relations/bindings/embedded/one_spec.rb +77 -0
  589. data/spec/mongoid/relations/bindings/referenced/in_spec.rb +241 -0
  590. data/spec/mongoid/relations/bindings/referenced/many_spec.rb +153 -0
  591. data/spec/mongoid/relations/bindings/referenced/many_to_many_spec.rb +178 -0
  592. data/spec/mongoid/relations/bindings/referenced/one_spec.rb +131 -0
  593. data/spec/mongoid/relations/builders/embedded/in_spec.rb +34 -0
  594. data/spec/mongoid/relations/builders/embedded/many_spec.rb +132 -0
  595. data/spec/mongoid/relations/builders/embedded/one_spec.rb +99 -0
  596. data/spec/mongoid/relations/builders/nested_attributes/many_spec.rb +234 -0
  597. data/spec/mongoid/relations/builders/nested_attributes/one_spec.rb +250 -0
  598. data/spec/mongoid/relations/builders/referenced/in_spec.rb +241 -0
  599. data/spec/mongoid/relations/builders/referenced/many_spec.rb +137 -0
  600. data/spec/mongoid/relations/builders/referenced/many_to_many_spec.rb +178 -0
  601. data/spec/mongoid/relations/builders/referenced/one_spec.rb +124 -0
  602. data/spec/mongoid/relations/builders_spec.rb +226 -0
  603. data/spec/mongoid/relations/cascading/delete_spec.rb +101 -0
  604. data/spec/mongoid/relations/cascading/destroy_spec.rb +47 -0
  605. data/spec/mongoid/relations/cascading/nullify_spec.rb +32 -0
  606. data/spec/mongoid/relations/cascading/restrict_spec.rb +68 -0
  607. data/spec/mongoid/relations/cascading_spec.rb +355 -0
  608. data/spec/mongoid/relations/constraint_spec.rb +74 -0
  609. data/spec/mongoid/relations/conversions_spec.rb +126 -0
  610. data/spec/mongoid/relations/counter_cache_spec.rb +205 -0
  611. data/spec/mongoid/relations/cyclic_spec.rb +156 -0
  612. data/spec/mongoid/relations/embedded/dirty_spec.rb +65 -0
  613. data/spec/mongoid/relations/embedded/in_spec.rb +579 -0
  614. data/spec/mongoid/relations/embedded/many_spec.rb +3781 -0
  615. data/spec/mongoid/relations/embedded/one_spec.rb +1014 -0
  616. data/spec/mongoid/relations/macros_spec.rb +613 -0
  617. data/spec/mongoid/relations/metadata_spec.rb +1917 -0
  618. data/spec/mongoid/relations/options_spec.rb +35 -0
  619. data/spec/mongoid/relations/polymorphic_spec.rb +128 -0
  620. data/spec/mongoid/relations/proxy_spec.rb +48 -0
  621. data/spec/mongoid/relations/referenced/in_spec.rb +1435 -0
  622. data/spec/mongoid/relations/referenced/many_spec.rb +3546 -0
  623. data/spec/mongoid/relations/referenced/many_to_many_spec.rb +3556 -0
  624. data/spec/mongoid/relations/referenced/one_spec.rb +1289 -0
  625. data/spec/mongoid/relations/reflections_spec.rb +101 -0
  626. data/spec/mongoid/relations/synchronization_spec.rb +449 -0
  627. data/spec/mongoid/relations/targets/enumerable_spec.rb +1710 -0
  628. data/spec/mongoid/relations/touchable_spec.rb +296 -0
  629. data/spec/mongoid/relations_spec.rb +188 -0
  630. data/spec/mongoid/reloadable_spec.rb +305 -0
  631. data/spec/mongoid/scopable_spec.rb +926 -0
  632. data/spec/mongoid/selectable_spec.rb +134 -0
  633. data/spec/mongoid/serializable_spec.rb +862 -0
  634. data/spec/mongoid/sessions/factory_spec.rb +312 -0
  635. data/spec/mongoid/sessions/mongo_uri_spec.rb +103 -0
  636. data/spec/mongoid/sessions/options_spec.rb +71 -0
  637. data/spec/mongoid/sessions_spec.rb +1078 -0
  638. data/spec/mongoid/shardable_spec.rb +61 -0
  639. data/spec/mongoid/state_spec.rb +102 -0
  640. data/spec/mongoid/threaded_spec.rb +258 -0
  641. data/spec/mongoid/timestamps/created/short_spec.rb +51 -0
  642. data/spec/mongoid/timestamps/created_spec.rb +44 -0
  643. data/spec/mongoid/timestamps/updated/short_spec.rb +90 -0
  644. data/spec/mongoid/timestamps/updated_spec.rb +86 -0
  645. data/spec/mongoid/timestamps_spec.rb +112 -0
  646. data/spec/mongoid/traversable_spec.rb +244 -0
  647. data/spec/mongoid/unit_of_work_spec.rb +196 -0
  648. data/spec/mongoid/validatable/associated_spec.rb +183 -0
  649. data/spec/mongoid/validatable/format_spec.rb +83 -0
  650. data/spec/mongoid/validatable/length_spec.rb +119 -0
  651. data/spec/mongoid/validatable/numericality_spec.rb +30 -0
  652. data/spec/mongoid/validatable/presence_spec.rb +511 -0
  653. data/spec/mongoid/validatable/uniqueness_spec.rb +2305 -0
  654. data/spec/mongoid/validatable_spec.rb +309 -0
  655. data/spec/mongoid_spec.rb +74 -0
  656. data/spec/rack/mongoid/middleware/identity_map_spec.rb +72 -0
  657. data/spec/rails/mongoid_spec.rb +462 -0
  658. data/spec/spec_helper.rb +103 -0
  659. metadata +1159 -0
@@ -0,0 +1,1236 @@
1
+ require "spec_helper"
2
+
3
+ describe Mongoid::Contextual::Memory do
4
+
5
+ [ :blank?, :empty? ].each do |method|
6
+
7
+ describe "##{method}" do
8
+
9
+ let(:hobrecht) do
10
+ Address.new(street: "hobrecht")
11
+ end
12
+
13
+ let(:friedel) do
14
+ Address.new(street: "friedel")
15
+ end
16
+
17
+ context "when there are matching documents" do
18
+
19
+ let(:criteria) do
20
+ Address.where(street: "hobrecht").tap do |crit|
21
+ crit.documents = [ hobrecht, friedel ]
22
+ end
23
+ end
24
+
25
+ let(:context) do
26
+ described_class.new(criteria)
27
+ end
28
+
29
+ it "returns false" do
30
+ expect(context.send(method)).to be_false
31
+ end
32
+ end
33
+
34
+ context "when there are no matching documents" do
35
+
36
+ let(:criteria) do
37
+ Address.where(street: "pfluger").tap do |crit|
38
+ crit.documents = [ hobrecht, friedel ]
39
+ end
40
+ end
41
+
42
+ let(:context) do
43
+ described_class.new(criteria)
44
+ end
45
+
46
+ it "returns true" do
47
+ expect(context.send(method)).to be_true
48
+ end
49
+ end
50
+ end
51
+ end
52
+
53
+ describe "#count" do
54
+
55
+ let!(:hobrecht) do
56
+ Address.new(street: "hobrecht")
57
+ end
58
+
59
+ let!(:friedel) do
60
+ Address.new(street: "friedel")
61
+ end
62
+
63
+ let(:criteria) do
64
+ Address.where(street: "hobrecht").tap do |crit|
65
+ crit.documents = [ hobrecht, friedel ]
66
+ end
67
+ end
68
+
69
+ let(:context) do
70
+ described_class.new(criteria)
71
+ end
72
+
73
+ context "context when no arguments are provided" do
74
+
75
+ it "returns the number of matches" do
76
+ expect(context.count).to eq(1)
77
+ end
78
+ end
79
+
80
+ context "when provided a document" do
81
+
82
+ context "when the document matches" do
83
+
84
+ let(:count) do
85
+ context.count(hobrecht)
86
+ end
87
+
88
+ it "returns 1" do
89
+ expect(count).to eq(1)
90
+ end
91
+ end
92
+
93
+ context "when the document does not match" do
94
+
95
+ let(:count) do
96
+ context.count(friedel)
97
+ end
98
+
99
+ it "returns 0" do
100
+ expect(count).to eq(0)
101
+ end
102
+ end
103
+ end
104
+
105
+ context "when provided a block" do
106
+
107
+ context "when the block evals 1 to true" do
108
+
109
+ let(:count) do
110
+ context.count do |doc|
111
+ doc.street == "hobrecht"
112
+ end
113
+ end
114
+
115
+ it "returns 1" do
116
+ expect(count).to eq(1)
117
+ end
118
+ end
119
+
120
+ context "when the block evals none to true" do
121
+
122
+ let(:count) do
123
+ context.count do |doc|
124
+ doc.street == "friedel"
125
+ end
126
+ end
127
+
128
+ it "returns 0" do
129
+ expect(count).to eq(0)
130
+ end
131
+ end
132
+ end
133
+ end
134
+
135
+ [ :delete, :delete_all ].each do |method|
136
+
137
+ let(:person) do
138
+ Person.create
139
+ end
140
+
141
+ let(:hobrecht) do
142
+ person.addresses.create(street: "hobrecht")
143
+ end
144
+
145
+ let(:friedel) do
146
+ person.addresses.create(street: "friedel")
147
+ end
148
+
149
+ let(:pfluger) do
150
+ person.addresses.create(street: "pfluger")
151
+ end
152
+
153
+ describe "##{method}" do
154
+
155
+ context "when embedded a single level" do
156
+
157
+ let(:criteria) do
158
+ Address.any_in(street: [ "hobrecht", "friedel" ]).tap do |crit|
159
+ crit.documents = [ hobrecht, friedel, pfluger ]
160
+ end
161
+ end
162
+
163
+ let(:context) do
164
+ described_class.new(criteria)
165
+ end
166
+
167
+ let!(:deleted) do
168
+ context.send(method)
169
+ end
170
+
171
+ it "deletes the first matching document" do
172
+ expect(hobrecht).to be_destroyed
173
+ end
174
+
175
+ it "deletes the last matching document" do
176
+ expect(friedel).to be_destroyed
177
+ end
178
+
179
+ it "does not delete non matching docs" do
180
+ expect(pfluger).to_not be_destroyed
181
+ end
182
+
183
+ it "removes the docs from the relation" do
184
+ expect(person.addresses).to eq([ pfluger ])
185
+ end
186
+
187
+ it "removes the docs from the context" do
188
+ expect(context.entries).to be_empty
189
+ end
190
+
191
+ it "persists the changes to the database" do
192
+ expect(person.reload.addresses).to eq([ pfluger ])
193
+ end
194
+
195
+ it "returns the number of deleted documents" do
196
+ expect(deleted).to eq(2)
197
+ end
198
+ end
199
+
200
+ context "when embedded multiple levels" do
201
+
202
+ let!(:home) do
203
+ hobrecht.locations.create(name: "home")
204
+ end
205
+
206
+ let!(:work) do
207
+ hobrecht.locations.create(name: "work")
208
+ end
209
+
210
+ let(:criteria) do
211
+ Location.where(name: "work").tap do |crit|
212
+ crit.documents = [ home, work ]
213
+ end
214
+ end
215
+
216
+ let(:context) do
217
+ described_class.new(criteria)
218
+ end
219
+
220
+ let!(:deleted) do
221
+ context.send(method)
222
+ end
223
+
224
+ it "deletes the first matching document" do
225
+ expect(work).to be_destroyed
226
+ end
227
+
228
+ it "does not delete non matching docs" do
229
+ expect(home).to_not be_destroyed
230
+ end
231
+
232
+ it "removes the docs from the relation" do
233
+ expect(person.addresses.first.locations).to eq([ home ])
234
+ end
235
+
236
+ it "removes the docs from the context" do
237
+ expect(context.entries).to be_empty
238
+ end
239
+
240
+ it "persists the changes to the database" do
241
+ expect(person.reload.addresses.first.locations).to eq([ home ])
242
+ end
243
+
244
+ it "returns the number of deleted documents" do
245
+ expect(deleted).to eq(1)
246
+ end
247
+ end
248
+ end
249
+ end
250
+
251
+ [ :destroy, :destroy_all ].each do |method|
252
+
253
+ let(:person) do
254
+ Person.create
255
+ end
256
+
257
+ let(:hobrecht) do
258
+ person.addresses.create(street: "hobrecht")
259
+ end
260
+
261
+ let(:friedel) do
262
+ person.addresses.create(street: "friedel")
263
+ end
264
+
265
+ let(:pfluger) do
266
+ person.addresses.create(street: "pfluger")
267
+ end
268
+
269
+ let(:criteria) do
270
+ Address.any_in(street: [ "hobrecht", "friedel" ]).tap do |crit|
271
+ crit.documents = [ hobrecht, friedel, pfluger ]
272
+ end
273
+ end
274
+
275
+ let(:context) do
276
+ described_class.new(criteria)
277
+ end
278
+
279
+ describe "##{method}" do
280
+
281
+ let!(:destroyed) do
282
+ context.send(method)
283
+ end
284
+
285
+ it "deletes the first matching document" do
286
+ expect(hobrecht).to be_destroyed
287
+ end
288
+
289
+ it "deletes the last matching document" do
290
+ expect(friedel).to be_destroyed
291
+ end
292
+
293
+ it "does not delete non matching docs" do
294
+ expect(pfluger).to_not be_destroyed
295
+ end
296
+
297
+ it "removes the docs from the relation" do
298
+ expect(person.addresses).to eq([ pfluger ])
299
+ end
300
+
301
+ it "removes the docs from the context" do
302
+ expect(context.entries).to be_empty
303
+ end
304
+
305
+ it "persists the changes to the database" do
306
+ expect(person.reload.addresses).to eq([ pfluger ])
307
+ end
308
+
309
+ it "returns the number of destroyed documents" do
310
+ expect(destroyed).to eq(2)
311
+ end
312
+ end
313
+ end
314
+
315
+ describe "#distinct" do
316
+
317
+ let(:hobrecht) do
318
+ Address.new(street: "hobrecht")
319
+ end
320
+
321
+ let(:friedel) do
322
+ Address.new(street: "friedel")
323
+ end
324
+
325
+ context "when limiting the result set" do
326
+
327
+ let(:criteria) do
328
+ Address.where(street: "hobrecht").tap do |crit|
329
+ crit.documents = [ hobrecht, hobrecht, friedel ]
330
+ end
331
+ end
332
+
333
+ let(:context) do
334
+ described_class.new(criteria)
335
+ end
336
+
337
+ it "returns the distinct field values" do
338
+ expect(context.distinct(:street)).to eq([ "hobrecht" ])
339
+ end
340
+ end
341
+
342
+ context "when not limiting the result set" do
343
+
344
+ let(:criteria) do
345
+ Address.all.tap do |crit|
346
+ crit.documents = [ hobrecht, friedel, friedel ]
347
+ end
348
+ end
349
+
350
+ let(:context) do
351
+ described_class.new(criteria)
352
+ end
353
+
354
+ it "returns the distinct field values" do
355
+ expect(context.distinct(:street)).to eq([ "hobrecht", "friedel" ])
356
+ end
357
+ end
358
+ end
359
+
360
+ describe "#each" do
361
+
362
+ let(:hobrecht) do
363
+ Address.new(street: "hobrecht")
364
+ end
365
+
366
+ let(:friedel) do
367
+ Address.new(street: "friedel")
368
+ end
369
+
370
+ let(:criteria) do
371
+ Address.where(street: "hobrecht").tap do |crit|
372
+ crit.documents = [ hobrecht, friedel ]
373
+ end
374
+ end
375
+
376
+ let(:context) do
377
+ described_class.new(criteria)
378
+ end
379
+
380
+ context "when skip and limit outside of range" do
381
+
382
+ before do
383
+ context.skip(10).limit(2)
384
+ end
385
+
386
+ it "contains no documents" do
387
+ expect(context.map(&:street)).to be_empty
388
+ end
389
+
390
+ context "when calling next on the enumerator" do
391
+
392
+ it "raises a stop iteration error" do
393
+ expect {
394
+ context.each.next
395
+ }.to raise_error(StopIteration)
396
+ end
397
+ end
398
+ end
399
+
400
+ context "when providing a block" do
401
+
402
+ it "yields mongoid documents to the block" do
403
+ context.each do |doc|
404
+ expect(doc).to be_a(Mongoid::Document)
405
+ end
406
+ end
407
+
408
+ it "iterates over the matching documents" do
409
+ context.each do |doc|
410
+ expect(doc).to eq(hobrecht)
411
+ end
412
+ end
413
+ end
414
+
415
+ context "when no block is provided" do
416
+
417
+ let(:enum) do
418
+ context.each
419
+ end
420
+
421
+ it "returns an enumerator" do
422
+ expect(enum).to be_a(Enumerator)
423
+ end
424
+
425
+ context "when iterating over the enumerator" do
426
+
427
+ context "when iterating with each" do
428
+
429
+ it "yields mongoid documents to the block" do
430
+ enum.each do |doc|
431
+ expect(doc).to be_a(Mongoid::Document)
432
+ end
433
+ end
434
+ end
435
+
436
+ context "when iterating with next" do
437
+
438
+ it "yields mongoid documents" do
439
+ expect(enum.next).to be_a(Mongoid::Document)
440
+ end
441
+ end
442
+ end
443
+ end
444
+ end
445
+
446
+ describe "#exists?" do
447
+
448
+ let(:hobrecht) do
449
+ Address.new(street: "hobrecht")
450
+ end
451
+
452
+ let(:friedel) do
453
+ Address.new(street: "friedel")
454
+ end
455
+
456
+ context "when there are matching documents" do
457
+
458
+ let(:criteria) do
459
+ Address.where(street: "hobrecht").tap do |crit|
460
+ crit.documents = [ hobrecht, friedel ]
461
+ end
462
+ end
463
+
464
+ let(:context) do
465
+ described_class.new(criteria)
466
+ end
467
+
468
+ it "returns true" do
469
+ expect(context).to be_exists
470
+ end
471
+ end
472
+
473
+ context "when there are no matching documents" do
474
+
475
+ let(:criteria) do
476
+ Address.where(street: "pfluger").tap do |crit|
477
+ crit.documents = [ hobrecht, friedel ]
478
+ end
479
+ end
480
+
481
+ let(:context) do
482
+ described_class.new(criteria)
483
+ end
484
+
485
+ it "returns false" do
486
+ expect(context).to_not be_exists
487
+ end
488
+ end
489
+ end
490
+
491
+ [ :first, :one ].each do |method|
492
+
493
+ describe "##{method}" do
494
+
495
+ let(:hobrecht) do
496
+ Address.new(street: "hobrecht")
497
+ end
498
+
499
+ let(:friedel) do
500
+ Address.new(street: "friedel")
501
+ end
502
+
503
+ let(:criteria) do
504
+ Address.where(:street.in => [ "hobrecht", "friedel" ]).tap do |crit|
505
+ crit.documents = [ hobrecht, friedel ]
506
+ end
507
+ end
508
+
509
+ let(:context) do
510
+ described_class.new(criteria)
511
+ end
512
+
513
+ it "returns the first matching document" do
514
+ expect(context.send(method)).to eq(hobrecht)
515
+ end
516
+ end
517
+ end
518
+
519
+ describe "#initialize" do
520
+
521
+ context "when the criteria has no options" do
522
+
523
+ let(:hobrecht) do
524
+ Address.new(street: "hobrecht")
525
+ end
526
+
527
+ let(:friedel) do
528
+ Address.new(street: "friedel")
529
+ end
530
+
531
+ let(:criteria) do
532
+ Address.where(street: "hobrecht").tap do |crit|
533
+ crit.documents = [ hobrecht, friedel ]
534
+ end
535
+ end
536
+
537
+ let(:context) do
538
+ described_class.new(criteria)
539
+ end
540
+
541
+ it "sets the criteria" do
542
+ expect(context.criteria).to eq(criteria)
543
+ end
544
+
545
+ it "sets the klass" do
546
+ expect(context.klass).to eq(Address)
547
+ end
548
+
549
+ it "sets the matching documents" do
550
+ expect(context.documents).to eq([ hobrecht ])
551
+ end
552
+ end
553
+
554
+ context "when the criteria skips" do
555
+
556
+ let(:hobrecht) do
557
+ Address.new(street: "hobrecht")
558
+ end
559
+
560
+ let(:friedel) do
561
+ Address.new(street: "friedel")
562
+ end
563
+
564
+ let(:criteria) do
565
+ Address.all.skip(1).tap do |crit|
566
+ crit.documents = [ hobrecht, friedel ]
567
+ end
568
+ end
569
+
570
+ let(:context) do
571
+ described_class.new(criteria)
572
+ end
573
+
574
+ it "limits the matching documents" do
575
+ expect(context).to eq([ friedel ])
576
+ end
577
+ end
578
+
579
+ context "when the criteria limits" do
580
+
581
+ let(:hobrecht) do
582
+ Address.new(street: "hobrecht")
583
+ end
584
+
585
+ let(:friedel) do
586
+ Address.new(street: "friedel")
587
+ end
588
+
589
+ let(:criteria) do
590
+ Address.all.limit(1).tap do |crit|
591
+ crit.documents = [ hobrecht, friedel ]
592
+ end
593
+ end
594
+
595
+ let(:context) do
596
+ described_class.new(criteria)
597
+ end
598
+
599
+ it "limits the matching documents" do
600
+ expect(context).to eq([ hobrecht ])
601
+ end
602
+ end
603
+ end
604
+
605
+ describe "#last" do
606
+
607
+ let(:hobrecht) do
608
+ Address.new(street: "hobrecht")
609
+ end
610
+
611
+ let(:friedel) do
612
+ Address.new(street: "friedel")
613
+ end
614
+
615
+ let(:criteria) do
616
+ Address.where(:street.in => [ "hobrecht", "friedel" ]).tap do |crit|
617
+ crit.documents = [ hobrecht, friedel ]
618
+ end
619
+ end
620
+
621
+ let(:context) do
622
+ described_class.new(criteria)
623
+ end
624
+
625
+ it "returns the last matching document" do
626
+ expect(context.last).to eq(friedel)
627
+ end
628
+ end
629
+
630
+ [ :length, :size ].each do |method|
631
+
632
+ describe "##{method}" do
633
+
634
+ let(:hobrecht) do
635
+ Address.new(street: "hobrecht")
636
+ end
637
+
638
+ let(:friedel) do
639
+ Address.new(street: "friedel")
640
+ end
641
+
642
+ context "when there are matching documents" do
643
+
644
+ let(:criteria) do
645
+ Address.where(street: "hobrecht").tap do |crit|
646
+ crit.documents = [ hobrecht, friedel ]
647
+ end
648
+ end
649
+
650
+ let(:context) do
651
+ described_class.new(criteria)
652
+ end
653
+
654
+ it "returns the number of matches" do
655
+ expect(context.send(method)).to eq(1)
656
+ end
657
+ end
658
+
659
+ context "when there are no matching documents" do
660
+
661
+ let(:criteria) do
662
+ Address.where(street: "pfluger").tap do |crit|
663
+ crit.documents = [ hobrecht, friedel ]
664
+ end
665
+ end
666
+
667
+ let(:context) do
668
+ described_class.new(criteria)
669
+ end
670
+
671
+ it "returns zero" do
672
+ expect(context.send(method)).to eq(0)
673
+ end
674
+ end
675
+ end
676
+ end
677
+
678
+ describe "#limit" do
679
+
680
+ let(:hobrecht) do
681
+ Address.new(street: "hobrecht")
682
+ end
683
+
684
+ let(:friedel) do
685
+ Address.new(street: "friedel")
686
+ end
687
+
688
+ let(:pfluger) do
689
+ Address.new(street: "pfluger")
690
+ end
691
+
692
+ let(:criteria) do
693
+ Address.all.tap do |crit|
694
+ crit.documents = [ hobrecht, friedel, pfluger ]
695
+ end
696
+ end
697
+
698
+ let(:context) do
699
+ described_class.new(criteria)
700
+ end
701
+
702
+ let!(:limit) do
703
+ context.limit(2)
704
+ end
705
+
706
+ it "returns the context" do
707
+ expect(limit).to eq(context)
708
+ end
709
+
710
+ context "when asking for all documents" do
711
+
712
+ context "when only a limit exists" do
713
+
714
+ it "only returns the limited documents" do
715
+ expect(context.entries).to eq([ hobrecht, friedel ])
716
+ end
717
+ end
718
+
719
+ context "when a skip and limit exist" do
720
+
721
+ before do
722
+ limit.skip(1)
723
+ end
724
+
725
+ it "applies the skip before the limit" do
726
+ expect(context.entries).to eq([ friedel, pfluger ])
727
+ end
728
+ end
729
+ end
730
+ end
731
+
732
+ describe "#skip" do
733
+
734
+ let(:hobrecht) do
735
+ Address.new(street: "hobrecht")
736
+ end
737
+
738
+ let(:friedel) do
739
+ Address.new(street: "friedel")
740
+ end
741
+
742
+ let(:pfluger) do
743
+ Address.new(street: "pfluger")
744
+ end
745
+
746
+ let(:criteria) do
747
+ Address.all.tap do |crit|
748
+ crit.documents = [ hobrecht, friedel, pfluger ]
749
+ end
750
+ end
751
+
752
+ let(:context) do
753
+ described_class.new(criteria)
754
+ end
755
+
756
+ let!(:skip) do
757
+ context.skip(1)
758
+ end
759
+
760
+ it "returns the context" do
761
+ expect(skip).to eq(context)
762
+ end
763
+
764
+ context "when asking for all documents" do
765
+
766
+ context "when only a skip exists" do
767
+
768
+ it "skips the correct number" do
769
+ expect(context.entries).to eq([ friedel, pfluger ])
770
+ end
771
+ end
772
+
773
+ context "when a skip and limit exist" do
774
+
775
+ before do
776
+ skip.limit(1)
777
+ end
778
+
779
+ it "applies the skip before the limit" do
780
+ expect(context.entries).to eq([ friedel ])
781
+ end
782
+ end
783
+ end
784
+ end
785
+
786
+ describe "#sort" do
787
+
788
+ let(:hobrecht) do
789
+ Address.new(street: "hobrecht", number: 9, name: "hobrecht")
790
+ end
791
+
792
+ let(:friedel) do
793
+ Address.new(street: "friedel", number: 1, name: "friedel")
794
+ end
795
+
796
+ let(:pfluger) do
797
+ Address.new(street: "pfluger", number: 5, name: "pfluger")
798
+ end
799
+
800
+ let(:criteria) do
801
+ Address.all.tap do |crit|
802
+ crit.documents = [ hobrecht, friedel, pfluger ]
803
+ end
804
+ end
805
+
806
+ let(:context) do
807
+ described_class.new(criteria)
808
+ end
809
+
810
+ context "when providing a single field sort" do
811
+
812
+ context "when the sort is ascending" do
813
+
814
+ let!(:sorted) do
815
+ context.sort(street: 1)
816
+ end
817
+
818
+ it "sorts the documents" do
819
+ expect(context.entries).to eq([ friedel, hobrecht, pfluger ])
820
+ end
821
+
822
+ it "returns the context" do
823
+ expect(sorted).to eq(context)
824
+ end
825
+ end
826
+
827
+ context "when the sort is descending" do
828
+
829
+ context "when sorting on a string" do
830
+
831
+ let!(:sorted) do
832
+ context.sort(street: -1)
833
+ end
834
+
835
+ it "sorts the documents" do
836
+ expect(context.entries).to eq([ pfluger, hobrecht, friedel ])
837
+ end
838
+
839
+ it "returns the context" do
840
+ expect(sorted).to eq(context)
841
+ end
842
+ end
843
+
844
+ context "when sorting on a time" do
845
+
846
+ before do
847
+ pfluger.move_in = 30.days.ago
848
+ hobrecht.move_in = 25.days.ago
849
+ end
850
+
851
+ let!(:sorted) do
852
+ context.sort(move_in: -1)
853
+ end
854
+
855
+ it "sorts the documents" do
856
+ expect(context.entries).to eq([ friedel, hobrecht, pfluger ])
857
+ end
858
+
859
+ it "returns the context" do
860
+ expect(sorted).to eq(context)
861
+ end
862
+ end
863
+ end
864
+ end
865
+
866
+ context "when providing multiple sort fields" do
867
+
868
+ let(:lenau) do
869
+ Address.new(street: "lenau", number: 5, name: "lenau")
870
+ end
871
+
872
+ before do
873
+ criteria.documents.unshift(lenau)
874
+ end
875
+
876
+ context "when the sort is ascending" do
877
+
878
+ let!(:sorted) do
879
+ context.sort(number: 1, street: 1)
880
+ end
881
+
882
+ it "sorts the documents" do
883
+ expect(context.entries).to eq([ friedel, lenau, pfluger, hobrecht ])
884
+ end
885
+
886
+ it "returns the context" do
887
+ expect(sorted).to eq(context)
888
+ end
889
+ end
890
+
891
+ context "when the sort is descending" do
892
+
893
+ let!(:sorted) do
894
+ context.sort(number: -1, street: -1)
895
+ end
896
+
897
+ it "sorts the documents" do
898
+ expect(context.entries).to eq([ hobrecht, pfluger, lenau, friedel ])
899
+ end
900
+
901
+ it "returns the context" do
902
+ expect(sorted).to eq(context)
903
+ end
904
+ end
905
+ end
906
+
907
+ context "when the field is nil" do
908
+
909
+ let!(:sorted) do
910
+ context.sort(state: 1)
911
+ end
912
+
913
+ it "does not sort the documents" do
914
+ expect(context.entries).to eq([ hobrecht, friedel, pfluger ])
915
+ end
916
+
917
+ it "returns the context" do
918
+ expect(sorted).to eq(context)
919
+ end
920
+ end
921
+
922
+ context "with localized field" do
923
+
924
+ let!(:sorted) do
925
+ context.sort("name.en" => 1)
926
+ end
927
+
928
+ it "sorts the documents" do
929
+ expect(context.entries).to eq([ friedel, hobrecht, pfluger ])
930
+ end
931
+ end
932
+ end
933
+
934
+ describe "#update" do
935
+
936
+ let(:person) do
937
+ Person.create
938
+ end
939
+
940
+ let(:hobrecht) do
941
+ person.addresses.create(street: "hobrecht")
942
+ end
943
+
944
+ let(:friedel) do
945
+ person.addresses.create(street: "friedel")
946
+ end
947
+
948
+ let(:pfluger) do
949
+ person.addresses.create(street: "pfluger")
950
+ end
951
+
952
+ context "when the documents are embedded one level" do
953
+
954
+ let(:criteria) do
955
+ Address.any_in(street: [ "hobrecht", "friedel" ]).tap do |crit|
956
+ crit.documents = [ hobrecht, friedel, pfluger ]
957
+ end
958
+ end
959
+
960
+ let(:context) do
961
+ described_class.new(criteria)
962
+ end
963
+
964
+ context "when attributes are provided" do
965
+
966
+ before do
967
+ context.update(number: 5)
968
+ end
969
+
970
+ it "updates the first matching document" do
971
+ expect(hobrecht.number).to eq(5)
972
+ end
973
+
974
+ it "does not update the last matching document" do
975
+ expect(friedel.number).to be_nil
976
+ end
977
+
978
+ it "does not update non matching docs" do
979
+ expect(pfluger.number).to be_nil
980
+ end
981
+
982
+ context "when reloading the embedded documents" do
983
+
984
+ it "updates the first matching document" do
985
+ expect(hobrecht.reload.number).to eq(5)
986
+ end
987
+
988
+ it "updates the last matching document" do
989
+ expect(friedel.reload.number).to be_nil
990
+ end
991
+
992
+ it "does not update non matching docs" do
993
+ expect(pfluger.reload.number).to be_nil
994
+ end
995
+ end
996
+ end
997
+
998
+ context "when no attributes are provided" do
999
+
1000
+ it "returns false" do
1001
+ expect(context.update).to be_false
1002
+ end
1003
+ end
1004
+ end
1005
+
1006
+ context "when the documents are embedded multiple levels" do
1007
+
1008
+ let!(:home) do
1009
+ hobrecht.locations.create(name: "home")
1010
+ end
1011
+
1012
+ let!(:work) do
1013
+ hobrecht.locations.create(name: "work")
1014
+ end
1015
+
1016
+ let(:criteria) do
1017
+ Location.where(name: "work").tap do |crit|
1018
+ crit.documents = [ home, work ]
1019
+ end
1020
+ end
1021
+
1022
+ let(:context) do
1023
+ described_class.new(criteria)
1024
+ end
1025
+
1026
+ context "when attributes are provided" do
1027
+
1028
+ before do
1029
+ context.update(number: 5)
1030
+ end
1031
+
1032
+ it "updates the first matching document" do
1033
+ expect(work.number).to eq(5)
1034
+ end
1035
+
1036
+ it "does not update non matching docs" do
1037
+ expect(home.number).to be_nil
1038
+ end
1039
+
1040
+ context "when reloading the embedded documents" do
1041
+
1042
+ it "updates the first matching document" do
1043
+ expect(work.reload.number).to eq(5)
1044
+ end
1045
+
1046
+ it "does not update non matching docs" do
1047
+ expect(home.reload.number).to be_nil
1048
+ end
1049
+ end
1050
+ end
1051
+
1052
+ context "when no attributes are provided" do
1053
+
1054
+ it "returns false" do
1055
+ expect(context.update).to be_false
1056
+ end
1057
+ end
1058
+ end
1059
+ end
1060
+
1061
+ describe "#update_all" do
1062
+
1063
+ let(:person) do
1064
+ Person.create
1065
+ end
1066
+
1067
+ let(:hobrecht) do
1068
+ person.addresses.create(street: "hobrecht")
1069
+ end
1070
+
1071
+ let(:friedel) do
1072
+ person.addresses.create(street: "friedel")
1073
+ end
1074
+
1075
+ let(:pfluger) do
1076
+ person.addresses.create(street: "pfluger")
1077
+ end
1078
+
1079
+ context "when the documents are empty" do
1080
+
1081
+ let(:person_two) do
1082
+ Person.create
1083
+ end
1084
+
1085
+ let(:criteria) do
1086
+ Address.all
1087
+ end
1088
+
1089
+ let(:context) do
1090
+ described_class.new(criteria)
1091
+ end
1092
+
1093
+ it "returns false" do
1094
+ expect(context.update_all({})).to be_false
1095
+ end
1096
+ end
1097
+
1098
+ context "when the documents are embedded one level" do
1099
+
1100
+ let(:criteria) do
1101
+ Address.any_in(street: [ "hobrecht", "friedel" ]).tap do |crit|
1102
+ crit.documents = [ hobrecht, friedel, pfluger ]
1103
+ end
1104
+ end
1105
+
1106
+ let(:context) do
1107
+ described_class.new(criteria)
1108
+ end
1109
+
1110
+ context "when providing aliased fields" do
1111
+
1112
+ before do
1113
+ context.update_all(suite: "10B")
1114
+ end
1115
+
1116
+ it "updates the first matching document" do
1117
+ expect(hobrecht.suite).to eq("10B")
1118
+ end
1119
+
1120
+ it "updates the last matching document" do
1121
+ expect(friedel.suite).to eq("10B")
1122
+ end
1123
+
1124
+ it "does not update non matching docs" do
1125
+ expect(pfluger.suite).to be_nil
1126
+ end
1127
+ end
1128
+
1129
+ context "when attributes are provided" do
1130
+
1131
+ before do
1132
+ context.update_all(number: 5)
1133
+ end
1134
+
1135
+ it "updates the first matching document" do
1136
+ expect(hobrecht.number).to eq(5)
1137
+ end
1138
+
1139
+ it "updates the last matching document" do
1140
+ expect(friedel.number).to eq(5)
1141
+ end
1142
+
1143
+ it "does not update non matching docs" do
1144
+ expect(pfluger.number).to be_nil
1145
+ end
1146
+
1147
+ context "when reloading the embedded documents" do
1148
+
1149
+ it "updates the first matching document" do
1150
+ expect(hobrecht.reload.number).to eq(5)
1151
+ end
1152
+
1153
+ it "updates the last matching document" do
1154
+ expect(friedel.reload.number).to eq(5)
1155
+ end
1156
+
1157
+ it "does not update non matching docs" do
1158
+ expect(pfluger.reload.number).to be_nil
1159
+ end
1160
+ end
1161
+
1162
+ context "when updating the documents a second time" do
1163
+
1164
+ before do
1165
+ context.update_all(number: 5)
1166
+ end
1167
+
1168
+ it "does not error on the update" do
1169
+ expect(hobrecht.number).to eq(5)
1170
+ end
1171
+ end
1172
+ end
1173
+
1174
+ context "when no attributes are provided" do
1175
+
1176
+ it "returns false" do
1177
+ expect(context.update_all).to be_false
1178
+ end
1179
+ end
1180
+ end
1181
+
1182
+ context "when the documents are embedded multiple levels" do
1183
+
1184
+ let!(:home) do
1185
+ hobrecht.locations.create(name: "home")
1186
+ end
1187
+
1188
+ let!(:work) do
1189
+ hobrecht.locations.create(name: "work")
1190
+ end
1191
+
1192
+ let(:criteria) do
1193
+ Location.where(name: "work").tap do |crit|
1194
+ crit.documents = [ home, work ]
1195
+ end
1196
+ end
1197
+
1198
+ let(:context) do
1199
+ described_class.new(criteria)
1200
+ end
1201
+
1202
+ context "when attributes are provided" do
1203
+
1204
+ before do
1205
+ context.update_all(number: 5)
1206
+ end
1207
+
1208
+ it "updates the first matching document" do
1209
+ expect(work.number).to eq(5)
1210
+ end
1211
+
1212
+ it "does not update non matching docs" do
1213
+ expect(home.number).to be_nil
1214
+ end
1215
+
1216
+ context "when reloading the embedded documents" do
1217
+
1218
+ it "updates the first matching document" do
1219
+ expect(work.reload.number).to eq(5)
1220
+ end
1221
+
1222
+ it "does not update non matching docs" do
1223
+ expect(home.reload.number).to be_nil
1224
+ end
1225
+ end
1226
+ end
1227
+
1228
+ context "when no attributes are provided" do
1229
+
1230
+ it "returns false" do
1231
+ expect(context.update_all).to be_false
1232
+ end
1233
+ end
1234
+ end
1235
+ end
1236
+ end