mongoid 3.1.6 → 4.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (571) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +479 -8
  3. data/README.md +10 -7
  4. data/lib/config/locales/en.yml +34 -20
  5. data/lib/mongoid.rb +10 -76
  6. data/lib/mongoid/atomic.rb +3 -14
  7. data/lib/mongoid/atomic/paths/embedded.rb +0 -30
  8. data/lib/mongoid/atomic/paths/embedded/many.rb +1 -1
  9. data/lib/mongoid/atomic/paths/embedded/one.rb +1 -1
  10. data/lib/mongoid/atomic/paths/root.rb +0 -13
  11. data/lib/mongoid/attributes.rb +65 -101
  12. data/lib/mongoid/attributes/dynamic.rb +154 -0
  13. data/lib/mongoid/attributes/nested.rb +82 -0
  14. data/lib/mongoid/attributes/processing.rb +13 -66
  15. data/lib/mongoid/{dirty.rb → changeable.rb} +32 -2
  16. data/lib/mongoid/composable.rb +105 -0
  17. data/lib/mongoid/config.rb +3 -9
  18. data/lib/mongoid/config/options.rb +1 -1
  19. data/lib/mongoid/contextual.rb +2 -0
  20. data/lib/mongoid/contextual/aggregable/memory.rb +2 -2
  21. data/lib/mongoid/contextual/aggregable/mongo.rb +7 -9
  22. data/lib/mongoid/contextual/atomic.rb +53 -53
  23. data/lib/mongoid/contextual/geo_near.rb +1 -1
  24. data/lib/mongoid/contextual/map_reduce.rb +4 -2
  25. data/lib/mongoid/contextual/memory.rb +23 -11
  26. data/lib/mongoid/contextual/mongo.rb +75 -57
  27. data/lib/mongoid/contextual/none.rb +90 -0
  28. data/lib/mongoid/contextual/text_search.rb +178 -0
  29. data/lib/mongoid/copyable.rb +2 -3
  30. data/lib/mongoid/criteria.rb +39 -34
  31. data/lib/mongoid/criteria/#findable.rb# +141 -0
  32. data/lib/mongoid/{criterion → criteria}/findable.rb +7 -47
  33. data/lib/mongoid/{criterion/inspection.rb → criteria/inspectable.rb} +2 -2
  34. data/lib/mongoid/{criterion → criteria}/marshalable.rb +3 -1
  35. data/lib/mongoid/{criterion → criteria}/modifiable.rb +28 -8
  36. data/lib/mongoid/criteria/permission.rb +70 -0
  37. data/lib/mongoid/{criterion/scoping.rb → criteria/scopable.rb} +2 -2
  38. data/lib/mongoid/document.rb +39 -24
  39. data/lib/mongoid/errors.rb +4 -1
  40. data/lib/mongoid/errors/document_not_destroyed.rb +25 -0
  41. data/lib/mongoid/errors/document_not_found.rb +2 -1
  42. data/lib/mongoid/errors/invalid_storage_options.rb +1 -1
  43. data/lib/mongoid/errors/invalid_storage_parent.rb +26 -0
  44. data/lib/mongoid/errors/invalid_value.rb +16 -0
  45. data/lib/mongoid/errors/mongoid_error.rb +1 -1
  46. data/lib/mongoid/errors/readonly_document.rb +24 -0
  47. data/lib/mongoid/extensions.rb +15 -7
  48. data/lib/mongoid/extensions/array.rb +3 -3
  49. data/lib/mongoid/extensions/big_decimal.rb +1 -1
  50. data/lib/mongoid/extensions/boolean.rb +15 -17
  51. data/lib/mongoid/extensions/date.rb +1 -1
  52. data/lib/mongoid/extensions/date_time.rb +3 -3
  53. data/lib/mongoid/extensions/float.rb +2 -1
  54. data/lib/mongoid/extensions/hash.rb +3 -3
  55. data/lib/mongoid/extensions/integer.rb +1 -1
  56. data/lib/mongoid/extensions/object.rb +7 -7
  57. data/lib/mongoid/extensions/object_id.rb +5 -5
  58. data/lib/mongoid/extensions/range.rb +9 -3
  59. data/lib/mongoid/extensions/regexp.rb +1 -1
  60. data/lib/mongoid/extensions/set.rb +1 -1
  61. data/lib/mongoid/extensions/string.rb +6 -18
  62. data/lib/mongoid/extensions/symbol.rb +1 -1
  63. data/lib/mongoid/extensions/time.rb +3 -3
  64. data/lib/mongoid/extensions/time_with_zone.rb +1 -1
  65. data/lib/mongoid/factory.rb +8 -6
  66. data/lib/mongoid/fields.rb +41 -8
  67. data/lib/mongoid/fields/foreign_key.rb +3 -3
  68. data/lib/mongoid/fields/localized.rb +1 -1
  69. data/lib/mongoid/fields/standard.rb +5 -17
  70. data/lib/mongoid/fields/validators/macro.rb +15 -5
  71. data/lib/mongoid/{finders.rb → findable.rb} +35 -7
  72. data/lib/mongoid/{indexes.rb → indexable.rb} +50 -55
  73. data/lib/mongoid/indexable/specification.rb +104 -0
  74. data/lib/mongoid/{indexes → indexable}/validators/options.rb +2 -1
  75. data/lib/mongoid/{inspection.rb → inspectable.rb} +15 -11
  76. data/lib/mongoid/{callbacks.rb → interceptable.rb} +30 -62
  77. data/lib/mongoid/log_subscriber.rb +55 -0
  78. data/lib/mongoid/matchable.rb +152 -0
  79. data/lib/mongoid/{matchers → matchable}/all.rb +1 -1
  80. data/lib/mongoid/{matchers → matchable}/and.rb +2 -2
  81. data/lib/mongoid/{matchers → matchable}/default.rb +1 -1
  82. data/lib/mongoid/{matchers → matchable}/exists.rb +1 -1
  83. data/lib/mongoid/{matchers → matchable}/gt.rb +1 -1
  84. data/lib/mongoid/{matchers → matchable}/gte.rb +1 -1
  85. data/lib/mongoid/{matchers → matchable}/in.rb +2 -2
  86. data/lib/mongoid/{matchers → matchable}/lt.rb +1 -1
  87. data/lib/mongoid/{matchers → matchable}/lte.rb +1 -1
  88. data/lib/mongoid/{matchers → matchable}/ne.rb +2 -2
  89. data/lib/mongoid/{matchers → matchable}/nin.rb +3 -2
  90. data/lib/mongoid/{matchers → matchable}/or.rb +2 -2
  91. data/lib/mongoid/{matchers → matchable}/size.rb +1 -1
  92. data/lib/mongoid/persistable.rb +216 -0
  93. data/lib/mongoid/persistable/creatable.rb +189 -0
  94. data/lib/mongoid/persistable/deletable.rb +149 -0
  95. data/lib/mongoid/persistable/destroyable.rb +60 -0
  96. data/lib/mongoid/persistable/incrementable.rb +36 -0
  97. data/lib/mongoid/persistable/logical.rb +38 -0
  98. data/lib/mongoid/persistable/poppable.rb +39 -0
  99. data/lib/mongoid/persistable/pullable.rb +55 -0
  100. data/lib/mongoid/persistable/pushable.rb +62 -0
  101. data/lib/mongoid/persistable/renamable.rb +35 -0
  102. data/lib/mongoid/persistable/savable.rb +52 -0
  103. data/lib/mongoid/persistable/settable.rb +33 -0
  104. data/lib/mongoid/persistable/unsettable.rb +36 -0
  105. data/lib/mongoid/persistable/updatable.rb +153 -0
  106. data/lib/mongoid/persistable/upsertable.rb +55 -0
  107. data/lib/mongoid/positional.rb +71 -0
  108. data/lib/mongoid/query_cache.rb +255 -0
  109. data/lib/mongoid/railtie.rb +34 -60
  110. data/lib/mongoid/railties/database.rake +9 -25
  111. data/lib/mongoid/relations.rb +11 -25
  112. data/lib/mongoid/relations/accessors.rb +15 -51
  113. data/lib/mongoid/relations/auto_save.rb +15 -36
  114. data/lib/mongoid/relations/binding.rb +2 -25
  115. data/lib/mongoid/relations/bindings/embedded/in.rb +1 -1
  116. data/lib/mongoid/relations/bindings/embedded/many.rb +1 -3
  117. data/lib/mongoid/relations/bindings/referenced/in.rb +3 -8
  118. data/lib/mongoid/relations/bindings/referenced/many_to_many.rb +4 -2
  119. data/lib/mongoid/relations/builder.rb +1 -1
  120. data/lib/mongoid/relations/builders.rb +2 -2
  121. data/lib/mongoid/relations/builders/embedded/one.rb +1 -1
  122. data/lib/mongoid/relations/builders/nested_attributes/many.rb +10 -13
  123. data/lib/mongoid/relations/builders/nested_attributes/one.rb +5 -6
  124. data/lib/mongoid/relations/builders/referenced/in.rb +1 -1
  125. data/lib/mongoid/relations/builders/referenced/many.rb +1 -2
  126. data/lib/mongoid/relations/builders/referenced/many_to_many.rb +1 -2
  127. data/lib/mongoid/relations/builders/referenced/one.rb +1 -1
  128. data/lib/mongoid/relations/cascading.rb +3 -5
  129. data/lib/mongoid/relations/constraint.rb +1 -1
  130. data/lib/mongoid/relations/conversions.rb +1 -1
  131. data/lib/mongoid/relations/counter_cache.rb +39 -15
  132. data/lib/mongoid/relations/eager.rb +46 -0
  133. data/lib/mongoid/relations/eager/base.rb +149 -0
  134. data/lib/mongoid/relations/eager/belongs_to.rb +31 -0
  135. data/lib/mongoid/relations/eager/has_and_belongs_to_many.rb +47 -0
  136. data/lib/mongoid/relations/eager/has_many.rb +38 -0
  137. data/lib/mongoid/relations/eager/has_one.rb +30 -0
  138. data/lib/mongoid/relations/embedded/batchable.rb +4 -5
  139. data/lib/mongoid/relations/embedded/in.rb +4 -4
  140. data/lib/mongoid/relations/embedded/many.rb +14 -32
  141. data/lib/mongoid/relations/embedded/one.rb +1 -1
  142. data/lib/mongoid/relations/macros.rb +3 -4
  143. data/lib/mongoid/relations/many.rb +51 -31
  144. data/lib/mongoid/relations/marshalable.rb +3 -3
  145. data/lib/mongoid/relations/metadata.rb +14 -79
  146. data/lib/mongoid/relations/nested_builder.rb +2 -2
  147. data/lib/mongoid/relations/one.rb +1 -1
  148. data/lib/mongoid/relations/options.rb +1 -0
  149. data/lib/mongoid/relations/polymorphic.rb +0 -1
  150. data/lib/mongoid/relations/proxy.rb +21 -41
  151. data/lib/mongoid/relations/referenced/in.rb +4 -20
  152. data/lib/mongoid/relations/referenced/many.rb +22 -35
  153. data/lib/mongoid/relations/referenced/many_to_many.rb +19 -42
  154. data/lib/mongoid/relations/referenced/one.rb +6 -25
  155. data/lib/mongoid/relations/synchronization.rb +4 -4
  156. data/lib/mongoid/relations/targets/enumerable.rb +10 -10
  157. data/lib/mongoid/relations/touchable.rb +34 -1
  158. data/lib/mongoid/{reloading.rb → reloadable.rb} +7 -5
  159. data/lib/mongoid/{scoping.rb → scopable.rb} +36 -36
  160. data/lib/mongoid/selectable.rb +59 -0
  161. data/lib/mongoid/{serialization.rb → serializable.rb} +11 -2
  162. data/lib/mongoid/sessions.rb +37 -345
  163. data/lib/mongoid/sessions/factory.rb +2 -0
  164. data/lib/mongoid/sessions/options.rb +185 -0
  165. data/lib/mongoid/sessions/storage_options.rb +140 -0
  166. data/lib/mongoid/sessions/thread_options.rb +19 -0
  167. data/lib/mongoid/sessions/validators/storage.rb +16 -3
  168. data/lib/mongoid/{sharding.rb → shardable.rb} +5 -1
  169. data/lib/mongoid/{state.rb → stateful.rb} +13 -1
  170. data/lib/mongoid/support/query_counter.rb +23 -0
  171. data/lib/mongoid/tasks/database.rake +31 -0
  172. data/lib/mongoid/tasks/database.rb +107 -0
  173. data/lib/mongoid/threaded.rb +26 -172
  174. data/lib/mongoid/threaded/lifecycle.rb +0 -28
  175. data/lib/mongoid/timestamps/updated/short.rb +2 -2
  176. data/lib/mongoid/{hierarchy.rb → traversable.rb} +15 -7
  177. data/lib/mongoid/{validations.rb → validatable.rb} +23 -10
  178. data/lib/mongoid/{validations → validatable}/associated.rb +4 -2
  179. data/lib/mongoid/{validations → validatable}/format.rb +1 -1
  180. data/lib/mongoid/{validations → validatable}/length.rb +1 -1
  181. data/lib/mongoid/{validations → validatable}/localizable.rb +1 -1
  182. data/lib/mongoid/{validations → validatable}/macros.rb +4 -3
  183. data/lib/mongoid/{validations → validatable}/presence.rb +1 -1
  184. data/lib/mongoid/{validations → validatable}/queryable.rb +1 -2
  185. data/lib/mongoid/{validations → validatable}/uniqueness.rb +25 -21
  186. data/lib/mongoid/version.rb +1 -1
  187. data/lib/rails/generators/mongoid/config/templates/mongoid.yml +46 -25
  188. data/lib/rails/generators/mongoid/model/model_generator.rb +0 -1
  189. data/lib/rails/generators/mongoid/model/templates/model.rb.tt +0 -3
  190. data/lib/rails/generators/mongoid_generator.rb +3 -40
  191. data/lib/rails/mongoid.rb +0 -122
  192. data/lib/support/ruby_version.rb +1 -1
  193. data/spec/app/models/account.rb +2 -6
  194. data/spec/app/models/acolyte.rb +2 -1
  195. data/spec/app/models/actor.rb +0 -1
  196. data/spec/app/models/address.rb +8 -3
  197. data/spec/app/models/animal.rb +1 -1
  198. data/spec/app/models/appointment.rb +3 -3
  199. data/spec/app/models/article.rb +1 -4
  200. data/spec/app/models/audio.rb +5 -0
  201. data/spec/app/models/author.rb +0 -2
  202. data/spec/app/models/band.rb +3 -2
  203. data/spec/app/models/bar.rb +1 -0
  204. data/spec/app/models/book.rb +1 -0
  205. data/spec/app/models/building.rb +0 -2
  206. data/spec/app/models/building_address.rb +0 -2
  207. data/spec/app/models/bus.rb +1 -1
  208. data/spec/app/models/canvas.rb +1 -1
  209. data/spec/app/models/contextable_item.rb +5 -0
  210. data/spec/app/models/contractor.rb +0 -2
  211. data/spec/app/models/country_code.rb +1 -1
  212. data/spec/app/models/definition.rb +2 -2
  213. data/spec/app/models/dog.rb +1 -1
  214. data/spec/app/models/draft.rb +9 -0
  215. data/spec/app/models/dragon.rb +4 -0
  216. data/spec/app/models/drug.rb +1 -3
  217. data/spec/app/models/dungeon.rb +4 -0
  218. data/spec/app/models/edit.rb +5 -0
  219. data/spec/app/models/even.rb +7 -0
  220. data/spec/app/models/event.rb +1 -1
  221. data/spec/app/models/filesystem.rb +1 -0
  222. data/spec/app/models/fish.rb +0 -1
  223. data/spec/app/models/fruits.rb +6 -0
  224. data/spec/app/models/game.rb +0 -2
  225. data/spec/app/models/house.rb +1 -3
  226. data/spec/app/models/id_key.rb +6 -0
  227. data/spec/app/models/item.rb +1 -5
  228. data/spec/app/models/jar.rb +1 -1
  229. data/spec/app/models/label.rb +4 -4
  230. data/spec/app/models/line_item.rb +1 -1
  231. data/spec/app/models/login.rb +1 -1
  232. data/spec/app/models/message.rb +8 -0
  233. data/spec/app/models/movie.rb +1 -0
  234. data/spec/app/models/name.rb +3 -3
  235. data/spec/app/models/note.rb +3 -1
  236. data/spec/app/models/odd.rb +7 -0
  237. data/spec/app/models/oscar.rb +1 -1
  238. data/spec/app/models/parent_doc.rb +1 -1
  239. data/spec/app/models/person.rb +16 -10
  240. data/spec/app/models/phone.rb +1 -3
  241. data/spec/app/models/player.rb +3 -3
  242. data/spec/app/models/post.rb +5 -3
  243. data/spec/app/models/preference.rb +1 -1
  244. data/spec/app/models/quiz.rb +0 -3
  245. data/spec/app/models/record.rb +10 -5
  246. data/spec/app/models/registry.rb +1 -1
  247. data/spec/app/models/server.rb +1 -1
  248. data/spec/app/models/service.rb +3 -3
  249. data/spec/app/models/sound.rb +5 -0
  250. data/spec/app/models/symptom.rb +1 -1
  251. data/spec/app/models/template.rb +1 -1
  252. data/spec/app/models/title.rb +0 -1
  253. data/spec/app/models/track.rb +5 -5
  254. data/spec/app/models/tree.rb +3 -3
  255. data/spec/app/models/video.rb +1 -5
  256. data/spec/app/models/wiki_page.rb +2 -5
  257. data/spec/app/models/word.rb +3 -0
  258. data/spec/app/models/word_origin.rb +1 -1
  259. data/spec/config/mongoid.yml +7 -8
  260. data/spec/helpers.rb +18 -0
  261. data/spec/mongoid/#atomic_spec.rb# +365 -0
  262. data/spec/mongoid/atomic/modifiers_spec.rb +22 -22
  263. data/spec/mongoid/atomic/paths/embedded/many_spec.rb +8 -49
  264. data/spec/mongoid/atomic/paths/embedded/one_spec.rb +7 -49
  265. data/spec/mongoid/atomic/paths/root_spec.rb +3 -61
  266. data/spec/mongoid/atomic/paths_spec.rb +19 -19
  267. data/spec/mongoid/atomic_spec.rb +19 -19
  268. data/spec/mongoid/{nested_attributes_spec.rb → attributes/nested_spec.rb} +474 -592
  269. data/spec/mongoid/attributes/readonly_spec.rb +58 -18
  270. data/spec/mongoid/attributes_spec.rb +349 -434
  271. data/spec/mongoid/{dirty_spec.rb → changeable_spec.rb} +203 -153
  272. data/spec/mongoid/{components_spec.rb → composable_spec.rb} +3 -3
  273. data/spec/mongoid/config/environment_spec.rb +3 -3
  274. data/spec/mongoid/config/options_spec.rb +6 -6
  275. data/spec/mongoid/config_spec.rb +24 -48
  276. data/spec/mongoid/contextual/aggregable/memory_spec.rb +12 -12
  277. data/spec/mongoid/contextual/aggregable/mongo_spec.rb +78 -38
  278. data/spec/mongoid/contextual/atomic_spec.rb +60 -56
  279. data/spec/mongoid/contextual/find_and_modify_spec.rb +14 -14
  280. data/spec/mongoid/contextual/geo_near_spec.rb +22 -22
  281. data/spec/mongoid/contextual/map_reduce_spec.rb +27 -27
  282. data/spec/mongoid/contextual/memory_spec.rb +156 -94
  283. data/spec/mongoid/contextual/mongo_spec.rb +238 -150
  284. data/spec/mongoid/contextual/none_spec.rb +127 -0
  285. data/spec/mongoid/contextual/text_search_spec.rb +209 -0
  286. data/spec/mongoid/copyable_spec.rb +56 -68
  287. data/spec/mongoid/criteria/findable_spec.rb +991 -0
  288. data/spec/mongoid/{criterion/inspection_spec.rb → criteria/inspectable_spec.rb} +5 -5
  289. data/spec/mongoid/{criterion → criteria}/marshalable_spec.rb +2 -2
  290. data/spec/mongoid/criteria/modifiable_spec.rb +1252 -0
  291. data/spec/mongoid/{criterion/scoping_spec.rb → criteria/scopable_spec.rb} +37 -37
  292. data/spec/mongoid/criteria_spec.rb +715 -2421
  293. data/spec/mongoid/document_spec.rb +171 -121
  294. data/spec/mongoid/equality_spec.rb +22 -22
  295. data/spec/mongoid/errors/ambiguous_relationship_spec.rb +3 -3
  296. data/spec/mongoid/errors/callback_spec.rb +3 -3
  297. data/spec/mongoid/errors/delete_restriction_spec.rb +3 -3
  298. data/spec/mongoid/errors/document_not_destroyed_spec.rb +33 -0
  299. data/spec/mongoid/errors/document_not_found_spec.rb +11 -11
  300. data/spec/mongoid/errors/eager_load_spec.rb +3 -3
  301. data/spec/mongoid/errors/invalid_collection_spec.rb +3 -3
  302. data/spec/mongoid/errors/invalid_config_option_spec.rb +3 -3
  303. data/spec/mongoid/errors/invalid_field_option_spec.rb +3 -3
  304. data/spec/mongoid/errors/invalid_field_spec.rb +3 -3
  305. data/spec/mongoid/errors/invalid_find_spec.rb +3 -3
  306. data/spec/mongoid/errors/invalid_includes_spec.rb +3 -3
  307. data/spec/mongoid/errors/invalid_index_spec.rb +3 -3
  308. data/spec/mongoid/errors/invalid_options_spec.rb +3 -3
  309. data/spec/mongoid/errors/invalid_path_spec.rb +3 -3
  310. data/spec/mongoid/errors/invalid_scope_spec.rb +5 -5
  311. data/spec/mongoid/errors/invalid_set_polymorphic_relation_spec.rb +3 -3
  312. data/spec/mongoid/errors/invalid_storage_options_spec.rb +3 -3
  313. data/spec/mongoid/errors/invalid_time_spec.rb +3 -3
  314. data/spec/mongoid/errors/inverse_not_found_spec.rb +3 -3
  315. data/spec/mongoid/errors/mixed_relations_spec.rb +3 -3
  316. data/spec/mongoid/errors/mixed_session_configuration_spec.rb +3 -3
  317. data/spec/mongoid/errors/mongoid_error_spec.rb +8 -8
  318. data/spec/mongoid/errors/nested_attributes_metadata_not_found_spec.rb +3 -3
  319. data/spec/mongoid/errors/no_environment_spec.rb +3 -3
  320. data/spec/mongoid/errors/no_map_reduce_output_spec.rb +3 -3
  321. data/spec/mongoid/errors/no_metadata_spec.rb +3 -3
  322. data/spec/mongoid/errors/no_parent_spec.rb +3 -3
  323. data/spec/mongoid/errors/no_session_config_spec.rb +3 -3
  324. data/spec/mongoid/errors/no_session_database_spec.rb +3 -3
  325. data/spec/mongoid/errors/no_session_hosts_spec.rb +3 -3
  326. data/spec/mongoid/errors/no_sessions_config_spec.rb +3 -3
  327. data/spec/mongoid/errors/readonly_attribute_spec.rb +3 -3
  328. data/spec/mongoid/errors/readonly_document_spec.rb +29 -0
  329. data/spec/mongoid/errors/scope_overwrite_spec.rb +3 -3
  330. data/spec/mongoid/errors/too_many_nested_attribute_records_spec.rb +3 -3
  331. data/spec/mongoid/errors/unknown_attribute_spec.rb +5 -5
  332. data/spec/mongoid/errors/unsaved_document_spec.rb +3 -3
  333. data/spec/mongoid/errors/unsupported_javascript_spec.rb +3 -3
  334. data/spec/mongoid/errors/validations_spec.rb +7 -7
  335. data/spec/mongoid/extensions/array_spec.rb +61 -61
  336. data/spec/mongoid/extensions/big_decimal_spec.rb +11 -11
  337. data/spec/mongoid/extensions/binary_spec.rb +12 -12
  338. data/spec/mongoid/extensions/boolean_spec.rb +18 -18
  339. data/spec/mongoid/extensions/date_spec.rb +13 -13
  340. data/spec/mongoid/extensions/date_time_spec.rb +8 -8
  341. data/spec/mongoid/extensions/false_class_spec.rb +5 -5
  342. data/spec/mongoid/extensions/float_spec.rb +29 -15
  343. data/spec/mongoid/extensions/hash_spec.rb +29 -29
  344. data/spec/mongoid/extensions/integer_spec.rb +15 -15
  345. data/spec/mongoid/extensions/module_spec.rb +2 -2
  346. data/spec/mongoid/extensions/nil_class_spec.rb +1 -1
  347. data/spec/mongoid/extensions/object_id_spec.rb +134 -134
  348. data/spec/mongoid/extensions/object_spec.rb +26 -26
  349. data/spec/mongoid/extensions/range_spec.rb +61 -12
  350. data/spec/mongoid/extensions/regexp_spec.rb +4 -4
  351. data/spec/mongoid/extensions/set_spec.rb +4 -4
  352. data/spec/mongoid/extensions/string_spec.rb +35 -46
  353. data/spec/mongoid/extensions/symbol_spec.rb +9 -9
  354. data/spec/mongoid/extensions/time_spec.rb +49 -49
  355. data/spec/mongoid/extensions/time_with_zone_spec.rb +34 -34
  356. data/spec/mongoid/extensions/true_class_spec.rb +5 -5
  357. data/spec/mongoid/extensions_spec.rb +29 -0
  358. data/spec/mongoid/factory_spec.rb +15 -15
  359. data/spec/mongoid/fields/foreign_key_spec.rb +73 -66
  360. data/spec/mongoid/fields/internal/foreign_keys/array_spec.rb +15 -15
  361. data/spec/mongoid/fields/internal/foreign_keys/object_spec.rb +22 -22
  362. data/spec/mongoid/fields/localized_spec.rb +38 -23
  363. data/spec/mongoid/fields/standard_spec.rb +12 -12
  364. data/spec/mongoid/fields_spec.rb +263 -217
  365. data/spec/mongoid/findable_spec.rb +509 -0
  366. data/spec/mongoid/indexable/specification_spec.rb +102 -0
  367. data/spec/mongoid/{indexes_spec.rb → indexable_spec.rb} +171 -51
  368. data/spec/mongoid/{inspection_spec.rb → inspectable_spec.rb} +6 -14
  369. data/spec/mongoid/{callbacks_spec.rb → interceptable_spec.rb} +117 -116
  370. data/spec/mongoid/log_subscriber_spec.rb +75 -0
  371. data/spec/mongoid/loggable_spec.rb +1 -1
  372. data/spec/mongoid/{matchers → matchable}/all_spec.rb +4 -4
  373. data/spec/mongoid/{matchers → matchable}/and_spec.rb +11 -11
  374. data/spec/mongoid/{matchers → matchable}/default_spec.rb +15 -15
  375. data/spec/mongoid/{matchers → matchable}/exists_spec.rb +5 -5
  376. data/spec/mongoid/{matchers → matchable}/gt_spec.rb +9 -8
  377. data/spec/mongoid/{matchers → matchable}/gte_spec.rb +7 -7
  378. data/spec/mongoid/matchable/in_spec.rb +49 -0
  379. data/spec/mongoid/{matchers → matchable}/lt_spec.rb +7 -7
  380. data/spec/mongoid/{matchers → matchable}/lte_spec.rb +7 -7
  381. data/spec/mongoid/matchable/ne_spec.rb +46 -0
  382. data/spec/mongoid/matchable/nin_spec.rb +48 -0
  383. data/spec/mongoid/{matchers → matchable}/or_spec.rb +6 -6
  384. data/spec/mongoid/{matchers → matchable}/size_spec.rb +3 -3
  385. data/spec/mongoid/{matchers_spec.rb → matchable_spec.rb} +41 -41
  386. data/spec/mongoid/persistable/creatable_spec.rb +553 -0
  387. data/spec/mongoid/persistable/deletable_spec.rb +218 -0
  388. data/spec/mongoid/persistable/destroyable_spec.rb +192 -0
  389. data/spec/mongoid/persistable/incrementable_spec.rb +173 -0
  390. data/spec/mongoid/persistable/logical_spec.rb +143 -0
  391. data/spec/mongoid/persistable/poppable_spec.rb +115 -0
  392. data/spec/mongoid/persistable/pullable_spec.rb +228 -0
  393. data/spec/mongoid/persistable/pushable_spec.rb +258 -0
  394. data/spec/mongoid/persistable/renamable_spec.rb +135 -0
  395. data/spec/mongoid/persistable/savable_spec.rb +498 -0
  396. data/spec/mongoid/persistable/settable_spec.rb +162 -0
  397. data/spec/mongoid/persistable/unsettable_spec.rb +155 -0
  398. data/spec/mongoid/persistable/updatable_spec.rb +558 -0
  399. data/spec/mongoid/persistable/upsertable_spec.rb +106 -0
  400. data/spec/mongoid/persistable_spec.rb +206 -0
  401. data/spec/mongoid/{atomic/positionable_spec.rb → positional_spec.rb} +14 -19
  402. data/spec/mongoid/query_cache_spec.rb +263 -0
  403. data/spec/mongoid/railties/document_spec.rb +2 -2
  404. data/spec/mongoid/relations/accessors_spec.rb +53 -145
  405. data/spec/mongoid/relations/auto_save_spec.rb +37 -17
  406. data/spec/mongoid/relations/bindings/embedded/in_spec.rb +12 -12
  407. data/spec/mongoid/relations/bindings/embedded/many_spec.rb +3 -3
  408. data/spec/mongoid/relations/bindings/embedded/one_spec.rb +5 -5
  409. data/spec/mongoid/relations/bindings/referenced/in_spec.rb +26 -26
  410. data/spec/mongoid/relations/bindings/referenced/many_spec.rb +10 -10
  411. data/spec/mongoid/relations/bindings/referenced/many_to_many_spec.rb +19 -19
  412. data/spec/mongoid/relations/bindings/referenced/one_spec.rb +12 -12
  413. data/spec/mongoid/relations/builders/embedded/in_spec.rb +4 -4
  414. data/spec/mongoid/relations/builders/embedded/many_spec.rb +18 -18
  415. data/spec/mongoid/relations/builders/embedded/one_spec.rb +11 -11
  416. data/spec/mongoid/relations/builders/nested_attributes/many_spec.rb +12 -13
  417. data/spec/mongoid/relations/builders/nested_attributes/one_spec.rb +14 -14
  418. data/spec/mongoid/relations/builders/referenced/in_spec.rb +24 -35
  419. data/spec/mongoid/relations/builders/referenced/many_spec.rb +15 -15
  420. data/spec/mongoid/relations/builders/referenced/many_to_many_spec.rb +18 -18
  421. data/spec/mongoid/relations/builders/referenced/one_spec.rb +12 -25
  422. data/spec/mongoid/relations/builders_spec.rb +21 -21
  423. data/spec/mongoid/relations/cascading/delete_spec.rb +9 -9
  424. data/spec/mongoid/relations/cascading/destroy_spec.rb +6 -6
  425. data/spec/mongoid/relations/cascading/nullify_spec.rb +4 -4
  426. data/spec/mongoid/relations/cascading/restrict_spec.rb +7 -7
  427. data/spec/mongoid/relations/cascading_spec.rb +16 -16
  428. data/spec/mongoid/relations/constraint_spec.rb +8 -7
  429. data/spec/mongoid/relations/conversions_spec.rb +16 -14
  430. data/spec/mongoid/relations/counter_cache_spec.rb +85 -0
  431. data/spec/mongoid/relations/cyclic_spec.rb +18 -18
  432. data/spec/mongoid/relations/eager/belongs_to_spec.rb +154 -0
  433. data/spec/mongoid/relations/eager/has_and_belongs_to_many_spec.rb +117 -0
  434. data/spec/mongoid/relations/eager/has_many_spec.rb +207 -0
  435. data/spec/mongoid/relations/eager/has_one_spec.rb +163 -0
  436. data/spec/mongoid/relations/eager_spec.rb +228 -0
  437. data/spec/mongoid/relations/embedded/dirty_spec.rb +8 -8
  438. data/spec/mongoid/relations/embedded/in_spec.rb +56 -57
  439. data/spec/mongoid/relations/embedded/many_spec.rb +467 -372
  440. data/spec/mongoid/relations/embedded/one_spec.rb +108 -141
  441. data/spec/mongoid/relations/macros_spec.rb +108 -102
  442. data/spec/mongoid/relations/metadata_spec.rb +180 -255
  443. data/spec/mongoid/relations/options_spec.rb +1 -1
  444. data/spec/mongoid/relations/polymorphic_spec.rb +13 -17
  445. data/spec/mongoid/relations/proxy_spec.rb +2 -2
  446. data/spec/mongoid/relations/referenced/in_spec.rb +128 -303
  447. data/spec/mongoid/relations/referenced/many_spec.rb +587 -527
  448. data/spec/mongoid/relations/referenced/many_to_many_spec.rb +401 -424
  449. data/spec/mongoid/relations/referenced/one_spec.rb +149 -264
  450. data/spec/mongoid/relations/reflections_spec.rb +6 -6
  451. data/spec/mongoid/relations/synchronization_spec.rb +46 -50
  452. data/spec/mongoid/relations/targets/enumerable_spec.rb +118 -118
  453. data/spec/mongoid/relations/touchable_spec.rb +333 -0
  454. data/spec/mongoid/relations_spec.rb +16 -15
  455. data/spec/mongoid/{reloading_spec.rb → reloadable_spec.rb} +38 -55
  456. data/spec/mongoid/{scoping_spec.rb → scopable_spec.rb} +89 -164
  457. data/spec/mongoid/selectable_spec.rb +134 -0
  458. data/spec/mongoid/{serialization_spec.rb → serializable_spec.rb} +129 -82
  459. data/spec/mongoid/sessions/factory_spec.rb +49 -28
  460. data/spec/mongoid/sessions/mongo_uri_spec.rb +7 -7
  461. data/spec/mongoid/sessions/options_spec.rb +108 -0
  462. data/spec/mongoid/sessions_spec.rb +319 -178
  463. data/spec/mongoid/{sharding_spec.rb → shardable_spec.rb} +8 -8
  464. data/spec/mongoid/{state_spec.rb → stateful_spec.rb} +36 -11
  465. data/spec/mongoid/tasks/database_rake_spec.rb +285 -0
  466. data/spec/mongoid/tasks/database_spec.rb +160 -0
  467. data/spec/mongoid/threaded_spec.rb +17 -70
  468. data/spec/mongoid/timestamps/created/short_spec.rb +6 -6
  469. data/spec/mongoid/timestamps/created_spec.rb +5 -5
  470. data/spec/mongoid/timestamps/timeless_spec.rb +6 -6
  471. data/spec/mongoid/timestamps/updated/short_spec.rb +11 -11
  472. data/spec/mongoid/timestamps/updated_spec.rb +9 -13
  473. data/spec/mongoid/timestamps_spec.rb +9 -13
  474. data/spec/mongoid/{hierarchy_spec.rb → traversable_spec.rb} +19 -19
  475. data/spec/mongoid/{validations → validatable}/associated_spec.rb +45 -22
  476. data/spec/mongoid/{validations → validatable}/format_spec.rb +6 -6
  477. data/spec/mongoid/{validations → validatable}/length_spec.rb +14 -14
  478. data/spec/mongoid/{validations → validatable}/numericality_spec.rb +1 -1
  479. data/spec/mongoid/{validations → validatable}/presence_spec.rb +37 -44
  480. data/spec/mongoid/{validations → validatable}/uniqueness_spec.rb +184 -192
  481. data/spec/mongoid/{validations_spec.rb → validatable_spec.rb} +28 -28
  482. data/spec/mongoid_spec.rb +8 -8
  483. data/spec/rails/mongoid_spec.rb +19 -335
  484. data/spec/spec_helper.rb +31 -13
  485. metadata +303 -283
  486. data/lib/mongoid/atomic/positionable.rb +0 -73
  487. data/lib/mongoid/components.rb +0 -92
  488. data/lib/mongoid/config/inflections.rb +0 -6
  489. data/lib/mongoid/contextual/eager.rb +0 -158
  490. data/lib/mongoid/errors/versioning_not_on_root.rb +0 -23
  491. data/lib/mongoid/identity_map.rb +0 -163
  492. data/lib/mongoid/json.rb +0 -16
  493. data/lib/mongoid/matchers.rb +0 -32
  494. data/lib/mongoid/matchers/strategies.rb +0 -97
  495. data/lib/mongoid/multi_parameter_attributes.rb +0 -105
  496. data/lib/mongoid/nested_attributes.rb +0 -78
  497. data/lib/mongoid/observer.rb +0 -192
  498. data/lib/mongoid/paranoia.rb +0 -136
  499. data/lib/mongoid/persistence.rb +0 -357
  500. data/lib/mongoid/persistence/atomic.rb +0 -231
  501. data/lib/mongoid/persistence/atomic/add_to_set.rb +0 -47
  502. data/lib/mongoid/persistence/atomic/bit.rb +0 -35
  503. data/lib/mongoid/persistence/atomic/inc.rb +0 -45
  504. data/lib/mongoid/persistence/atomic/operation.rb +0 -154
  505. data/lib/mongoid/persistence/atomic/pop.rb +0 -32
  506. data/lib/mongoid/persistence/atomic/pull.rb +0 -32
  507. data/lib/mongoid/persistence/atomic/pull_all.rb +0 -32
  508. data/lib/mongoid/persistence/atomic/push.rb +0 -25
  509. data/lib/mongoid/persistence/atomic/push_all.rb +0 -25
  510. data/lib/mongoid/persistence/atomic/rename.rb +0 -30
  511. data/lib/mongoid/persistence/atomic/sets.rb +0 -28
  512. data/lib/mongoid/persistence/atomic/unset.rb +0 -27
  513. data/lib/mongoid/persistence/deletion.rb +0 -31
  514. data/lib/mongoid/persistence/insertion.rb +0 -38
  515. data/lib/mongoid/persistence/modification.rb +0 -35
  516. data/lib/mongoid/persistence/operations.rb +0 -214
  517. data/lib/mongoid/persistence/operations/embedded/insert.rb +0 -46
  518. data/lib/mongoid/persistence/operations/embedded/remove.rb +0 -43
  519. data/lib/mongoid/persistence/operations/insert.rb +0 -34
  520. data/lib/mongoid/persistence/operations/remove.rb +0 -33
  521. data/lib/mongoid/persistence/operations/update.rb +0 -59
  522. data/lib/mongoid/persistence/operations/upsert.rb +0 -28
  523. data/lib/mongoid/persistence/upsertion.rb +0 -31
  524. data/lib/mongoid/unit_of_work.rb +0 -61
  525. data/lib/mongoid/versioning.rb +0 -217
  526. data/lib/rack/mongoid.rb +0 -2
  527. data/lib/rack/mongoid/middleware/identity_map.rb +0 -39
  528. data/lib/rails/generators/mongoid/observer/observer_generator.rb +0 -17
  529. data/lib/rails/generators/mongoid/observer/templates/observer.rb.tt +0 -4
  530. data/spec/app/models/actor_observer.rb +0 -15
  531. data/spec/app/models/callback_recorder.rb +0 -25
  532. data/spec/app/models/paranoid_phone.rb +0 -25
  533. data/spec/app/models/paranoid_post.rb +0 -36
  534. data/spec/app/models/phone_observer.rb +0 -6
  535. data/spec/mongoid/attributes/processing_spec.rb +0 -149
  536. data/spec/mongoid/criterion/destructive_spec.rb +0 -101
  537. data/spec/mongoid/criterion/modifiable_spec.rb +0 -409
  538. data/spec/mongoid/criterion/modification_spec.rb +0 -402
  539. data/spec/mongoid/errors/versioning_not_on_root_spec.rb +0 -29
  540. data/spec/mongoid/finders_spec.rb +0 -321
  541. data/spec/mongoid/identity_map_spec.rb +0 -564
  542. data/spec/mongoid/json_spec.rb +0 -33
  543. data/spec/mongoid/matchers/in_spec.rb +0 -25
  544. data/spec/mongoid/matchers/ne_spec.rb +0 -25
  545. data/spec/mongoid/matchers/nin_spec.rb +0 -25
  546. data/spec/mongoid/multi_parameter_attributes_spec.rb +0 -128
  547. data/spec/mongoid/observer_spec.rb +0 -290
  548. data/spec/mongoid/paranoia_spec.rb +0 -759
  549. data/spec/mongoid/persistence/atomic/add_to_set_spec.rb +0 -262
  550. data/spec/mongoid/persistence/atomic/bit_spec.rb +0 -88
  551. data/spec/mongoid/persistence/atomic/inc_spec.rb +0 -133
  552. data/spec/mongoid/persistence/atomic/pop_spec.rb +0 -111
  553. data/spec/mongoid/persistence/atomic/pull_all_spec.rb +0 -77
  554. data/spec/mongoid/persistence/atomic/pull_spec.rb +0 -80
  555. data/spec/mongoid/persistence/atomic/push_all_spec.rb +0 -77
  556. data/spec/mongoid/persistence/atomic/push_spec.rb +0 -77
  557. data/spec/mongoid/persistence/atomic/rename_spec.rb +0 -42
  558. data/spec/mongoid/persistence/atomic/sets_spec.rb +0 -154
  559. data/spec/mongoid/persistence/atomic/unset_spec.rb +0 -65
  560. data/spec/mongoid/persistence/atomic_spec.rb +0 -216
  561. data/spec/mongoid/persistence/operations/embedded/insert_spec.rb +0 -191
  562. data/spec/mongoid/persistence/operations/embedded/remove_spec.rb +0 -8
  563. data/spec/mongoid/persistence/operations/insert_spec.rb +0 -149
  564. data/spec/mongoid/persistence/operations/remove_spec.rb +0 -113
  565. data/spec/mongoid/persistence/operations/update_spec.rb +0 -141
  566. data/spec/mongoid/persistence/operations/upsert_spec.rb +0 -59
  567. data/spec/mongoid/persistence/operations_spec.rb +0 -313
  568. data/spec/mongoid/persistence_spec.rb +0 -2279
  569. data/spec/mongoid/unit_of_work_spec.rb +0 -196
  570. data/spec/mongoid/versioning_spec.rb +0 -540
  571. data/spec/rack/mongoid/middleware/identity_map_spec.rb +0 -72
