mongoid_rails4 4.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (659) hide show
  1. checksums.yaml +7 -0
  2. data/CHANGELOG.md +3213 -0
  3. data/LICENSE +20 -0
  4. data/README.md +62 -0
  5. data/Rakefile +35 -0
  6. data/lib/config/locales/en.yml +448 -0
  7. data/lib/mongoid.rb +104 -0
  8. data/lib/mongoid/atomic.rb +384 -0
  9. data/lib/mongoid/atomic/modifiers.rb +317 -0
  10. data/lib/mongoid/atomic/paths.rb +3 -0
  11. data/lib/mongoid/atomic/paths/embedded.rb +28 -0
  12. data/lib/mongoid/atomic/paths/embedded/many.rb +44 -0
  13. data/lib/mongoid/atomic/paths/embedded/one.rb +43 -0
  14. data/lib/mongoid/atomic/paths/root.rb +39 -0
  15. data/lib/mongoid/attributes.rb +284 -0
  16. data/lib/mongoid/attributes/dynamic.rb +154 -0
  17. data/lib/mongoid/attributes/nested.rb +82 -0
  18. data/lib/mongoid/attributes/processing.rb +147 -0
  19. data/lib/mongoid/attributes/readonly.rb +56 -0
  20. data/lib/mongoid/changeable.rb +379 -0
  21. data/lib/mongoid/composable.rb +104 -0
  22. data/lib/mongoid/config.rb +263 -0
  23. data/lib/mongoid/config/environment.rb +44 -0
  24. data/lib/mongoid/config/options.rb +74 -0
  25. data/lib/mongoid/config/validators.rb +3 -0
  26. data/lib/mongoid/config/validators/option.rb +25 -0
  27. data/lib/mongoid/config/validators/session.rb +140 -0
  28. data/lib/mongoid/contextual.rb +54 -0
  29. data/lib/mongoid/contextual/aggregable/memory.rb +109 -0
  30. data/lib/mongoid/contextual/aggregable/mongo.rb +147 -0
  31. data/lib/mongoid/contextual/atomic.rb +180 -0
  32. data/lib/mongoid/contextual/command.rb +61 -0
  33. data/lib/mongoid/contextual/eager.rb +158 -0
  34. data/lib/mongoid/contextual/find_and_modify.rb +69 -0
  35. data/lib/mongoid/contextual/geo_near.rb +238 -0
  36. data/lib/mongoid/contextual/map_reduce.rb +324 -0
  37. data/lib/mongoid/contextual/memory.rb +440 -0
  38. data/lib/mongoid/contextual/mongo.rb +676 -0
  39. data/lib/mongoid/contextual/queryable.rb +25 -0
  40. data/lib/mongoid/contextual/text_search.rb +180 -0
  41. data/lib/mongoid/copyable.rb +67 -0
  42. data/lib/mongoid/criteria.rb +562 -0
  43. data/lib/mongoid/criteria/findable.rb +179 -0
  44. data/lib/mongoid/criteria/inspectable.rb +25 -0
  45. data/lib/mongoid/criteria/marshalable.rb +50 -0
  46. data/lib/mongoid/criteria/modifiable.rb +189 -0
  47. data/lib/mongoid/criteria/scopable.rb +158 -0
  48. data/lib/mongoid/document.rb +361 -0
  49. data/lib/mongoid/equality.rb +66 -0
  50. data/lib/mongoid/errors.rb +40 -0
  51. data/lib/mongoid/errors/ambiguous_relationship.rb +51 -0
  52. data/lib/mongoid/errors/callback.rb +25 -0
  53. data/lib/mongoid/errors/delete_restriction.rb +29 -0
  54. data/lib/mongoid/errors/document_not_found.rb +111 -0
  55. data/lib/mongoid/errors/eager_load.rb +22 -0
  56. data/lib/mongoid/errors/invalid_collection.rb +18 -0
  57. data/lib/mongoid/errors/invalid_config_option.rb +27 -0
  58. data/lib/mongoid/errors/invalid_field.rb +64 -0
  59. data/lib/mongoid/errors/invalid_field_option.rb +35 -0
  60. data/lib/mongoid/errors/invalid_find.rb +19 -0
  61. data/lib/mongoid/errors/invalid_includes.rb +32 -0
  62. data/lib/mongoid/errors/invalid_index.rb +28 -0
  63. data/lib/mongoid/errors/invalid_options.rb +28 -0
  64. data/lib/mongoid/errors/invalid_path.rb +21 -0
  65. data/lib/mongoid/errors/invalid_scope.rb +24 -0
  66. data/lib/mongoid/errors/invalid_set_polymorphic_relation.rb +38 -0
  67. data/lib/mongoid/errors/invalid_storage_options.rb +27 -0
  68. data/lib/mongoid/errors/invalid_time.rb +22 -0
  69. data/lib/mongoid/errors/inverse_not_found.rb +29 -0
  70. data/lib/mongoid/errors/mixed_relations.rb +32 -0
  71. data/lib/mongoid/errors/mixed_session_configuration.rb +28 -0
  72. data/lib/mongoid/errors/mongoid_error.rb +92 -0
  73. data/lib/mongoid/errors/nested_attributes_metadata_not_found.rb +28 -0
  74. data/lib/mongoid/errors/no_default_session.rb +23 -0
  75. data/lib/mongoid/errors/no_environment.rb +19 -0
  76. data/lib/mongoid/errors/no_map_reduce_output.rb +24 -0
  77. data/lib/mongoid/errors/no_metadata.rb +21 -0
  78. data/lib/mongoid/errors/no_parent.rb +24 -0
  79. data/lib/mongoid/errors/no_session_config.rb +22 -0
  80. data/lib/mongoid/errors/no_session_database.rb +27 -0
  81. data/lib/mongoid/errors/no_session_hosts.rb +27 -0
  82. data/lib/mongoid/errors/no_sessions_config.rb +20 -0
  83. data/lib/mongoid/errors/readonly_attribute.rb +25 -0
  84. data/lib/mongoid/errors/scope_overwrite.rb +21 -0
  85. data/lib/mongoid/errors/too_many_nested_attribute_records.rb +20 -0
  86. data/lib/mongoid/errors/unknown_attribute.rb +25 -0
  87. data/lib/mongoid/errors/unsaved_document.rb +19 -0
  88. data/lib/mongoid/errors/unsupported_javascript.rb +27 -0
  89. data/lib/mongoid/errors/validations.rb +29 -0
  90. data/lib/mongoid/evolvable.rb +19 -0
  91. data/lib/mongoid/extensions.rb +35 -0
  92. data/lib/mongoid/extensions/array.rb +180 -0
  93. data/lib/mongoid/extensions/big_decimal.rb +69 -0
  94. data/lib/mongoid/extensions/boolean.rb +21 -0
  95. data/lib/mongoid/extensions/date.rb +77 -0
  96. data/lib/mongoid/extensions/date_time.rb +73 -0
  97. data/lib/mongoid/extensions/false_class.rb +38 -0
  98. data/lib/mongoid/extensions/float.rb +56 -0
  99. data/lib/mongoid/extensions/hash.rb +209 -0
  100. data/lib/mongoid/extensions/integer.rb +67 -0
  101. data/lib/mongoid/extensions/module.rb +28 -0
  102. data/lib/mongoid/extensions/nil_class.rb +33 -0
  103. data/lib/mongoid/extensions/object.rb +274 -0
  104. data/lib/mongoid/extensions/object_id.rb +54 -0
  105. data/lib/mongoid/extensions/range.rb +79 -0
  106. data/lib/mongoid/extensions/regexp.rb +27 -0
  107. data/lib/mongoid/extensions/set.rb +55 -0
  108. data/lib/mongoid/extensions/string.rb +199 -0
  109. data/lib/mongoid/extensions/symbol.rb +54 -0
  110. data/lib/mongoid/extensions/time.rb +88 -0
  111. data/lib/mongoid/extensions/time_with_zone.rb +56 -0
  112. data/lib/mongoid/extensions/true_class.rb +38 -0
  113. data/lib/mongoid/factory.rb +46 -0
  114. data/lib/mongoid/fields.rb +542 -0
  115. data/lib/mongoid/fields/foreign_key.rb +174 -0
  116. data/lib/mongoid/fields/localized.rb +73 -0
  117. data/lib/mongoid/fields/standard.rb +273 -0
  118. data/lib/mongoid/fields/validators.rb +2 -0
  119. data/lib/mongoid/fields/validators/macro.rb +92 -0
  120. data/lib/mongoid/findable.rb +133 -0
  121. data/lib/mongoid/identity_map.rb +163 -0
  122. data/lib/mongoid/indexable.rb +147 -0
  123. data/lib/mongoid/indexable/specification.rb +115 -0
  124. data/lib/mongoid/indexable/validators/options.rb +103 -0
  125. data/lib/mongoid/inspectable.rb +59 -0
  126. data/lib/mongoid/interceptable.rb +265 -0
  127. data/lib/mongoid/loggable.rb +69 -0
  128. data/lib/mongoid/matchable.rb +152 -0
  129. data/lib/mongoid/matchable/all.rb +27 -0
  130. data/lib/mongoid/matchable/and.rb +30 -0
  131. data/lib/mongoid/matchable/default.rb +72 -0
  132. data/lib/mongoid/matchable/exists.rb +23 -0
  133. data/lib/mongoid/matchable/gt.rb +21 -0
  134. data/lib/mongoid/matchable/gte.rb +21 -0
  135. data/lib/mongoid/matchable/in.rb +24 -0
  136. data/lib/mongoid/matchable/lt.rb +21 -0
  137. data/lib/mongoid/matchable/lte.rb +21 -0
  138. data/lib/mongoid/matchable/ne.rb +21 -0
  139. data/lib/mongoid/matchable/nin.rb +21 -0
  140. data/lib/mongoid/matchable/or.rb +33 -0
  141. data/lib/mongoid/matchable/size.rb +21 -0
  142. data/lib/mongoid/persistable.rb +207 -0
  143. data/lib/mongoid/persistable/creatable.rb +189 -0
  144. data/lib/mongoid/persistable/deletable.rb +149 -0
  145. data/lib/mongoid/persistable/destroyable.rb +55 -0
  146. data/lib/mongoid/persistable/incrementable.rb +36 -0
  147. data/lib/mongoid/persistable/logical.rb +38 -0
  148. data/lib/mongoid/persistable/poppable.rb +39 -0
  149. data/lib/mongoid/persistable/pullable.rb +55 -0
  150. data/lib/mongoid/persistable/pushable.rb +62 -0
  151. data/lib/mongoid/persistable/renamable.rb +35 -0
  152. data/lib/mongoid/persistable/savable.rb +52 -0
  153. data/lib/mongoid/persistable/settable.rb +33 -0
  154. data/lib/mongoid/persistable/unsettable.rb +36 -0
  155. data/lib/mongoid/persistable/updatable.rb +151 -0
  156. data/lib/mongoid/persistable/upsertable.rb +55 -0
  157. data/lib/mongoid/positional.rb +71 -0
  158. data/lib/mongoid/railtie.rb +156 -0
  159. data/lib/mongoid/railties/database.rake +97 -0
  160. data/lib/mongoid/railties/document.rb +12 -0
  161. data/lib/mongoid/relations.rb +162 -0
  162. data/lib/mongoid/relations/accessors.rb +299 -0
  163. data/lib/mongoid/relations/auto_save.rb +106 -0
  164. data/lib/mongoid/relations/binding.rb +218 -0
  165. data/lib/mongoid/relations/bindings.rb +9 -0
  166. data/lib/mongoid/relations/bindings/embedded/in.rb +63 -0
  167. data/lib/mongoid/relations/bindings/embedded/many.rb +50 -0
  168. data/lib/mongoid/relations/bindings/embedded/one.rb +55 -0
  169. data/lib/mongoid/relations/bindings/referenced/in.rb +65 -0
  170. data/lib/mongoid/relations/bindings/referenced/many.rb +42 -0
  171. data/lib/mongoid/relations/bindings/referenced/many_to_many.rb +67 -0
  172. data/lib/mongoid/relations/bindings/referenced/one.rb +44 -0
  173. data/lib/mongoid/relations/builder.rb +57 -0
  174. data/lib/mongoid/relations/builders.rb +104 -0
  175. data/lib/mongoid/relations/builders/embedded/in.rb +29 -0
  176. data/lib/mongoid/relations/builders/embedded/many.rb +36 -0
  177. data/lib/mongoid/relations/builders/embedded/one.rb +30 -0
  178. data/lib/mongoid/relations/builders/nested_attributes/many.rb +174 -0
  179. data/lib/mongoid/relations/builders/nested_attributes/one.rb +126 -0
  180. data/lib/mongoid/relations/builders/referenced/in.rb +26 -0
  181. data/lib/mongoid/relations/builders/referenced/many.rb +27 -0
  182. data/lib/mongoid/relations/builders/referenced/many_to_many.rb +40 -0
  183. data/lib/mongoid/relations/builders/referenced/one.rb +26 -0
  184. data/lib/mongoid/relations/cascading.rb +56 -0
  185. data/lib/mongoid/relations/cascading/delete.rb +44 -0
  186. data/lib/mongoid/relations/cascading/destroy.rb +43 -0
  187. data/lib/mongoid/relations/cascading/nullify.rb +35 -0
  188. data/lib/mongoid/relations/cascading/restrict.rb +39 -0
  189. data/lib/mongoid/relations/constraint.rb +49 -0
  190. data/lib/mongoid/relations/conversions.rb +34 -0
  191. data/lib/mongoid/relations/counter_cache.rb +105 -0
  192. data/lib/mongoid/relations/cyclic.rb +107 -0
  193. data/lib/mongoid/relations/embedded/batchable.rb +355 -0
  194. data/lib/mongoid/relations/embedded/in.rb +231 -0
  195. data/lib/mongoid/relations/embedded/many.rb +639 -0
  196. data/lib/mongoid/relations/embedded/one.rb +223 -0
  197. data/lib/mongoid/relations/macros.rb +356 -0
  198. data/lib/mongoid/relations/many.rb +208 -0
  199. data/lib/mongoid/relations/marshalable.rb +32 -0
  200. data/lib/mongoid/relations/metadata.rb +1174 -0
  201. data/lib/mongoid/relations/nested_builder.rb +74 -0
  202. data/lib/mongoid/relations/one.rb +48 -0
  203. data/lib/mongoid/relations/options.rb +48 -0
  204. data/lib/mongoid/relations/polymorphic.rb +39 -0
  205. data/lib/mongoid/relations/proxy.rb +270 -0
  206. data/lib/mongoid/relations/referenced/in.rb +297 -0
  207. data/lib/mongoid/relations/referenced/many.rb +787 -0
  208. data/lib/mongoid/relations/referenced/many_to_many.rb +486 -0
  209. data/lib/mongoid/relations/referenced/one.rb +290 -0
  210. data/lib/mongoid/relations/reflections.rb +62 -0
  211. data/lib/mongoid/relations/synchronization.rb +169 -0
  212. data/lib/mongoid/relations/targets.rb +2 -0
  213. data/lib/mongoid/relations/targets/enumerable.rb +473 -0
  214. data/lib/mongoid/relations/touchable.rb +94 -0
  215. data/lib/mongoid/reloadable.rb +95 -0
  216. data/lib/mongoid/scopable.rb +379 -0
  217. data/lib/mongoid/selectable.rb +59 -0
  218. data/lib/mongoid/serializable.rb +170 -0
  219. data/lib/mongoid/sessions.rb +330 -0
  220. data/lib/mongoid/sessions/factory.rb +129 -0
  221. data/lib/mongoid/sessions/mongo_uri.rb +93 -0
  222. data/lib/mongoid/sessions/options.rb +141 -0
  223. data/lib/mongoid/sessions/validators.rb +2 -0
  224. data/lib/mongoid/sessions/validators/storage.rb +49 -0
  225. data/lib/mongoid/shardable.rb +65 -0
  226. data/lib/mongoid/state.rb +97 -0
  227. data/lib/mongoid/threaded.rb +383 -0
  228. data/lib/mongoid/threaded/lifecycle.rb +164 -0
  229. data/lib/mongoid/timestamps.rb +15 -0
  230. data/lib/mongoid/timestamps/created.rb +30 -0
  231. data/lib/mongoid/timestamps/created/short.rb +19 -0
  232. data/lib/mongoid/timestamps/short.rb +10 -0
  233. data/lib/mongoid/timestamps/updated.rb +39 -0
  234. data/lib/mongoid/timestamps/updated/short.rb +19 -0
  235. data/lib/mongoid/traversable.rb +192 -0
  236. data/lib/mongoid/unit_of_work.rb +61 -0
  237. data/lib/mongoid/validatable.rb +180 -0
  238. data/lib/mongoid/validatable/associated.rb +48 -0
  239. data/lib/mongoid/validatable/format.rb +20 -0
  240. data/lib/mongoid/validatable/length.rb +20 -0
  241. data/lib/mongoid/validatable/localizable.rb +30 -0
  242. data/lib/mongoid/validatable/macros.rb +94 -0
  243. data/lib/mongoid/validatable/presence.rb +86 -0
  244. data/lib/mongoid/validatable/queryable.rb +30 -0
  245. data/lib/mongoid/validatable/uniqueness.rb +330 -0
  246. data/lib/mongoid/version.rb +4 -0
  247. data/lib/rack/mongoid.rb +2 -0
  248. data/lib/rack/mongoid/middleware/identity_map.rb +39 -0
  249. data/lib/rails/generators/mongoid/config/config_generator.rb +25 -0
  250. data/lib/rails/generators/mongoid/config/templates/mongoid.yml +76 -0
  251. data/lib/rails/generators/mongoid/model/model_generator.rb +25 -0
  252. data/lib/rails/generators/mongoid/model/templates/model.rb.tt +19 -0
  253. data/lib/rails/generators/mongoid/observer/observer_generator.rb +17 -0
  254. data/lib/rails/generators/mongoid/observer/templates/observer.rb.tt +4 -0
  255. data/lib/rails/generators/mongoid_generator.rb +65 -0
  256. data/lib/rails/mongoid.rb +180 -0
  257. data/lib/support/ruby_version.rb +26 -0
  258. data/spec/app/models/account.rb +28 -0
  259. data/spec/app/models/acolyte.rb +17 -0
  260. data/spec/app/models/actor.rb +18 -0
  261. data/spec/app/models/actress.rb +2 -0
  262. data/spec/app/models/address.rb +77 -0
  263. data/spec/app/models/address_component.rb +5 -0
  264. data/spec/app/models/address_number.rb +6 -0
  265. data/spec/app/models/agency.rb +5 -0
  266. data/spec/app/models/agent.rb +12 -0
  267. data/spec/app/models/album.rb +14 -0
  268. data/spec/app/models/alert.rb +5 -0
  269. data/spec/app/models/animal.rb +25 -0
  270. data/spec/app/models/answer.rb +4 -0
  271. data/spec/app/models/appointment.rb +7 -0
  272. data/spec/app/models/article.rb +10 -0
  273. data/spec/app/models/artist.rb +66 -0
  274. data/spec/app/models/artwork.rb +4 -0
  275. data/spec/app/models/audio.rb +5 -0
  276. data/spec/app/models/augmentation.rb +11 -0
  277. data/spec/app/models/author.rb +4 -0
  278. data/spec/app/models/band.rb +26 -0
  279. data/spec/app/models/bar.rb +10 -0
  280. data/spec/app/models/basic.rb +6 -0
  281. data/spec/app/models/bed.rb +1 -0
  282. data/spec/app/models/big_palette.rb +2 -0
  283. data/spec/app/models/birthday.rb +13 -0
  284. data/spec/app/models/book.rb +13 -0
  285. data/spec/app/models/breed.rb +4 -0
  286. data/spec/app/models/browser.rb +6 -0
  287. data/spec/app/models/building.rb +5 -0
  288. data/spec/app/models/building_address.rb +5 -0
  289. data/spec/app/models/bus.rb +7 -0
  290. data/spec/app/models/business.rb +5 -0
  291. data/spec/app/models/callback_recorder.rb +25 -0
  292. data/spec/app/models/callback_test.rb +9 -0
  293. data/spec/app/models/canvas.rb +25 -0
  294. data/spec/app/models/car.rb +1 -0
  295. data/spec/app/models/cat.rb +8 -0
  296. data/spec/app/models/category.rb +8 -0
  297. data/spec/app/models/child.rb +4 -0
  298. data/spec/app/models/child_doc.rb +22 -0
  299. data/spec/app/models/church.rb +4 -0
  300. data/spec/app/models/circle.rb +3 -0
  301. data/spec/app/models/circuit.rb +4 -0
  302. data/spec/app/models/circus.rb +7 -0
  303. data/spec/app/models/code.rb +5 -0
  304. data/spec/app/models/comment.rb +16 -0
  305. data/spec/app/models/contractor.rb +5 -0
  306. data/spec/app/models/cookie.rb +6 -0
  307. data/spec/app/models/country_code.rb +8 -0
  308. data/spec/app/models/definition.rb +7 -0
  309. data/spec/app/models/description.rb +11 -0
  310. data/spec/app/models/dictionary.rb +10 -0
  311. data/spec/app/models/division.rb +10 -0
  312. data/spec/app/models/doctor.rb +12 -0
  313. data/spec/app/models/dog.rb +7 -0
  314. data/spec/app/models/dokument.rb +5 -0
  315. data/spec/app/models/dragon.rb +4 -0
  316. data/spec/app/models/driver.rb +7 -0
  317. data/spec/app/models/drug.rb +6 -0
  318. data/spec/app/models/dungeon.rb +4 -0
  319. data/spec/app/models/email.rb +6 -0
  320. data/spec/app/models/employer.rb +5 -0
  321. data/spec/app/models/entry.rb +6 -0
  322. data/spec/app/models/eraser.rb +1 -0
  323. data/spec/app/models/event.rb +22 -0
  324. data/spec/app/models/exhibition.rb +4 -0
  325. data/spec/app/models/exhibitor.rb +5 -0
  326. data/spec/app/models/eye.rb +9 -0
  327. data/spec/app/models/eye_bowl.rb +9 -0
  328. data/spec/app/models/face.rb +8 -0
  329. data/spec/app/models/favorite.rb +6 -0
  330. data/spec/app/models/filesystem.rb +5 -0
  331. data/spec/app/models/fire_hydrant.rb +6 -0
  332. data/spec/app/models/firefox.rb +4 -0
  333. data/spec/app/models/fish.rb +7 -0
  334. data/spec/app/models/folder.rb +7 -0
  335. data/spec/app/models/folder_item.rb +9 -0
  336. data/spec/app/models/fruits.rb +28 -0
  337. data/spec/app/models/game.rb +19 -0
  338. data/spec/app/models/ghost.rb +7 -0
  339. data/spec/app/models/home.rb +4 -0
  340. data/spec/app/models/house.rb +6 -0
  341. data/spec/app/models/html_writer.rb +3 -0
  342. data/spec/app/models/image.rb +22 -0
  343. data/spec/app/models/implant.rb +16 -0
  344. data/spec/app/models/item.rb +8 -0
  345. data/spec/app/models/jar.rb +7 -0
  346. data/spec/app/models/label.rb +40 -0
  347. data/spec/app/models/language.rb +5 -0
  348. data/spec/app/models/lat_lng.rb +15 -0
  349. data/spec/app/models/league.rb +11 -0
  350. data/spec/app/models/learner.rb +2 -0
  351. data/spec/app/models/line_item.rb +6 -0
  352. data/spec/app/models/location.rb +8 -0
  353. data/spec/app/models/login.rb +8 -0
  354. data/spec/app/models/manufacturer.rb +7 -0
  355. data/spec/app/models/meat.rb +4 -0
  356. data/spec/app/models/membership.rb +4 -0
  357. data/spec/app/models/mixed_drink.rb +4 -0
  358. data/spec/app/models/movie.rb +13 -0
  359. data/spec/app/models/my_hash.rb +2 -0
  360. data/spec/app/models/name.rb +23 -0
  361. data/spec/app/models/node.rb +5 -0
  362. data/spec/app/models/note.rb +12 -0
  363. data/spec/app/models/ordered_post.rb +6 -0
  364. data/spec/app/models/ordered_preference.rb +6 -0
  365. data/spec/app/models/oscar.rb +15 -0
  366. data/spec/app/models/override.rb +16 -0
  367. data/spec/app/models/ownable.rb +6 -0
  368. data/spec/app/models/owner.rb +6 -0
  369. data/spec/app/models/pack.rb +3 -0
  370. data/spec/app/models/page.rb +5 -0
  371. data/spec/app/models/page_question.rb +4 -0
  372. data/spec/app/models/palette.rb +7 -0
  373. data/spec/app/models/parent.rb +5 -0
  374. data/spec/app/models/parent_doc.rb +6 -0
  375. data/spec/app/models/passport.rb +5 -0
  376. data/spec/app/models/patient.rb +9 -0
  377. data/spec/app/models/pdf_writer.rb +3 -0
  378. data/spec/app/models/pencil.rb +1 -0
  379. data/spec/app/models/person.rb +205 -0
  380. data/spec/app/models/pet.rb +23 -0
  381. data/spec/app/models/pet_owner.rb +6 -0
  382. data/spec/app/models/phone.rb +11 -0
  383. data/spec/app/models/pizza.rb +7 -0
  384. data/spec/app/models/player.rb +35 -0
  385. data/spec/app/models/post.rb +44 -0
  386. data/spec/app/models/powerup.rb +11 -0
  387. data/spec/app/models/preference.rb +9 -0
  388. data/spec/app/models/princess.rb +8 -0
  389. data/spec/app/models/product.rb +15 -0
  390. data/spec/app/models/profile.rb +5 -0
  391. data/spec/app/models/pronunciation.rb +5 -0
  392. data/spec/app/models/purchase.rb +4 -0
  393. data/spec/app/models/question.rb +8 -0
  394. data/spec/app/models/quiz.rb +7 -0
  395. data/spec/app/models/rating.rb +8 -0
  396. data/spec/app/models/record.rb +46 -0
  397. data/spec/app/models/registry.rb +4 -0
  398. data/spec/app/models/role.rb +7 -0
  399. data/spec/app/models/root_category.rb +4 -0
  400. data/spec/app/models/sandwich.rb +4 -0
  401. data/spec/app/models/scheduler.rb +7 -0
  402. data/spec/app/models/seo.rb +7 -0
  403. data/spec/app/models/series.rb +4 -0
  404. data/spec/app/models/server.rb +13 -0
  405. data/spec/app/models/service.rb +22 -0
  406. data/spec/app/models/shape.rb +12 -0
  407. data/spec/app/models/shelf.rb +5 -0
  408. data/spec/app/models/shipping_container.rb +5 -0
  409. data/spec/app/models/shipping_pack.rb +3 -0
  410. data/spec/app/models/shop.rb +6 -0
  411. data/spec/app/models/short_agent.rb +4 -0
  412. data/spec/app/models/short_quiz.rb +5 -0
  413. data/spec/app/models/slave.rb +6 -0
  414. data/spec/app/models/song.rb +8 -0
  415. data/spec/app/models/sound.rb +5 -0
  416. data/spec/app/models/square.rb +4 -0
  417. data/spec/app/models/strategy.rb +3 -0
  418. data/spec/app/models/sub_item.rb +3 -0
  419. data/spec/app/models/subscription.rb +4 -0
  420. data/spec/app/models/survey.rb +5 -0
  421. data/spec/app/models/symptom.rb +6 -0
  422. data/spec/app/models/tag.rb +8 -0
  423. data/spec/app/models/target.rb +5 -0
  424. data/spec/app/models/template.rb +5 -0
  425. data/spec/app/models/thing.rb +9 -0
  426. data/spec/app/models/title.rb +3 -0
  427. data/spec/app/models/tool.rb +8 -0
  428. data/spec/app/models/topping.rb +5 -0
  429. data/spec/app/models/track.rb +38 -0
  430. data/spec/app/models/translation.rb +5 -0
  431. data/spec/app/models/tree.rb +9 -0
  432. data/spec/app/models/truck.rb +3 -0
  433. data/spec/app/models/user.rb +21 -0
  434. data/spec/app/models/user_account.rb +10 -0
  435. data/spec/app/models/validation_callback.rb +10 -0
  436. data/spec/app/models/vehicle.rb +11 -0
  437. data/spec/app/models/version.rb +5 -0
  438. data/spec/app/models/vet_visit.rb +5 -0
  439. data/spec/app/models/video.rb +13 -0
  440. data/spec/app/models/weapon.rb +11 -0
  441. data/spec/app/models/wiki_page.rb +14 -0
  442. data/spec/app/models/word.rb +15 -0
  443. data/spec/app/models/word_origin.rb +11 -0
  444. data/spec/app/models/writer.rb +11 -0
  445. data/spec/config/mongoid.yml +38 -0
  446. data/spec/mongoid/atomic/modifiers_spec.rb +456 -0
  447. data/spec/mongoid/atomic/paths/embedded/many_spec.rb +118 -0
  448. data/spec/mongoid/atomic/paths/embedded/one_spec.rb +110 -0
  449. data/spec/mongoid/atomic/paths/root_spec.rb +48 -0
  450. data/spec/mongoid/atomic/paths_spec.rb +270 -0
  451. data/spec/mongoid/atomic_spec.rb +365 -0
  452. data/spec/mongoid/attributes/nested_spec.rb +4832 -0
  453. data/spec/mongoid/attributes/readonly_spec.rb +169 -0
  454. data/spec/mongoid/attributes_spec.rb +1412 -0
  455. data/spec/mongoid/changeable_spec.rb +1507 -0
  456. data/spec/mongoid/composable_spec.rb +24 -0
  457. data/spec/mongoid/config/environment_spec.rb +83 -0
  458. data/spec/mongoid/config/options_spec.rb +56 -0
  459. data/spec/mongoid/config_spec.rb +318 -0
  460. data/spec/mongoid/contextual/aggregable/memory_spec.rb +293 -0
  461. data/spec/mongoid/contextual/aggregable/mongo_spec.rb +455 -0
  462. data/spec/mongoid/contextual/atomic_spec.rb +529 -0
  463. data/spec/mongoid/contextual/find_and_modify_spec.rb +220 -0
  464. data/spec/mongoid/contextual/geo_near_spec.rb +405 -0
  465. data/spec/mongoid/contextual/map_reduce_spec.rb +464 -0
  466. data/spec/mongoid/contextual/memory_spec.rb +1236 -0
  467. data/spec/mongoid/contextual/mongo_spec.rb +1843 -0
  468. data/spec/mongoid/contextual/text_search_spec.rb +207 -0
  469. data/spec/mongoid/copyable_spec.rb +393 -0
  470. data/spec/mongoid/criteria/findable_spec.rb +1189 -0
  471. data/spec/mongoid/criteria/inspectable_spec.rb +27 -0
  472. data/spec/mongoid/criteria/marshalable_spec.rb +28 -0
  473. data/spec/mongoid/criteria/modifiable_spec.rb +1063 -0
  474. data/spec/mongoid/criteria/scopable_spec.rb +391 -0
  475. data/spec/mongoid/criteria_spec.rb +3821 -0
  476. data/spec/mongoid/document_spec.rb +1205 -0
  477. data/spec/mongoid/equality_spec.rb +241 -0
  478. data/spec/mongoid/errors/ambiguous_relationship_spec.rb +29 -0
  479. data/spec/mongoid/errors/callback_spec.rb +29 -0
  480. data/spec/mongoid/errors/delete_restriction_spec.rb +29 -0
  481. data/spec/mongoid/errors/document_not_found_spec.rb +104 -0
  482. data/spec/mongoid/errors/eager_load_spec.rb +29 -0
  483. data/spec/mongoid/errors/invalid_collection_spec.rb +36 -0
  484. data/spec/mongoid/errors/invalid_config_option_spec.rb +29 -0
  485. data/spec/mongoid/errors/invalid_field_option_spec.rb +29 -0
  486. data/spec/mongoid/errors/invalid_field_spec.rb +37 -0
  487. data/spec/mongoid/errors/invalid_find_spec.rb +29 -0
  488. data/spec/mongoid/errors/invalid_includes_spec.rb +40 -0
  489. data/spec/mongoid/errors/invalid_index_spec.rb +29 -0
  490. data/spec/mongoid/errors/invalid_options_spec.rb +29 -0
  491. data/spec/mongoid/errors/invalid_path_spec.rb +23 -0
  492. data/spec/mongoid/errors/invalid_scope_spec.rb +29 -0
  493. data/spec/mongoid/errors/invalid_set_polymorphic_relation_spec.rb +17 -0
  494. data/spec/mongoid/errors/invalid_storage_options_spec.rb +29 -0
  495. data/spec/mongoid/errors/invalid_time_spec.rb +29 -0
  496. data/spec/mongoid/errors/inverse_not_found_spec.rb +29 -0
  497. data/spec/mongoid/errors/mixed_relations_spec.rb +29 -0
  498. data/spec/mongoid/errors/mixed_session_configuration_spec.rb +29 -0
  499. data/spec/mongoid/errors/mongoid_error_spec.rb +48 -0
  500. data/spec/mongoid/errors/nested_attributes_metadata_not_found_spec.rb +29 -0
  501. data/spec/mongoid/errors/no_environment_spec.rb +29 -0
  502. data/spec/mongoid/errors/no_map_reduce_output_spec.rb +29 -0
  503. data/spec/mongoid/errors/no_metadata_spec.rb +23 -0
  504. data/spec/mongoid/errors/no_parent_spec.rb +29 -0
  505. data/spec/mongoid/errors/no_session_config_spec.rb +29 -0
  506. data/spec/mongoid/errors/no_session_database_spec.rb +29 -0
  507. data/spec/mongoid/errors/no_session_hosts_spec.rb +29 -0
  508. data/spec/mongoid/errors/no_sessions_config_spec.rb +29 -0
  509. data/spec/mongoid/errors/readonly_attribute_spec.rb +29 -0
  510. data/spec/mongoid/errors/scope_overwrite_spec.rb +29 -0
  511. data/spec/mongoid/errors/too_many_nested_attribute_records_spec.rb +29 -0
  512. data/spec/mongoid/errors/unknown_attribute_spec.rb +29 -0
  513. data/spec/mongoid/errors/unsaved_document_spec.rb +37 -0
  514. data/spec/mongoid/errors/unsupported_javascript_spec.rb +29 -0
  515. data/spec/mongoid/errors/validations_spec.rb +45 -0
  516. data/spec/mongoid/extensions/array_spec.rb +638 -0
  517. data/spec/mongoid/extensions/big_decimal_spec.rb +104 -0
  518. data/spec/mongoid/extensions/binary_spec.rb +60 -0
  519. data/spec/mongoid/extensions/boolean_spec.rb +135 -0
  520. data/spec/mongoid/extensions/date_spec.rb +235 -0
  521. data/spec/mongoid/extensions/date_time_spec.rb +155 -0
  522. data/spec/mongoid/extensions/false_class_spec.rb +42 -0
  523. data/spec/mongoid/extensions/float_spec.rb +133 -0
  524. data/spec/mongoid/extensions/hash_spec.rb +333 -0
  525. data/spec/mongoid/extensions/integer_spec.rb +136 -0
  526. data/spec/mongoid/extensions/module_spec.rb +42 -0
  527. data/spec/mongoid/extensions/nil_class_spec.rb +11 -0
  528. data/spec/mongoid/extensions/object_id_spec.rb +946 -0
  529. data/spec/mongoid/extensions/object_spec.rb +292 -0
  530. data/spec/mongoid/extensions/range_spec.rb +105 -0
  531. data/spec/mongoid/extensions/regexp_spec.rb +47 -0
  532. data/spec/mongoid/extensions/set_spec.rb +33 -0
  533. data/spec/mongoid/extensions/string_spec.rb +357 -0
  534. data/spec/mongoid/extensions/symbol_spec.rb +76 -0
  535. data/spec/mongoid/extensions/time_spec.rb +467 -0
  536. data/spec/mongoid/extensions/time_with_zone_spec.rb +405 -0
  537. data/spec/mongoid/extensions/true_class_spec.rb +42 -0
  538. data/spec/mongoid/extensions_spec.rb +15 -0
  539. data/spec/mongoid/factory_spec.rb +185 -0
  540. data/spec/mongoid/fields/foreign_key_spec.rb +694 -0
  541. data/spec/mongoid/fields/internal/foreign_keys/array_spec.rb +184 -0
  542. data/spec/mongoid/fields/internal/foreign_keys/object_spec.rb +201 -0
  543. data/spec/mongoid/fields/localized_spec.rb +386 -0
  544. data/spec/mongoid/fields/standard_spec.rb +166 -0
  545. data/spec/mongoid/fields_spec.rb +1229 -0
  546. data/spec/mongoid/findable_spec.rb +342 -0
  547. data/spec/mongoid/identity_map_spec.rb +564 -0
  548. data/spec/mongoid/indexable/specification_spec.rb +87 -0
  549. data/spec/mongoid/indexable_spec.rb +504 -0
  550. data/spec/mongoid/inspectable_spec.rb +49 -0
  551. data/spec/mongoid/interceptable_spec.rb +1564 -0
  552. data/spec/mongoid/loggable_spec.rb +21 -0
  553. data/spec/mongoid/matchable/all_spec.rb +31 -0
  554. data/spec/mongoid/matchable/and_spec.rb +162 -0
  555. data/spec/mongoid/matchable/default_spec.rb +130 -0
  556. data/spec/mongoid/matchable/exists_spec.rb +57 -0
  557. data/spec/mongoid/matchable/gt_spec.rb +75 -0
  558. data/spec/mongoid/matchable/gte_spec.rb +74 -0
  559. data/spec/mongoid/matchable/in_spec.rb +25 -0
  560. data/spec/mongoid/matchable/lt_spec.rb +74 -0
  561. data/spec/mongoid/matchable/lte_spec.rb +74 -0
  562. data/spec/mongoid/matchable/ne_spec.rb +25 -0
  563. data/spec/mongoid/matchable/nin_spec.rb +25 -0
  564. data/spec/mongoid/matchable/or_spec.rb +106 -0
  565. data/spec/mongoid/matchable/size_spec.rb +25 -0
  566. data/spec/mongoid/matchable_spec.rb +532 -0
  567. data/spec/mongoid/persistable/creatable_spec.rb +512 -0
  568. data/spec/mongoid/persistable/deletable_spec.rb +205 -0
  569. data/spec/mongoid/persistable/destroyable_spec.rb +148 -0
  570. data/spec/mongoid/persistable/incrementable_spec.rb +173 -0
  571. data/spec/mongoid/persistable/logical_spec.rb +143 -0
  572. data/spec/mongoid/persistable/poppable_spec.rb +115 -0
  573. data/spec/mongoid/persistable/pullable_spec.rb +228 -0
  574. data/spec/mongoid/persistable/pushable_spec.rb +258 -0
  575. data/spec/mongoid/persistable/renamable_spec.rb +135 -0
  576. data/spec/mongoid/persistable/savable_spec.rb +432 -0
  577. data/spec/mongoid/persistable/settable_spec.rb +139 -0
  578. data/spec/mongoid/persistable/unsettable_spec.rb +155 -0
  579. data/spec/mongoid/persistable/updatable_spec.rb +522 -0
  580. data/spec/mongoid/persistable/upsertable_spec.rb +106 -0
  581. data/spec/mongoid/persistable_spec.rb +206 -0
  582. data/spec/mongoid/positional_spec.rb +227 -0
  583. data/spec/mongoid/railties/document_spec.rb +24 -0
  584. data/spec/mongoid/relations/accessors_spec.rb +736 -0
  585. data/spec/mongoid/relations/auto_save_spec.rb +261 -0
  586. data/spec/mongoid/relations/bindings/embedded/in_spec.rb +171 -0
  587. data/spec/mongoid/relations/bindings/embedded/many_spec.rb +54 -0
  588. data/spec/mongoid/relations/bindings/embedded/one_spec.rb +77 -0
  589. data/spec/mongoid/relations/bindings/referenced/in_spec.rb +241 -0
  590. data/spec/mongoid/relations/bindings/referenced/many_spec.rb +153 -0
  591. data/spec/mongoid/relations/bindings/referenced/many_to_many_spec.rb +178 -0
  592. data/spec/mongoid/relations/bindings/referenced/one_spec.rb +131 -0
  593. data/spec/mongoid/relations/builders/embedded/in_spec.rb +34 -0
  594. data/spec/mongoid/relations/builders/embedded/many_spec.rb +132 -0
  595. data/spec/mongoid/relations/builders/embedded/one_spec.rb +99 -0
  596. data/spec/mongoid/relations/builders/nested_attributes/many_spec.rb +234 -0
  597. data/spec/mongoid/relations/builders/nested_attributes/one_spec.rb +250 -0
  598. data/spec/mongoid/relations/builders/referenced/in_spec.rb +241 -0
  599. data/spec/mongoid/relations/builders/referenced/many_spec.rb +137 -0
  600. data/spec/mongoid/relations/builders/referenced/many_to_many_spec.rb +178 -0
  601. data/spec/mongoid/relations/builders/referenced/one_spec.rb +124 -0
  602. data/spec/mongoid/relations/builders_spec.rb +226 -0
  603. data/spec/mongoid/relations/cascading/delete_spec.rb +101 -0
  604. data/spec/mongoid/relations/cascading/destroy_spec.rb +47 -0
  605. data/spec/mongoid/relations/cascading/nullify_spec.rb +32 -0
  606. data/spec/mongoid/relations/cascading/restrict_spec.rb +68 -0
  607. data/spec/mongoid/relations/cascading_spec.rb +355 -0
  608. data/spec/mongoid/relations/constraint_spec.rb +74 -0
  609. data/spec/mongoid/relations/conversions_spec.rb +126 -0
  610. data/spec/mongoid/relations/counter_cache_spec.rb +205 -0
  611. data/spec/mongoid/relations/cyclic_spec.rb +156 -0
  612. data/spec/mongoid/relations/embedded/dirty_spec.rb +65 -0
  613. data/spec/mongoid/relations/embedded/in_spec.rb +579 -0
  614. data/spec/mongoid/relations/embedded/many_spec.rb +3781 -0
  615. data/spec/mongoid/relations/embedded/one_spec.rb +1014 -0
  616. data/spec/mongoid/relations/macros_spec.rb +613 -0
  617. data/spec/mongoid/relations/metadata_spec.rb +1917 -0
  618. data/spec/mongoid/relations/options_spec.rb +35 -0
  619. data/spec/mongoid/relations/polymorphic_spec.rb +128 -0
  620. data/spec/mongoid/relations/proxy_spec.rb +48 -0
  621. data/spec/mongoid/relations/referenced/in_spec.rb +1435 -0
  622. data/spec/mongoid/relations/referenced/many_spec.rb +3546 -0
  623. data/spec/mongoid/relations/referenced/many_to_many_spec.rb +3556 -0
  624. data/spec/mongoid/relations/referenced/one_spec.rb +1289 -0
  625. data/spec/mongoid/relations/reflections_spec.rb +101 -0
  626. data/spec/mongoid/relations/synchronization_spec.rb +449 -0
  627. data/spec/mongoid/relations/targets/enumerable_spec.rb +1710 -0
  628. data/spec/mongoid/relations/touchable_spec.rb +296 -0
  629. data/spec/mongoid/relations_spec.rb +188 -0
  630. data/spec/mongoid/reloadable_spec.rb +305 -0
  631. data/spec/mongoid/scopable_spec.rb +926 -0
  632. data/spec/mongoid/selectable_spec.rb +134 -0
  633. data/spec/mongoid/serializable_spec.rb +862 -0
  634. data/spec/mongoid/sessions/factory_spec.rb +312 -0
  635. data/spec/mongoid/sessions/mongo_uri_spec.rb +103 -0
  636. data/spec/mongoid/sessions/options_spec.rb +71 -0
  637. data/spec/mongoid/sessions_spec.rb +1078 -0
  638. data/spec/mongoid/shardable_spec.rb +61 -0
  639. data/spec/mongoid/state_spec.rb +102 -0
  640. data/spec/mongoid/threaded_spec.rb +258 -0
  641. data/spec/mongoid/timestamps/created/short_spec.rb +51 -0
  642. data/spec/mongoid/timestamps/created_spec.rb +44 -0
  643. data/spec/mongoid/timestamps/updated/short_spec.rb +90 -0
  644. data/spec/mongoid/timestamps/updated_spec.rb +86 -0
  645. data/spec/mongoid/timestamps_spec.rb +112 -0
  646. data/spec/mongoid/traversable_spec.rb +244 -0
  647. data/spec/mongoid/unit_of_work_spec.rb +196 -0
  648. data/spec/mongoid/validatable/associated_spec.rb +183 -0
  649. data/spec/mongoid/validatable/format_spec.rb +83 -0
  650. data/spec/mongoid/validatable/length_spec.rb +119 -0
  651. data/spec/mongoid/validatable/numericality_spec.rb +30 -0
  652. data/spec/mongoid/validatable/presence_spec.rb +511 -0
  653. data/spec/mongoid/validatable/uniqueness_spec.rb +2305 -0
  654. data/spec/mongoid/validatable_spec.rb +309 -0
  655. data/spec/mongoid_spec.rb +74 -0
  656. data/spec/rack/mongoid/middleware/identity_map_spec.rb +72 -0
  657. data/spec/rails/mongoid_spec.rb +462 -0
  658. data/spec/spec_helper.rb +103 -0
  659. metadata +1159 -0
