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,162 @@
1
+ require "spec_helper"
2
+
3
+ describe Mongoid::Persistable::Settable do
4
+
5
+ describe "#set" do
6
+
7
+ context "when the document is a root document" do
8
+
9
+ shared_examples_for "a settable root document" do
10
+
11
+ it "sets the normal field to the new value" do
12
+ expect(person.title).to eq("kaiser")
13
+ end
14
+
15
+ it "properly sets aliased fields" do
16
+ expect(person.test).to eq("alias-test")
17
+ end
18
+
19
+ it "casts fields that need typecasting" do
20
+ expect(person.dob).to eq(date)
21
+ end
22
+
23
+ it "returns self object" do
24
+ expect(set).to eq(person)
25
+ end
26
+
27
+ it "persists the normal field set" do
28
+ expect(person.reload.title).to eq("kaiser")
29
+ end
30
+
31
+ it "persists sets on aliased fields" do
32
+ expect(person.reload.test).to eq("alias-test")
33
+ end
34
+
35
+ it "persists fields that need typecasting" do
36
+ expect(person.reload.dob).to eq(date)
37
+ end
38
+
39
+ it "resets the dirty attributes for the sets" do
40
+ expect(person).to_not be_changed
41
+ end
42
+ end
43
+
44
+ let(:person) do
45
+ Person.create
46
+ end
47
+
48
+ let(:date) do
49
+ Date.new(1976, 11, 19)
50
+ end
51
+
52
+ context "when provided string fields" do
53
+
54
+ let!(:set) do
55
+ person.set("title" => "kaiser", "test" => "alias-test", "dob" => date)
56
+ end
57
+
58
+ it_behaves_like "a settable root document"
59
+ end
60
+
61
+ context "when provided symbol fields" do
62
+
63
+ let!(:set) do
64
+ person.set(title: "kaiser", test: "alias-test", dob: date)
65
+ end
66
+
67
+ it_behaves_like "a settable root document"
68
+ end
69
+ end
70
+
71
+ context "when the document is embedded" do
72
+
73
+ shared_examples_for "a settable embedded document" do
74
+
75
+ it "sets the normal field to the new value" do
76
+ expect(address.number).to eq(44)
77
+ end
78
+
79
+ it "properly sets aliased fields" do
80
+ expect(address.suite).to eq("400")
81
+ end
82
+
83
+ it "casts fields that need typecasting" do
84
+ expect(address.end_date).to eq(date)
85
+ end
86
+
87
+ it "returns self object" do
88
+ expect(set).to eq(address)
89
+ end
90
+
91
+ it "persists the normal field set" do
92
+ expect(address.reload.number).to eq(44)
93
+ end
94
+
95
+ it "persists the aliased field set" do
96
+ expect(address.reload.suite).to eq("400")
97
+ end
98
+
99
+ it "persists the fields that need typecasting" do
100
+ expect(address.reload.end_date).to eq(date)
101
+ end
102
+
103
+ it "resets the dirty attributes for the sets" do
104
+ expect(address).to_not be_changed
105
+ end
106
+ end
107
+
108
+ let(:person) do
109
+ Person.create
110
+ end
111
+
112
+ let(:address) do
113
+ person.addresses.create(street: "t")
114
+ end
115
+
116
+ let(:date) do
117
+ Date.new(1976, 11, 19)
118
+ end
119
+
120
+ context "when provided string fields" do
121
+
122
+ let!(:set) do
123
+ address.set("number" => 44, "suite" => "400", "end_date" => date)
124
+ end
125
+
126
+ it_behaves_like "a settable embedded document"
127
+ end
128
+
129
+ context "when provided symbol fields" do
130
+
131
+ let!(:set) do
132
+ address.set(number: 44, suite: "400", end_date: date)
133
+ end
134
+
135
+ it_behaves_like "a settable embedded document"
136
+ end
137
+ end
138
+ end
139
+
140
+ context "when dynamic attributes are not enabled" do
141
+ let(:account) do
142
+ Account.create
143
+ end
144
+
145
+ it "raises exception for an unknown attribute " do
146
+ expect {
147
+ account.set(somethingnew: "somethingnew")
148
+ }.to raise_error(Mongoid::Errors::UnknownAttribute)
149
+ end
150
+ end
151
+
152
+ context "when dynamic attributes enabled" do
153
+ let(:person) do
154
+ Person.create
155
+ end
156
+
157
+ it "updates non existing attribute" do
158
+ person.set(somethingnew: "somethingnew")
159
+ expect(person.reload.somethingnew).to eq "somethingnew"
160
+ end
161
+ end
162
+ end
@@ -0,0 +1,155 @@
1
+ require "spec_helper"
2
+
3
+ describe Mongoid::Persistable::Unsettable do
4
+
5
+ describe "#unset" do
6
+
7
+ context "when the document is a root document" do
8
+
9
+ shared_examples_for "an unsettable root document" do
10
+
11
+ it "unsets the first field" do
12
+ expect(person.title).to be_nil
13
+ end
14
+
15
+ it "unsets the second field" do
16
+ expect(person.age).to be_nil
17
+ end
18
+
19
+ it "returns self object" do
20
+ expect(unset).to eq(person)
21
+ end
22
+
23
+ it "persists the first unset" do
24
+ expect(person.reload.title).to be_nil
25
+ end
26
+
27
+ it "persists the last_unset" do
28
+ expect(person.reload.age).to eq(100)
29
+ end
30
+
31
+ it "clears out dirty changes for the fields" do
32
+ expect(person).to_not be_changed
33
+ end
34
+ end
35
+
36
+ let(:date) do
37
+ Date.new(1976, 11, 19)
38
+ end
39
+
40
+ let(:person) do
41
+ Person.create(title: "test", age: 30, dob: date)
42
+ end
43
+
44
+ context "when provided a splat of symbols" do
45
+
46
+ let!(:unset) do
47
+ person.unset(:title, :age)
48
+ end
49
+
50
+ it_behaves_like "an unsettable root document"
51
+ end
52
+
53
+ context "when provided a splat of strings" do
54
+
55
+ let!(:unset) do
56
+ person.unset("title", "age")
57
+ end
58
+
59
+ it_behaves_like "an unsettable root document"
60
+ end
61
+
62
+ context "when provided an array of symbols" do
63
+
64
+ let!(:unset) do
65
+ person.unset([ :title, :age ])
66
+ end
67
+
68
+ it_behaves_like "an unsettable root document"
69
+ end
70
+
71
+ context "when provided an array of strings" do
72
+
73
+ let!(:unset) do
74
+ person.unset([ "title", "age" ])
75
+ end
76
+
77
+ it_behaves_like "an unsettable root document"
78
+ end
79
+ end
80
+
81
+ context "when the document is embedded" do
82
+
83
+ shared_examples_for "an unsettable embedded document" do
84
+
85
+ it "unsets the first field" do
86
+ expect(address.number).to be_nil
87
+ end
88
+
89
+ it "unsets the second field" do
90
+ expect(address.city).to be_nil
91
+ end
92
+
93
+ it "returns self object" do
94
+ expect(unset).to eq(address)
95
+ end
96
+
97
+ it "persists the first unset" do
98
+ expect(address.reload.number).to be_nil
99
+ end
100
+
101
+ it "persists the last_unset" do
102
+ expect(address.reload.city).to be_nil
103
+ end
104
+
105
+ it "clears out dirty changes for the fields" do
106
+ expect(address).to_not be_changed
107
+ end
108
+ end
109
+
110
+ let(:person) do
111
+ Person.create
112
+ end
113
+
114
+ let(:address) do
115
+ person.addresses.create(street: "kreuzberg", number: 40, city: "Berlin")
116
+ end
117
+
118
+ context "when provided a splat of symbols" do
119
+
120
+ let!(:unset) do
121
+ address.unset(:number, :city)
122
+ end
123
+
124
+ it_behaves_like "an unsettable embedded document"
125
+ end
126
+
127
+ context "when provided a splat of strings" do
128
+
129
+ let!(:unset) do
130
+ address.unset("number", "city")
131
+ end
132
+
133
+ it_behaves_like "an unsettable embedded document"
134
+ end
135
+
136
+ context "when provided an array of symbols" do
137
+
138
+ let!(:unset) do
139
+ address.unset([ :number, :city ])
140
+ end
141
+
142
+ it_behaves_like "an unsettable embedded document"
143
+ end
144
+
145
+ context "when provided an array of strings" do
146
+
147
+ let!(:unset) do
148
+ address.unset([ "number", "city" ])
149
+ end
150
+
151
+ it_behaves_like "an unsettable embedded document"
152
+ end
153
+ end
154
+ end
155
+ end
@@ -0,0 +1,558 @@
1
+ require "spec_helper"
2
+
3
+ describe Mongoid::Persistable::Updatable do
4
+
5
+ describe "#update_attribute" do
6
+
7
+ context "when the field is aliased" do
8
+
9
+ let(:person) do
10
+ Person.create
11
+ end
12
+
13
+ context "when the setter is overridden" do
14
+
15
+ before do
16
+ person.update_attribute(:overridden_setter, "value")
17
+ end
18
+
19
+ it "updates the field" do
20
+ expect(person.overridden_setter).to eq("value")
21
+ end
22
+
23
+ it "clears the dirty attributes" do
24
+ expect(person).to_not be_changed
25
+ end
26
+
27
+ it "calls the overridden setter" do
28
+ expect(person.instance_variable_get(:@override_called)).to be true
29
+ end
30
+
31
+ it "persists the changes" do
32
+ expect(person.reload.overridden_setter).to eq("value")
33
+ end
34
+ end
35
+
36
+ context "when setting via the field name" do
37
+
38
+ before do
39
+ person.update_attribute(:t, "testing")
40
+ end
41
+
42
+ it "updates the field" do
43
+ expect(person.t).to eq("testing")
44
+ end
45
+
46
+ it "persists the changes" do
47
+ expect(person.reload.t).to eq("testing")
48
+ end
49
+ end
50
+
51
+ context "when setting via the field alias" do
52
+
53
+ before do
54
+ person.update_attribute(:test, "testing")
55
+ end
56
+
57
+ it "updates the field" do
58
+ expect(person.t).to eq("testing")
59
+ end
60
+
61
+ it "persists the changes" do
62
+ expect(person.reload.t).to eq("testing")
63
+ end
64
+ end
65
+ end
66
+
67
+ context "when setting an array field" do
68
+
69
+ let(:person) do
70
+ Person.create(aliases: [])
71
+ end
72
+
73
+ before do
74
+ person.update_attribute(:aliases, person.aliases << "Bond")
75
+ end
76
+
77
+ it "sets the new value in the document" do
78
+ expect(person.aliases).to eq([ "Bond" ])
79
+ end
80
+
81
+ it "persists the changes" do
82
+ expect(person.reload.aliases).to eq([ "Bond" ])
83
+ end
84
+ end
85
+
86
+ context "when setting a boolean field" do
87
+
88
+ context "when the field is true" do
89
+
90
+ let(:person) do
91
+ Person.new(terms: true)
92
+ end
93
+
94
+ context "when setting to false" do
95
+
96
+ before do
97
+ person.update_attribute(:terms, false)
98
+ end
99
+
100
+ it "persists the document" do
101
+ expect(person).to be_persisted
102
+ end
103
+
104
+ it "changes the attribute value" do
105
+ expect(person.terms).to be false
106
+ end
107
+
108
+ it "persists the changes" do
109
+ expect(person.reload.terms).to be false
110
+ end
111
+ end
112
+ end
113
+ end
114
+
115
+ context "when provided a symbol attribute name" do
116
+
117
+ let(:post) do
118
+ Post.new
119
+ end
120
+
121
+ context "when the document is valid" do
122
+
123
+ before do
124
+ post.update_attribute(:title, "Testing")
125
+ end
126
+
127
+ it "sets the attribute" do
128
+ expect(post.title).to eq("Testing")
129
+ end
130
+
131
+ it "saves the document" do
132
+ expect(post).to be_persisted
133
+ end
134
+ end
135
+
136
+ context "when updating to the same value" do
137
+
138
+ before do
139
+ post.update_attribute(:title, "Testing")
140
+ end
141
+
142
+ it "returns true" do
143
+ expect(post.update_attribute(:title, "Testing")).to be true
144
+ end
145
+ end
146
+
147
+ context "when the document is invalid" do
148
+
149
+ before do
150
+ post.update_attribute(:title, "$invalid")
151
+ end
152
+
153
+ it "sets the attribute" do
154
+ expect(post.title).to eq("$invalid")
155
+ end
156
+
157
+ it "saves the document" do
158
+ expect(post).to be_persisted
159
+ end
160
+ end
161
+
162
+ context "when the document has been destroyed" do
163
+
164
+ before do
165
+ post.delete
166
+ end
167
+
168
+ it "raises an error" do
169
+ expect {
170
+ post.update_attribute(:title, "something")
171
+ }.to raise_error
172
+ end
173
+ end
174
+ end
175
+
176
+ context "when provided a string attribute name" do
177
+
178
+ let(:post) do
179
+ Post.new
180
+ end
181
+
182
+ context "when the document is valid" do
183
+
184
+ before do
185
+ post.update_attribute("title", "Testing")
186
+ end
187
+
188
+ it "sets the attribute" do
189
+ expect(post.title).to eq("Testing")
190
+ end
191
+
192
+ it "saves the document" do
193
+ expect(post).to be_persisted
194
+ end
195
+ end
196
+
197
+ context "when the document is invalid" do
198
+
199
+ before do
200
+ post.update_attribute("title", "$invalid")
201
+ end
202
+
203
+ it "sets the attribute" do
204
+ expect(post.title).to eq("$invalid")
205
+ end
206
+
207
+ it "saves the document" do
208
+ expect(post).to be_persisted
209
+ end
210
+ end
211
+ end
212
+
213
+ context "when persisting a localized field" do
214
+
215
+ let!(:product) do
216
+ Product.create(description: "The bomb")
217
+ end
218
+
219
+ before do
220
+ ::I18n.locale = :de
221
+ product.update_attribute(:description, "Die Bombe")
222
+ end
223
+
224
+ after do
225
+ ::I18n.locale = :en
226
+ end
227
+
228
+ let(:attributes) do
229
+ product.attributes["description"]
230
+ end
231
+
232
+ it "persists the en locale" do
233
+ expect(attributes["en"]).to eq("The bomb")
234
+ end
235
+
236
+ it "persists the de locale" do
237
+ expect(attributes["de"]).to eq("Die Bombe")
238
+ end
239
+ end
240
+
241
+ context "when updating a deeply embedded document" do
242
+
243
+ let!(:person) do
244
+ Person.create
245
+ end
246
+
247
+ let!(:address) do
248
+ person.addresses.create(street: "Winterfeldtstr")
249
+ end
250
+
251
+ let!(:location) do
252
+ address.locations.create(name: "work")
253
+ end
254
+
255
+ let(:from_db) do
256
+ Person.last.addresses.last.locations.last
257
+ end
258
+
259
+ before do
260
+ from_db.update_attribute(:name, "home")
261
+ end
262
+
263
+ it "updates the attribute" do
264
+ expect(from_db.name).to eq("home")
265
+ end
266
+
267
+ it "persists the changes" do
268
+ expect(from_db.reload.name).to eq("home")
269
+ end
270
+ end
271
+ end
272
+
273
+ [:update_attributes, :update].each do |method|
274
+
275
+ describe "##{method}" do
276
+
277
+ context "when saving with a hash field with invalid keys" do
278
+
279
+ let(:person) do
280
+ Person.create
281
+ end
282
+
283
+ it "raises an error" do
284
+ expect {
285
+ person.update_attributes(map: { "bad.key" => "value" })
286
+ }.to raise_error(Moped::Errors::OperationFailure)
287
+ end
288
+ end
289
+
290
+ context "when validation passes" do
291
+
292
+ let(:person) do
293
+ Person.create
294
+ end
295
+
296
+ let!(:saved) do
297
+ person.update_attributes(pets: false)
298
+ end
299
+
300
+ let(:from_db) do
301
+ Person.find(person.id)
302
+ end
303
+
304
+ it "returns true" do
305
+ expect(saved).to be true
306
+ end
307
+
308
+ it "saves the attributes" do
309
+ expect(from_db.pets).to be false
310
+ end
311
+ end
312
+
313
+ context "when the document has been destroyed" do
314
+
315
+ let(:person) do
316
+ Person.create
317
+ end
318
+
319
+ it "raises an error" do
320
+ expect {
321
+ person.send(method, map: { "bad.key" => "value" })
322
+ }.to raise_error(Moped::Errors::OperationFailure)
323
+ end
324
+ end
325
+
326
+ context "when validation passes" do
327
+
328
+ let(:person) do
329
+ Person.create
330
+ end
331
+
332
+ let!(:saved) do
333
+ person.send(method, pets: false)
334
+ end
335
+
336
+ let(:from_db) do
337
+ Person.find(person.id)
338
+ end
339
+
340
+ it "returns true" do
341
+ expect(saved).to be true
342
+ end
343
+
344
+ it "saves the attributes" do
345
+ expect(from_db.pets).to be false
346
+ end
347
+ end
348
+
349
+ context "when the document has been destroyed" do
350
+
351
+ let!(:person) do
352
+ Person.create
353
+ end
354
+
355
+ before do
356
+ person.delete
357
+ end
358
+
359
+ it "raises an error" do
360
+ expect {
361
+ person.send(method, title: "something")
362
+ }.to raise_error
363
+ end
364
+ end
365
+
366
+ context "when updating through a one-to-one relation" do
367
+
368
+ let(:person) do
369
+ Person.create!
370
+ end
371
+
372
+ let(:game) do
373
+ Game.create(person: person)
374
+ end
375
+
376
+ before do
377
+ person.send(method, ssn: "444-44-4444")
378
+ game.person.send(method, ssn: "555-66-7777")
379
+ end
380
+
381
+ let(:from_db) do
382
+ Person.find(person.id)
383
+ end
384
+
385
+ it "saves the attributes" do
386
+ expect(person.ssn).to eq("555-66-7777")
387
+ end
388
+ end
389
+
390
+ context "on a new record" do
391
+
392
+ let(:person) do
393
+ Person.new
394
+ end
395
+
396
+ before do
397
+ person.send(method, pets: false, title: nil)
398
+ end
399
+
400
+ it "saves the new record" do
401
+ expect(Person.find(person.id)).to_not be_nil
402
+ end
403
+ end
404
+
405
+ context "when passing in a relation" do
406
+
407
+ context "when providing an embedded child" do
408
+
409
+ let!(:person) do
410
+ Person.create
411
+ end
412
+
413
+ let!(:name) do
414
+ person.create_name(first_name: "test", last_name: "user")
415
+ end
416
+
417
+ let(:new_name) do
418
+ Name.new(first_name: "Rupert", last_name: "Parkes")
419
+ end
420
+
421
+ before do
422
+ person.send(method, name: new_name)
423
+ end
424
+
425
+ it "updates the embedded document" do
426
+ expect(person.name).to eq(new_name)
427
+ end
428
+
429
+ it "persists the changes" do
430
+ expect(person.reload.name).to eq(new_name)
431
+ end
432
+ end
433
+
434
+ context "when providing a parent to a referenced in" do
435
+
436
+ let!(:person) do
437
+ Person.create
438
+ end
439
+
440
+ let!(:post) do
441
+ Post.create(title: "Testing")
442
+ end
443
+
444
+ context "when the relation has not yet been touched" do
445
+
446
+ before do
447
+ post.send(method, person: person)
448
+ end
449
+
450
+ it "sets the instance of the relation" do
451
+ expect(person.posts).to eq([ post ])
452
+ end
453
+
454
+ it "sets properly through method_missing" do
455
+ expect(person.posts.to_a).to eq([ post ])
456
+ end
457
+
458
+ it "persists the reference" do
459
+ expect(person.posts(true)).to eq([ post ])
460
+ end
461
+ end
462
+
463
+ context "when the relation has been touched" do
464
+
465
+ before do
466
+ person.posts
467
+ post.send(method, person: person)
468
+ end
469
+
470
+ it "sets the instance of the relation" do
471
+ expect(person.posts).to eq([ post ])
472
+ end
473
+
474
+ it "sets properly through method_missing" do
475
+ expect(person.posts.to_a).to eq([ post ])
476
+ end
477
+
478
+ it "persists the reference" do
479
+ expect(person.posts(true)).to eq([ post ])
480
+ end
481
+ end
482
+ end
483
+ end
484
+
485
+ context "when in a deeply nested hierarchy" do
486
+
487
+ let!(:person) do
488
+ Person.new(title: "The Boss")
489
+ end
490
+
491
+ let!(:phone_number) do
492
+ Phone.new(number: "123-456-7890")
493
+ end
494
+
495
+ let!(:country_code) do
496
+ CountryCode.new(code: 1)
497
+ end
498
+
499
+ before do
500
+ phone_number.country_code = country_code
501
+ person.phone_numbers << phone_number
502
+ person.save
503
+ end
504
+
505
+ it "sets the first level document" do
506
+ expect(person.phone_numbers.first).to eq(phone_number)
507
+ end
508
+
509
+ it "sets the second level document" do
510
+ expect(person.phone_numbers.first.country_code).to eq(country_code)
511
+ end
512
+
513
+ context "when updating the first level document" do
514
+
515
+ let(:phone) do
516
+ person.phone_numbers.first
517
+ end
518
+
519
+ before do
520
+ phone.number = "098-765-4321"
521
+ phone.send(method, number: "098-765-4321")
522
+ end
523
+
524
+ it "sets the new attributes" do
525
+ expect(phone.number).to eq("098-765-4321")
526
+ end
527
+
528
+ context "when reloading the root" do
529
+
530
+ let(:reloaded) do
531
+ person.reload
532
+ end
533
+
534
+ it "saves the new attributes" do
535
+ expect(reloaded.phone_numbers.first.number).to eq("098-765-4321")
536
+ end
537
+ end
538
+ end
539
+ end
540
+ end
541
+ end
542
+
543
+ describe "#update!" do
544
+
545
+ context "when a callback returns false" do
546
+
547
+ let(:oscar) do
548
+ Oscar.new
549
+ end
550
+
551
+ it "raises a callback error" do
552
+ expect {
553
+ oscar.update!(title: "The Grouch")
554
+ }.to raise_error(Mongoid::Errors::Callback)
555
+ end
556
+ end
557
+ end
558
+ end