@@ -0,0 +1,106 @@
1
+ require "spec_helper"
2
+
3
+ describe Mongoid::Persistable::Upsertable do
4
+
5
+ describe "#upsert" do
6
+
7
+ context "when the document validates on upsert" do
8
+
9
+ let(:account) do
10
+ Account.new(name: "testing")
11
+ end
12
+
13
+ context "when the document is not valid in the upsert context" do
14
+
15
+ before do
16
+ account.upsert
17
+ end
18
+
19
+ it "adds the validation errors" do
20
+ expect(account.errors[:nickname]).to_not be_empty
21
+ end
22
+
23
+ it "does not upsert the document" do
24
+ expect(account).to be_a_new_record
25
+ end
26
+ end
27
+ end
28
+
29
+ context "when the document is new" do
30
+
31
+ let!(:existing) do
32
+ Band.create(name: "Photek")
33
+ end
34
+
35
+ context "when a matching document exists in the db" do
36
+
37
+ let(:updated) do
38
+ Band.new(name: "Tool") do |band|
39
+ band.id = existing.id
40
+ end
41
+ end
42
+
43
+ before do
44
+ updated.upsert
45
+ end
46
+
47
+ it "updates the existing document" do
48
+ expect(existing.reload.name).to eq("Tool")
49
+ end
50
+
51
+ it "flags the document as persisted" do
52
+ expect(existing).to be_persisted
53
+ end
54
+ end
55
+
56
+ context "when no matching document exists in the db" do
57
+
58
+ let(:insert) do
59
+ Band.new(name: "Tool")
60
+ end
61
+
62
+ before do
63
+ insert.upsert
64
+ end
65
+
66
+ it "inserts a new document" do
67
+ expect(insert.reload).to eq(insert)
68
+ end
69
+
70
+ it "does not modify any fields" do
71
+ expect(insert.reload.name).to eq("Tool")
72
+ end
73
+
74
+ it "flags the document as persisted" do
75
+ expect(insert).to be_persisted
76
+ end
77
+ end
78
+ end
79
+
80
+ context "when the document is not new" do
81
+
82
+ let!(:existing) do
83
+ Band.create(name: "Photek")
84
+ end
85
+
86
+ context "when updating fields outside of the id" do
87
+
88
+ before do
89
+ existing.name = "Depeche Mode"
90
+ end
91
+
92
+ let!(:upsert) do
93
+ existing.upsert
94
+ end
95
+
96
+ it "updates the existing document" do
97
+ expect(existing.reload.name).to eq("Depeche Mode")
98
+ end
99
+
100
+ it "returns true" do
101
+ expect(upsert).to be true
102
+ end
103
+ end
104
+ end
105
+ end
106
+ end
@@ -0,0 +1,206 @@
1
+ require "spec_helper"
2
+
3
+ describe Mongoid::Persistable do
4
+
5
+ describe "#atomically" do
6
+
7
+ let(:document) do
8
+ Band.create(member_count: 0, likes: 60, origin: "London")
9
+ end
10
+
11
+ context "when providing a block" do
12
+
13
+ shared_examples_for "an atomically updatable root document" do
14
+
15
+ it "performs inc updates" do
16
+ expect(document.member_count).to eq(10)
17
+ end
18
+
19
+ it "performs bit updates" do
20
+ expect(document.likes).to eq(12)
21
+ end
22
+
23
+ it "performs set updates" do
24
+ expect(document.name).to eq("Placebo")
25
+ end
26
+
27
+ it "performs unset updates" do
28
+ expect(document.origin).to be_nil
29
+ end
30
+
31
+ it "returns true" do
32
+ expect(update).to be true
33
+ end
34
+
35
+ it "persists inc updates" do
36
+ expect(document.reload.member_count).to eq(10)
37
+ end
38
+
39
+ it "persists bit updates" do
40
+ expect(document.reload.likes).to eq(12)
41
+ end
42
+
43
+ it "persists set updates" do
44
+ expect(document.reload.name).to eq("Placebo")
45
+ end
46
+
47
+ it "persists unset updates" do
48
+ expect(document.reload.origin).to be_nil
49
+ end
50
+ end
51
+
52
+ context "when not chaining the operations" do
53
+
54
+ let(:operations) do
55
+ {
56
+ "$inc" => { "member_count" => 10 },
57
+ "$bit" => { "likes" => { :and => 13 }},
58
+ "$set" => { "name" => "Placebo" },
59
+ "$unset" => { "origin" => true }
60
+ }
61
+ end
62
+
63
+ before do
64
+ expect_any_instance_of(Moped::Query).to receive(:update).with(operations).and_call_original
65
+ end
66
+
67
+ let!(:update) do
68
+ document.atomically do
69
+ document.inc(member_count: 10)
70
+ document.bit(likes: { and: 13 })
71
+ document.set(name: "Placebo")
72
+ document.unset(:origin)
73
+ end
74
+ end
75
+
76
+ it_behaves_like "an atomically updatable root document"
77
+ end
78
+
79
+ context "when chaining the operations" do
80
+
81
+ let(:operations) do
82
+ {
83
+ "$inc" => { "member_count" => 10 },
84
+ "$bit" => { "likes" => { :and => 13 }},
85
+ "$set" => { "name" => "Placebo" },
86
+ "$unset" => { "origin" => true }
87
+ }
88
+ end
89
+
90
+ before do
91
+ expect_any_instance_of(Moped::Query).to receive(:update).with(operations).and_call_original
92
+ end
93
+
94
+ let!(:update) do
95
+ document.atomically do
96
+ document.
97
+ inc(member_count: 10).
98
+ bit(likes: { and: 13 }).
99
+ set(name: "Placebo").
100
+ unset(:origin)
101
+ end
102
+ end
103
+
104
+ it_behaves_like "an atomically updatable root document"
105
+ end
106
+
107
+ context "when given multiple operations of the same type" do
108
+
109
+ let(:operations) do
110
+ {
111
+ "$inc" => { "member_count" => 10, "other_count" => 10 },
112
+ "$bit" => { "likes" => { :and => 13 }},
113
+ "$set" => { "name" => "Placebo" },
114
+ "$unset" => { "origin" => true }
115
+ }
116
+ end
117
+
118
+ before do
119
+ expect_any_instance_of(Moped::Query).to receive(:update).with(operations).and_call_original
120
+ end
121
+
122
+ let!(:update) do
123
+ document.atomically do
124
+ document.
125
+ inc(member_count: 10).
126
+ inc(other_count: 10).
127
+ bit(likes: { and: 13 }).
128
+ set(name: "Placebo").
129
+ unset(:origin)
130
+ end
131
+ end
132
+
133
+ it_behaves_like "an atomically updatable root document"
134
+
135
+ it "performs multiple inc updates" do
136
+ expect(document.other_count).to eq(10)
137
+ end
138
+
139
+ it "persists multiple inc updates" do
140
+ expect(document.reload.other_count).to eq(10)
141
+ end
142
+ end
143
+
144
+ context "when expecting the document to be yielded" do
145
+
146
+ let(:operations) do
147
+ {
148
+ "$inc" => { "member_count" => 10 },
149
+ "$bit" => { "likes" => { :and => 13 }},
150
+ "$set" => { "name" => "Placebo" },
151
+ "$unset" => { "origin" => true }
152
+ }
153
+ end
154
+
155
+ before do
156
+ expect_any_instance_of(Moped::Query).to receive(:update).with(operations).and_call_original
157
+ end
158
+
159
+ let!(:update) do
160
+ document.atomically do |doc|
161
+ doc.
162
+ inc(member_count: 10).
163
+ bit(likes: { and: 13 }).
164
+ set(name: "Placebo").
165
+ unset(:origin)
166
+ end
167
+ end
168
+
169
+ it_behaves_like "an atomically updatable root document"
170
+ end
171
+ end
172
+
173
+ context "when providing no block "do
174
+
175
+ it "returns true" do
176
+ expect(document.atomically).to be true
177
+ end
178
+ end
179
+ end
180
+
181
+ describe "#fail_due_to_valiation!" do
182
+
183
+ let(:document) do
184
+ Band.new
185
+ end
186
+
187
+ it "raises the validation error" do
188
+ expect {
189
+ document.fail_due_to_validation!
190
+ }.to raise_error(Mongoid::Errors::Validations)
191
+ end
192
+ end
193
+
194
+ describe "#fail_due_to_callback!" do
195
+
196
+ let(:document) do
197
+ Band.new
198
+ end
199
+
200
+ it "raises the callback error" do
201
+ expect {
202
+ document.fail_due_to_callback!(:save!)
203
+ }.to raise_error(Mongoid::Errors::Callback)
204
+ end
205
+ end
206
+ end
@@ -1,12 +1,12 @@
1
1
  require "spec_helper"
