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,342 @@
1
+ require "spec_helper"
2
+
3
+ describe Mongoid::Findable do
4
+
5
+ describe ".distinct" do
6
+
7
+ before do
8
+ Band.create(name: "Tool")
9
+ Band.create(name: "Photek")
10
+ end
11
+
12
+ it "returns the distinct values for the field" do
13
+ expect(Band.distinct(:name)).to eq([ "Tool", "Photek" ])
14
+ end
15
+ end
16
+
17
+ describe ".each" do
18
+
19
+ let!(:band) do
20
+ Band.create
21
+ end
22
+
23
+ it "iterates through all documents" do
24
+ Band.each do |band|
25
+ expect(band).to be_a(Band)
26
+ end
27
+ end
28
+ end
29
+
30
+ describe ".each_with_index" do
31
+
32
+ let!(:band) do
33
+ Band.create
34
+ end
35
+
36
+ it "iterates through all documents" do
37
+ Band.each_with_index do |band, index|
38
+ expect(index).to eq(0)
39
+ end
40
+ end
41
+ end
42
+
43
+ describe ".find_and_modify" do
44
+
45
+ let!(:person) do
46
+ Person.create(title: "Senior")
47
+ end
48
+
49
+ it "returns the document" do
50
+ expect(Person.find_and_modify(title: "Junior")).to eq(person)
51
+ end
52
+ end
53
+
54
+ describe ".find_by" do
55
+
56
+ context "when the document is found" do
57
+
58
+ let!(:person) do
59
+ Person.create(title: "sir")
60
+ end
61
+
62
+ context "when no block is provided" do
63
+
64
+ it "returns the document" do
65
+ expect(Person.find_by(title: "sir")).to eq(person)
66
+ end
67
+ end
68
+
69
+ context "when a block is provided" do
70
+
71
+ let(:result) do
72
+ Person.find_by(title: "sir") do |peep|
73
+ peep.age = 50
74
+ end
75
+ end
76
+
77
+ it "yields the returned document" do
78
+ expect(result.age).to eq(50)
79
+ end
80
+ end
81
+ end
82
+
83
+ context "when the document is not found" do
84
+
85
+ context "when raising a not found error" do
86
+
87
+ before do
88
+ Mongoid.raise_not_found_error = true
89
+ end
90
+
91
+ it "raises an error" do
92
+ expect {
93
+ Person.find_by(ssn: "333-22-1111")
94
+ }.to raise_error(Mongoid::Errors::DocumentNotFound)
95
+ end
96
+ end
97
+
98
+ context "when raising no error" do
99
+
100
+ before do
101
+ Mongoid.raise_not_found_error = false
102
+ end
103
+
104
+ after do
105
+ Mongoid.raise_not_found_error = true
106
+ end
107
+
108
+ context "when no block is provided" do
109
+
110
+ it "returns nil" do
111
+ expect(Person.find_by(ssn: "333-22-1111")).to be_nil
112
+ end
113
+ end
114
+
115
+ context "when a block is provided" do
116
+
117
+ let(:result) do
118
+ Person.find_by(ssn: "333-22-1111") do |peep|
119
+ peep.age = 50
120
+ end
121
+ end
122
+
123
+ it "returns nil" do
124
+ expect(result).to be_nil
125
+ end
126
+ end
127
+ end
128
+ end
129
+ end
130
+
131
+ describe ".first_or_create" do
132
+
133
+ context "when the document is found" do
134
+
135
+ let!(:person) do
136
+ Person.create
137
+ end
138
+
139
+ it "returns the document" do
140
+ expect(Person.first_or_create).to eq(person)
141
+ end
142
+ end
143
+
144
+ context "when the document is not found" do
145
+
146
+ context "when providing a document" do
147
+
148
+ let!(:person) do
149
+ Person.create
150
+ end
151
+
152
+ let(:from_db) do
153
+ Game.first_or_create(person: person)
154
+ end
155
+
156
+ it "returns the new document" do
157
+ expect(from_db.person).to eq(person)
158
+ end
159
+ end
160
+
161
+ context "when not providing a block" do
162
+
163
+ let!(:person) do
164
+ Person.first_or_create(title: "Senorita")
165
+ end
166
+
167
+ it "creates a persisted document" do
168
+ expect(person).to be_persisted
169
+ end
170
+
171
+ it "sets the attributes" do
172
+ expect(person.title).to eq("Senorita")
173
+ end
174
+ end
175
+
176
+ context "when providing a block" do
177
+
178
+ let!(:person) do
179
+ Person.first_or_create(title: "Senorita") do |person|
180
+ person.pets = true
181
+ end
182
+ end
183
+
184
+ it "creates a persisted document" do
185
+ expect(person).to be_persisted
186
+ end
187
+
188
+ it "sets the attributes" do
189
+ expect(person.title).to eq("Senorita")
190
+ end
191
+
192
+ it "calls the block" do
193
+ expect(person.pets).to be_true
194
+ end
195
+ end
196
+ end
197
+ end
198
+
199
+ describe ".first_or_initialize" do
200
+
201
+ context "when the document is found" do
202
+
203
+ let!(:person) do
204
+ Person.create
205
+ end
206
+
207
+ it "returns the document" do
208
+ expect(Person.first_or_create).to eq(person)
209
+ end
210
+ end
211
+
212
+ context "when the document is not found" do
213
+
214
+ context "when providing a document" do
215
+
216
+ let!(:person) do
217
+ Person.create
218
+ end
219
+
220
+ let(:found) do
221
+ Game.first_or_initialize(person: person)
222
+ end
223
+
224
+ it "returns the new document" do
225
+ expect(found.person).to eq(person)
226
+ end
227
+
228
+ it "does not save the document" do
229
+ expect(found).to_not be_persisted
230
+ end
231
+ end
232
+
233
+ context "when not providing a block" do
234
+
235
+ before do
236
+ Person.delete_all
237
+ end
238
+
239
+ let!(:person) do
240
+ Person.first_or_initialize(title: "esquire")
241
+ end
242
+
243
+ it "creates a non persisted document" do
244
+ expect(person).to_not be_persisted
245
+ end
246
+
247
+ it "sets the attributes" do
248
+ expect(person.title).to eq("esquire")
249
+ end
250
+ end
251
+
252
+ context "when providing a block" do
253
+
254
+ let!(:person) do
255
+ Person.first_or_initialize(title: "Senorita") do |person|
256
+ person.pets = true
257
+ end
258
+ end
259
+
260
+ it "creates a new document" do
261
+ expect(person).to_not be_persisted
262
+ end
263
+
264
+ it "sets the attributes" do
265
+ expect(person.title).to eq("Senorita")
266
+ end
267
+
268
+ it "calls the block" do
269
+ expect(person.pets).to be_true
270
+ end
271
+ end
272
+ end
273
+ end
274
+
275
+ describe ".pluck" do
276
+
277
+ let!(:depeche) do
278
+ Band.create(name: "Depeche Mode", likes: 3)
279
+ end
280
+
281
+ let!(:tool) do
282
+ Band.create(name: "Tool", likes: 3)
283
+ end
284
+
285
+ let!(:photek) do
286
+ Band.create(name: "Photek", likes: 1)
287
+ end
288
+
289
+ context "when field values exist" do
290
+
291
+ let(:plucked) do
292
+ Band.pluck(:name)
293
+ end
294
+
295
+ it "returns the field values" do
296
+ expect(plucked).to eq([ "Depeche Mode", "Tool", "Photek" ])
297
+ end
298
+ end
299
+
300
+ context "when field values do not exist" do
301
+
302
+ let(:plucked) do
303
+ Band.pluck(:follows)
304
+ end
305
+
306
+ it "returns an empty array" do
307
+ expect(plucked).to be_empty
308
+ end
309
+ end
310
+ end
311
+
312
+ Origin::Selectable.forwardables.each do |method|
313
+
314
+ describe "##{method}" do
315
+
316
+ it "forwards the #{method} to the criteria" do
317
+ expect(Band).to respond_to(method)
318
+ end
319
+ end
320
+ end
321
+
322
+ describe "#text_search" do
323
+
324
+ before do
325
+ Word.with(database: "admin").mongo_session.command(setParameter: 1, textSearchEnabled: true)
326
+ Word.create_indexes
327
+ Word.with(safe: true).create!(name: "phase", origin: "latin")
328
+ end
329
+
330
+ after(:all) do
331
+ Word.remove_indexes
332
+ end
333
+
334
+ let(:search) do
335
+ Word.text_search("phase")
336
+ end
337
+
338
+ it "returns all fields" do
339
+ expect(search.first.origin).to eq("latin")
340
+ end
341
+ end
342
+ end
@@ -0,0 +1,564 @@
1
+ require "spec_helper"
2
+
3
+ describe Mongoid::IdentityMap do
4
+
5
+ before(:all) do
6
+ Mongoid.identity_map_enabled = true
7
+ end
8
+
9
+ after(:all) do
10
+ Mongoid.identity_map_enabled = false
11
+ end
12
+
13
+ let(:identity_map) do
14
+ described_class.new
15
+ end
16
+
17
+ describe "#clear" do
18
+
19
+ before do
20
+ identity_map.set(Person.new)
21
+ end
22
+
23
+ let!(:clear) do
24
+ identity_map.clear
25
+ end
26
+
27
+ it "empties the identity map" do
28
+ expect(identity_map).to be_empty
29
+ end
30
+
31
+ it "returns an empty hash" do
32
+ expect(clear).to eq({})
33
+ end
34
+ end
35
+
36
+ describe ".clear" do
37
+
38
+ before do
39
+ described_class.set(Person.new)
40
+ end
41
+
42
+ let!(:clear) do
43
+ described_class.clear
44
+ end
45
+
46
+ it "returns an empty hash" do
47
+ expect(clear).to eq({})
48
+ end
49
+ end
50
+
51
+ describe "#get" do
52
+
53
+ context "normal model" do
54
+ let!(:person) do
55
+ Person.new
56
+ end
57
+
58
+ context "when getting by id" do
59
+
60
+ context "when the document exists in the identity map" do
61
+
62
+ before do
63
+ identity_map.set(person)
64
+ end
65
+
66
+ let(:get) do
67
+ identity_map.get(Person, person.id)
68
+ end
69
+
70
+ it "returns the matching person" do
71
+ expect(get).to eq(person)
72
+ end
73
+ end
74
+
75
+ context "when the person does not exist in the map" do
76
+
77
+ let(:get) do
78
+ identity_map.get(Person, person.id)
79
+ end
80
+
81
+ it "returns nil" do
82
+ expect(get).to be_nil
83
+ end
84
+ end
85
+ end
86
+
87
+ context "when getting by an array of ids" do
88
+
89
+ context "when the document exists in the identity map" do
90
+
91
+ before do
92
+ identity_map.set(person)
93
+ end
94
+
95
+ let(:get) do
96
+ identity_map.get(Person, [ person.id ])
97
+ end
98
+
99
+ it "returns the matching documents" do
100
+ expect(get).to eq([ person ])
101
+ end
102
+ end
103
+
104
+ context "when any id is not found in the map" do
105
+
106
+ before do
107
+ identity_map.set(person)
108
+ end
109
+
110
+ let(:get) do
111
+ identity_map.get(Person, [ person.id, Moped::BSON::ObjectId.new ])
112
+ end
113
+
114
+ it "returns nil" do
115
+ expect(get).to be_nil
116
+ end
117
+ end
118
+ end
119
+ end
120
+
121
+ context "inherited class" do
122
+
123
+ let!(:document) do
124
+ Firefox.new
125
+ end
126
+
127
+ context "when getting by id" do
128
+
129
+ context "when the document exists in the identity map" do
130
+
131
+ before do
132
+ identity_map.set(document)
133
+ end
134
+
135
+ it "returns the matching document by class" do
136
+ get = identity_map.get(Firefox, document.id)
137
+ expect(get).to eq(document)
138
+ end
139
+
140
+ it "returns the matching document by superclass" do
141
+ get = identity_map.get(Browser, document.id)
142
+ expect(get).to eq(document)
143
+ end
144
+
145
+ it "returns the matching document by class" do
146
+ get = identity_map.get(Canvas, document.id)
147
+ expect(get).to eq(document)
148
+ end
149
+ end
150
+
151
+ context "when the document does not exist in the map" do
152
+
153
+ let(:get) do
154
+ identity_map.get(Firefox, document.id)
155
+ end
156
+
157
+ it "returns nil" do
158
+ expect(get).to be_nil
159
+ end
160
+ end
161
+ end
162
+ end
163
+
164
+ context "embedded class" do
165
+
166
+ let!(:animal) do
167
+ circus = Circus.new(animals: [ Animal.new(name: "Lion") ])
168
+ circus.animals.first
169
+ end
170
+
171
+ context "when getting by id" do
172
+
173
+ context "when the document exists in the identity map" do
174
+
175
+ before do
176
+ identity_map.set(animal)
177
+ end
178
+
179
+ let(:get) do
180
+ identity_map.get(Animal, animal.id)
181
+ end
182
+
183
+ it "returns the matching document" do
184
+ expect(get).to eq(animal)
185
+ end
186
+ end
187
+
188
+ context "when the document does not exist in the map" do
189
+
190
+ let(:get) do
191
+ identity_map.get(Animal, animal.id)
192
+ end
193
+
194
+ it "returns nil" do
195
+ expect(get).to be_nil
196
+ end
197
+ end
198
+ end
199
+ end
200
+ end
201
+
202
+ describe ".get" do
203
+
204
+ let(:document) do
205
+ Person.new
206
+ end
207
+
208
+ context "when the document exists in the identity map" do
209
+
210
+ before do
211
+ described_class.set(document)
212
+ end
213
+
214
+ let(:get) do
215
+ described_class.get(Person, document.id)
216
+ end
217
+
218
+ it "returns the matching document" do
219
+ expect(get).to eq(document)
220
+ end
221
+ end
222
+
223
+ context "when the document does not exist in the map" do
224
+
225
+ let(:get) do
226
+ described_class.get(Person, document.id)
227
+ end
228
+
229
+ it "returns nil" do
230
+ expect(get).to be_nil
231
+ end
232
+ end
233
+
234
+ context "when the mongoid identity map is disabled" do
235
+
236
+ before do
237
+ Mongoid.identity_map_enabled = false
238
+ end
239
+
240
+ after do
241
+ Mongoid.identity_map_enabled = true
242
+ end
243
+
244
+ let(:get) do
245
+ described_class.get(Person, document.id)
246
+ end
247
+
248
+ it "returns nil" do
249
+ expect(get).to be_nil
250
+ end
251
+ end
252
+ end
253
+
254
+ describe "#get_many" do
255
+
256
+ let!(:person) do
257
+ Person.new
258
+ end
259
+
260
+ context "when getting by selector" do
261
+
262
+ let!(:post_one) do
263
+ Post.new(person: person)
264
+ end
265
+
266
+ let!(:post_two) do
267
+ Post.new(person: person)
268
+ end
269
+
270
+ context "when there are documents in the map" do
271
+
272
+ before do
273
+ identity_map.set_many(post_one, person_id: person.id)
274
+ identity_map.set_many(post_two, person_id: person.id)
275
+ end
276
+
277
+ let(:documents) do
278
+ identity_map.get_many(Post, person_id: person.id)
279
+ end
280
+
281
+ it "returns the matching documents" do
282
+ expect(documents).to eq([ post_one, post_two ])
283
+ end
284
+ end
285
+
286
+ context "when there are no documents in the map" do
287
+
288
+ let(:documents) do
289
+ identity_map.get_many(Post, person_id: person.id)
290
+ end
291
+
292
+ it "returns nil" do
293
+ expect(documents).to be_nil
294
+ end
295
+ end
296
+ end
297
+ end
298
+
299
+ describe "#remove" do
300
+
301
+ let(:document) do
302
+ Person.new
303
+ end
304
+
305
+ let!(:set) do
306
+ identity_map.set(document)
307
+ end
308
+
309
+ context "when provided a document" do
310
+
311
+ context "when the document has an id" do
312
+
313
+ let!(:removed) do
314
+ identity_map.remove(document)
315
+ end
316
+
317
+ it "deletes the document from the map" do
318
+ expect(identity_map.get(Person, document.id)).to be_nil
319
+ end
320
+
321
+ it "returns the document" do
322
+ expect(removed).to eq(document)
323
+ end
324
+ end
325
+
326
+ context "when the document has no id" do
327
+
328
+ before do
329
+ document.id = nil
330
+ end
331
+
332
+ let!(:removed) do
333
+ identity_map.remove(document)
334
+ end
335
+
336
+ it "returns nil" do
337
+ expect(removed).to be_nil
338
+ end
339
+ end
340
+ end
341
+
342
+ context "when provided nil" do
343
+
344
+ let!(:removed) do
345
+ identity_map.remove(nil)
346
+ end
347
+
348
+ it "returns nil" do
349
+ expect(removed).to be_nil
350
+ end
351
+ end
352
+ end
353
+
354
+ describe "#set" do
355
+
356
+ context "when setting a document" do
357
+
358
+ context "when the identity map is enabled" do
359
+
360
+ let(:document) do
361
+ Person.new
362
+ end
363
+
364
+ let!(:set) do
365
+ identity_map.set(document)
366
+ end
367
+
368
+ it "puts the object in the identity map" do
369
+ expect(identity_map.get(Person, document.id)).to eq(document)
370
+ end
371
+
372
+ it "returns the document" do
373
+ expect(set).to eq(document)
374
+ end
375
+ end
376
+
377
+ context "when the identity map is disabled" do
378
+
379
+ before do
380
+ Mongoid.identity_map_enabled = false
381
+ end
382
+
383
+ after do
384
+ Mongoid.identity_map_enabled = true
385
+ end
386
+
387
+ let(:document) do
388
+ Person.new
389
+ end
390
+
391
+ let!(:set) do
392
+ identity_map.set(document)
393
+ end
394
+
395
+ it "does not put the object in the identity map" do
396
+ expect(identity_map).to be_empty
397
+ end
398
+
399
+ it "returns nil" do
400
+ expect(set).to be_nil
401
+ end
402
+ end
403
+ end
404
+
405
+ context "when setting a document with a nil id" do
406
+
407
+ let(:document) do
408
+ Person.new.tap do |person|
409
+ person.id = nil
410
+ end
411
+ end
412
+
413
+ let!(:set) do
414
+ identity_map.set(document)
415
+ end
416
+
417
+ it "does not put the object in the identity map" do
418
+ expect(identity_map.get(nil, nil)).to be_nil
419
+ end
420
+
421
+ it "returns nil" do
422
+ expect(set).to be_nil
423
+ end
424
+ end
425
+
426
+ context "when setting nil" do
427
+
428
+ let!(:set) do
429
+ identity_map.set(nil)
430
+ end
431
+
432
+ it "places nothing in the map" do
433
+ expect(identity_map).to be_empty
434
+ end
435
+
436
+ it "returns nil" do
437
+ expect(set).to be_nil
438
+ end
439
+ end
440
+ end
441
+
442
+ describe "#set_many" do
443
+
444
+ let!(:person) do
445
+ Person.new
446
+ end
447
+
448
+ let!(:post_one) do
449
+ Post.new(person: person)
450
+ end
451
+
452
+ let!(:post_two) do
453
+ Post.new(person: person)
454
+ end
455
+
456
+ context "when no documents exist for the selector" do
457
+
458
+ let!(:set) do
459
+ identity_map.set_many(post_one, { person_id: person.id })
460
+ identity_map.set_many(post_two, { person_id: person.id })
461
+ end
462
+
463
+ let(:documents) do
464
+ identity_map[Post.collection_name][{ person_id: person.id }]
465
+ end
466
+
467
+ it "puts the documents in the map" do
468
+ expect(documents).to eq({
469
+ post_one.id => post_one, post_two.id => post_two
470
+ })
471
+ end
472
+ end
473
+ end
474
+
475
+ describe "#set_one" do
476
+
477
+ let!(:person) do
478
+ Person.new
479
+ end
480
+
481
+ let!(:post_one) do
482
+ Post.new(person: person)
483
+ end
484
+
485
+ context "when no documents exist for the selector" do
486
+
487
+ let!(:set) do
488
+ identity_map.set_one(post_one, { person_id: person.id })
489
+ end
490
+
491
+ let(:document) do
492
+ identity_map[Post.collection_name][{ person_id: person.id }]
493
+ end
494
+
495
+ it "puts the documents in the map" do
496
+ expect(document).to eq(post_one)
497
+ end
498
+ end
499
+ end
500
+
501
+ describe ".set" do
502
+
503
+ context "when setting a document" do
504
+
505
+ let(:document) do
506
+ Person.new
507
+ end
508
+
509
+ let!(:set) do
510
+ described_class.set(document)
511
+ end
512
+
513
+ it "puts the object in the identity map" do
514
+ expect(described_class.get(Person, document.id)).to eq(document)
515
+ end
516
+
517
+ it "returns the document" do
518
+ expect(set).to eq(document)
519
+ end
520
+ end
521
+
522
+ context "when setting nil" do
523
+
524
+ let!(:set) do
525
+ described_class.set(nil)
526
+ end
527
+
528
+ it "returns nil" do
529
+ expect(set).to be_nil
530
+ end
531
+ end
532
+ end
533
+
534
+ context "when accessing hash methods directly" do
535
+
536
+ Hash.public_instance_methods(false).each do |method|
537
+
538
+ it "can access #{method} at the class level" do
539
+ expect(described_class).to respond_to(method)
540
+ end
541
+ end
542
+ end
543
+
544
+ context "when executing in a fiber" do
545
+
546
+ describe "#.get" do
547
+
548
+ let(:document) do
549
+ Person.new
550
+ end
551
+
552
+ let(:fiber) do
553
+ Fiber.new do
554
+ described_class.set(document)
555
+ expect(described_class.get(Person, document.id)).to eq(document)
556
+ end
557
+ end
558
+
559
+ it "gets the object from the identity map" do
560
+ fiber.resume
561
+ end
562
+ end
563
+ end
564
+ end