@@ -0,0 +1,139 @@
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 true" do
24
+ expect(set).to be_true
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 true" do
88
+ expect(set).to be_true
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
+ 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 true" do
20
+ expect(unset).to be_true
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 true" do
94
+ expect(unset).to be_true
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,522 @@
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.with(safe: true).send(method, 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.send(method, 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
+ before do
320
+ person.delete
321
+ end
322
+
323
+ it "raises an error" do
324
+ expect {
325
+ person.send(method, title: "something")
326
+ }.to raise_error
327
+ end
328
+ end
329
+
330
+ context "when updating through a one-to-one relation" do
331
+
332
+ let(:person) do
333
+ Person.create!
334
+ end
335
+
336
+ let(:game) do
337
+ Game.create(person: person)
338
+ end
339
+
340
+ before do
341
+ person.send(method, ssn: "444-44-4444")
342
+ game.person.send(method, ssn: "555-66-7777")
343
+ end
344
+
345
+ let(:from_db) do
346
+ Person.find(person.id)
347
+ end
348
+
349
+ it "saves the attributes" do
350
+ expect(person.ssn).to eq("555-66-7777")
351
+ end
352
+ end
353
+
354
+ context "on a new record" do
355
+
356
+ let(:person) do
357
+ Person.new
358
+ end
359
+
360
+ before do
361
+ person.send(method, pets: false, title: nil)
362
+ end
363
+
364
+ it "saves the new record" do
365
+ expect(Person.find(person.id)).to_not be_nil
366
+ end
367
+ end
368
+
369
+ context "when passing in a relation" do
370
+
371
+ context "when providing an embedded child" do
372
+
373
+ let!(:person) do
374
+ Person.create
375
+ end
376
+
377
+ let!(:name) do
378
+ person.create_name(first_name: "test", last_name: "user")
379
+ end
380
+
381
+ let(:new_name) do
382
+ Name.new(first_name: "Rupert", last_name: "Parkes")
383
+ end
384
+
385
+ before do
386
+ person.send(method, name: new_name)
387
+ end
388
+
389
+ it "updates the embedded document" do
390
+ expect(person.name).to eq(new_name)
391
+ end
392
+
393
+ it "persists the changes" do
394
+ expect(person.reload.name).to eq(new_name)
395
+ end
396
+ end
397
+
398
+ context "when providing a parent to a referenced in" do
399
+
400
+ let!(:person) do
401
+ Person.create
402
+ end
403
+
404
+ let!(:post) do
405
+ Post.create(title: "Testing")
406
+ end
407
+
408
+ context "when the relation has not yet been touched" do
409
+
410
+ before do
411
+ post.send(method, person: person)
412
+ end
413
+
414
+ it "sets the instance of the relation" do
415
+ expect(person.posts).to eq([ post ])
416
+ end
417
+
418
+ it "sets properly through method_missing" do
419
+ expect(person.posts.to_a).to eq([ post ])
420
+ end
421
+
422
+ it "persists the reference" do
423
+ expect(person.posts(true)).to eq([ post ])
424
+ end
425
+ end
426
+
427
+ context "when the relation has been touched" do
428
+
429
+ before do
430
+ person.posts
431
+ post.send(method, person: person)
432
+ end
433
+
434
+ it "sets the instance of the relation" do
435
+ expect(person.posts).to eq([ post ])
436
+ end
437
+
438
+ it "sets properly through method_missing" do
439
+ expect(person.posts.to_a).to eq([ post ])
440
+ end
441
+
442
+ it "persists the reference" do
443
+ expect(person.posts(true)).to eq([ post ])
444
+ end
445
+ end
446
+ end
447
+ end
448
+
449
+ context "when in a deeply nested hierarchy" do
450
+
451
+ let!(:person) do
452
+ Person.new(title: "The Boss")
453
+ end
454
+
455
+ let!(:phone_number) do
456
+ Phone.new(number: "123-456-7890")
457
+ end
458
+
459
+ let!(:country_code) do
460
+ CountryCode.new(code: 1)
461
+ end
462
+
463
+ before do
464
+ phone_number.country_code = country_code
465
+ person.phone_numbers << phone_number
466
+ person.save
467
+ end
468
+
469
+ it "sets the first level document" do
470
+ expect(person.phone_numbers.first).to eq(phone_number)
471
+ end
472
+
473
+ it "sets the second level document" do
474
+ expect(person.phone_numbers.first.country_code).to eq(country_code)
475
+ end
476
+
477
+ context "when updating the first level document" do
478
+
479
+ let(:phone) do
480
+ person.phone_numbers.first
481
+ end
482
+
483
+ before do
484
+ phone.number = "098-765-4321"
485
+ phone.send(method, number: "098-765-4321")
486
+ end
487
+
488
+ it "sets the new attributes" do
489
+ expect(phone.number).to eq("098-765-4321")
490
+ end
491
+
492
+ context "when reloading the root" do
493
+
494
+ let(:reloaded) do
495
+ person.reload
496
+ end
497
+
498
+ it "saves the new attributes" do
499
+ expect(reloaded.phone_numbers.first.number).to eq("098-765-4321")
500
+ end
501
+ end
502
+ end
503
+ end
504
+ end
505
+ end
506
+
507
+ describe "#update!" do
508
+
509
+ context "when a callback returns false" do
510
+
511
+ let(:oscar) do
512
+ Oscar.new
513
+ end
514
+
515
+ it "raises a callback error" do
516
+ expect {
517
+ oscar.update!(title: "The Grouch")
518
+ }.to raise_error(Mongoid::Errors::Callback)
519
+ end
520
+ end
521
+ end
522
+ end