2
2
 
3
- describe Mongoid::Atomic::Positionable do
3
+ describe Mongoid::Positional do
4
4
 
5
5
  describe "#positionally" do
6
6
 
7
7
  let(:positionable) do
8
8
  Class.new do
9
- include Mongoid::Atomic::Positionable
9
+ include Mongoid::Positional
10
10
  end.new
11
11
  end
12
12
 
@@ -15,8 +15,7 @@ describe Mongoid::Atomic::Positionable do
15
15
  "$set" => {
16
16
  "field" => "value",
17
17
  "children.0.field" => "value",
18
- "children.0.children.1.children.3.field" => "value",
19
- "children.0.children.1.children.3.field" => "value",
18
+ "children.0.children.1.children.3.field" => "value"
20
19
  },
21
20
  "$pushAll" => {
22
21
  "children.0.children.1.children.3.fields" => [ "value", "value" ]
@@ -46,7 +45,7 @@ describe Mongoid::Atomic::Positionable do
46
45
  end
47
46
 
48
47
  it "does not do any replacement" do
49
- processed.should eq(ops)
48
+ expect(processed).to eq(ops)
50
49
  end
51
50
  end
52
51
 
@@ -80,7 +79,7 @@ describe Mongoid::Atomic::Positionable do
80
79
  end
81
80
 
82
81
  it "does not do any replacement" do
83
- processed.should eq(expected)
82
+ expect(processed).to eq(expected)
84
83
  end
85
84
  end
86
85
  end
@@ -96,7 +95,7 @@ describe Mongoid::Atomic::Positionable do
96
95
  end
97
96
 
98
97
  it "does not do any replacement" do
99
- processed.should eq(updates)
98
+ expect(processed).to eq(updates)
100
99
  end
101
100
  end
102
101
 
@@ -113,8 +112,7 @@ describe Mongoid::Atomic::Positionable do
113
112
  "$set" => {
114
113
  "field" => "value",
115
114
  "children.$.field" => "value",
116
- "children.$.children.1.children.3.field" => "value",
117
- "children.$.children.1.children.3.field" => "value",
115
+ "children.$.children.1.children.3.field" => "value"
118
116
  },
119
117
  "$pushAll" => {
120
118
  "children.$.children.1.children.3.fields" => [ "value", "value" ]
@@ -127,7 +125,7 @@ describe Mongoid::Atomic::Positionable do
127
125
  end
128
126
 
129
127
  it "replaces the first index with the positional operator" do
130
- processed.should eq(expected)
128
+ expect(processed).to eq(expected)
131
129
  end
132
130
  end
133
131
 
@@ -142,8 +140,7 @@ describe Mongoid::Atomic::Positionable do
142
140
  "$set" => {
143
141
  "field" => "value",
144
142
  "children.0.field" => "value",
145
- "children.0.children.1.children.3.field" => "value",
146
- "children.0.children.1.children.3.field" => "value",
143
+ "children.0.children.1.children.3.field" => "value"
147
144
  },
148
145
  "$pushAll" => {
149
146
  "children.0.children.1.children.3.fields" => [ "value", "value" ]
@@ -156,7 +153,7 @@ describe Mongoid::Atomic::Positionable do
156
153
  end
157
154
 
158
155
  it "replaces the first index with the positional operator" do
159
- processed.should eq(expected)
156
+ expect(processed).to eq(expected)
160
157
  end
161
158
  end
162
159
  end
@@ -172,8 +169,7 @@ describe Mongoid::Atomic::Positionable do
172
169
  "$set" => {
173
170
  "field" => "value",
174
171
  "children.$.field" => "value",
175
- "children.0.children.$.children.3.field" => "value",
176
- "children.0.children.$.children.3.field" => "value",
172
+ "children.0.children.$.children.3.field" => "value"
177
173
  },
178
174
  "$pushAll" => {
179
175
  "children.0.children.$.children.3.fields" => [ "value", "value" ]
@@ -186,7 +182,7 @@ describe Mongoid::Atomic::Positionable do
186
182
  end
187
183
 
188
184
  it "replaces the first index with the positional operator" do
189
- processed.should eq(expected)
185
+ expect(processed).to eq(expected)
190
186
  end
191
187
  end
192
188
 
@@ -206,8 +202,7 @@ describe Mongoid::Atomic::Positionable do
206
202
  "$set" => {
207
203
  "field" => "value",
208
204
  "children.$.field" => "value",
209
- "children.0.children.1.children.$.field" => "value",
210
- "children.0.children.1.children.$.field" => "value",
205
+ "children.0.children.1.children.$.field" => "value"
211
206
  },
212
207
  "$pushAll" => {
213
208
  "children.0.children.1.children.$.fields" => [ "value", "value" ]
@@ -220,7 +215,7 @@ describe Mongoid::Atomic::Positionable do
220
215
  end
221
216
 
222
217
  it "replaces the first index with the positional operator" do
223
- processed.should eq(expected)
218
+ expect(processed).to eq(expected)
224
219
  end
225
220
  end
226
221
  end
@@ -0,0 +1,263 @@
1
+ require "spec_helper"
2
+
3
+ describe Mongoid::QueryCache do
4
+
5
+ around do |spec|
6
+ Mongoid::QueryCache.clear_cache
7
+ Mongoid::QueryCache.cache { spec.run }
8
+ end
9
+
10
+ context "when querying for a single document" do
11
+
12
+ [ :first, :one, :last ].each do |method|
13
+
14
+ before do
15
+ Band.all.send(method)
16
+ end
17
+
18
+ context "when query cache disable" do
19
+
20
+ before do
21
+ Mongoid::QueryCache.enabled = false
22
+ end
23
+
24
+ it "queries again" do
25
+ expect_query(1) do
26
+ Band.all.send(method)
27
+ end
28
+ end
29
+ end
30
+
31
+ context "with same selector" do
32
+
33
+ it "does not query again" do
34
+ expect_no_queries do
35
+ Band.all.send(method)
36
+ end
37
+ end
38
+ end
39
+
40
+ context "with different selector" do
41
+
42
+ it "queries again" do
43
+ expect_query(1) do
44
+ Band.where(id: 1).send(method)
45
+ end
46
+ end
47
+ end
48
+ end
49
+ end
50
+
51
+ context "when querying in the same collection" do
52
+
53
+ before do
54
+ Band.all.to_a
55
+ end
56
+
57
+ context "when query cache disable" do
58
+
59
+ before do
60
+ Mongoid::QueryCache.enabled = false
61
+ end
62
+
63
+ it "queries again" do
64
+ expect_query(1) do
65
+ Band.all.to_a
66
+ end
67
+ end
68
+ end
69
+
70
+ context "with same selector" do
71
+
72
+ it "does not query again" do
73
+ expect_no_queries do
74
+ Band.all.to_a
75
+ end
76
+ end
77
+
78
+ context "when querying only the first" do
79
+ let(:game) { Game.create!(name: "2048") }
80
+
81
+ before do
82
+ game.ratings.where(:value.gt => 5).asc(:id).all.to_a
83
+ end
84
+
85
+ it "queries again" do
86
+ expect_query(1) do
87
+ game.ratings.where(:value.gt => 5).asc(:id).first
88
+ end
89
+ end
90
+ end
91
+
92
+ context "limiting the result" do
93
+ it "queries again" do
94
+ expect_query(1) do
95
+ Band.limit(2).all.to_a
96
+ end
97
+ end
98
+ end
99
+
100
+ context "specifying a different skip value" do
101
+ before do
102
+ Band.limit(2).skip(1).all.to_a
103
+ end
104
+
105
+ it "queries again" do
106
+ expect_query(1) do
107
+ Band.limit(2).skip(3).all.to_a
108
+ end
109
+ end
110
+ end
111
+ end
112
+
113
+ context "with different selector" do
114
+
115
+ it "queries again" do
116
+ expect_query(1) do
117
+ Band.where(id: 1).to_a
118
+ end
119
+ end
120
+ end
121
+ end
122
+
123
+ context "when querying in different collection" do
124
+
125
+ before do
126
+ Person.all.to_a
127
+ end
128
+
129
+ it "queries again" do
130
+ expect_query(1) do
131
+ Band.all.to_a
132
+ end
133
+ end
134
+ end
135
+
136
+ context "when inserting a new document" do
137
+
138
+ before do
139
+ Band.all.to_a
140
+ Band.create!
141
+ end
142
+
143
+ it "queries again" do
144
+ expect_query(1) do
145
+ Band.all.to_a
146
+ end
147
+ end
148
+ end
149
+
150
+ context "when deleting all documents" do
151
+
152
+ before do
153
+ Band.create!
154
+ Band.all.to_a
155
+ Band.delete_all
156
+ end
157
+
158
+ it "queries again" do
159
+ expect_query(1) do
160
+ Band.all.to_a
161
+ end
162
+ end
163
+ end
164
+
165
+ context "when destroying all documents" do
166
+
167
+ before do
168
+ Band.create!
169
+ Band.all.to_a
170
+ Band.destroy_all
171
+ end
172
+
173
+ it "queries again" do
174
+ expect_query(1) do
175
+ Band.all.to_a
176
+ end
177
+ end
178
+ end
179
+
180
+ context "when querying a very large collection" do
181
+
182
+ before do
183
+ 123.times { Band.create! }
184
+ end
185
+
186
+ it "returns the right number of records" do
187
+ expect(Band.all.to_a.length).to eq(123)
188
+ end
189
+
190
+ it "#pluck returns the same count of objects" do
191
+ expect(Band.pluck(:name).length).to eq(123)
192
+ end
193
+
194
+ context "when loading all the documents" do
195
+
196
+ before do
197
+ Band.all.to_a
198
+ end
199
+
200
+ it "caches the complete result of the query" do
201
+ expect_no_queries do
202
+ expect(Band.all.to_a.length).to eq(123)
203
+ end
204
+ end
205
+
206
+ it "returns the same count of objects when using #pluck" do
207
+ expect(Band.pluck(:name).length).to eq(123)
208
+ end
209
+ end
210
+ end
211
+
212
+ context "when inserting an index" do
213
+
214
+ it "does not cache the query" do
215
+ expect(Mongoid::QueryCache).to receive(:cache_table).never
216
+ Band.collection.indexes.create(name: 1)
217
+ end
218
+ end
219
+ end
220
+
221
+ describe Mongoid::QueryCache::Middleware do
222
+
223
+ let :middleware do
224
+ Mongoid::QueryCache::Middleware.new(app)
225
+ end
226
+
227
+ context "when not touching mongoid on the app" do
228
+
229
+ let(:app) do
230
+ ->(env) { @enabled = Mongoid::QueryCache.enabled?; [200, env, "app"] }
231
+ end
232
+
233
+ it "returns success" do
234
+ code, _ = middleware.call({})
235
+ expect(code).to eq(200)
236
+ end
237
+
238
+ it "enableds the query cache" do
239
+ middleware.call({})
240
+ expect(@enabled).to be true
241
+ end
242
+ end
243
+
244
+ context "when querying on the app" do
245
+
246
+ let(:app) do
247
+ ->(env) {
248
+ Band.all.to_a
249
+ [200, env, "app"]
250
+ }
251
+ end
252
+
253
+ it "returns success" do
254
+ code, _ = middleware.call({})
255
+ expect(code).to eq(200)
256
+ end
257
+
258
+ it "cleans the query cache after reponds" do
259
+ middleware.call({})
260
+ expect(Mongoid::QueryCache.cache_table).to be_empty
261
+ end
262
+ end
263
+ end