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,185 @@
1
+ require "spec_helper"
2
+
3
+ describe Mongoid::Factory do
4
+
5
+ describe ".build" do
6
+
7
+ context "when the type attribute is present" do
8
+
9
+ let(:attributes) do
10
+ { "_type" => "Person", "title" => "Sir" }
11
+ end
12
+
13
+ context "when the type is a class" do
14
+
15
+ let(:person) do
16
+ described_class.build(Person, attributes)
17
+ end
18
+
19
+ it "instantiates based on the type" do
20
+ expect(person.title).to eq("Sir")
21
+ end
22
+ end
23
+
24
+ context "when the type is a not a subclass" do
25
+
26
+ let(:person) do
27
+ described_class.build(Person, { "_type" => "Canvas" })
28
+ end
29
+
30
+ it "instantiates the provided class" do
31
+ expect(person.class).to eq(Person)
32
+ end
33
+ end
34
+
35
+ context "when the type is a subclass of the provided" do
36
+
37
+ let(:person) do
38
+ described_class.build(Person, { "_type" => "Doctor" })
39
+ end
40
+
41
+ it "instantiates the subclass" do
42
+ expect(person.class).to eq(Doctor)
43
+ end
44
+ end
45
+
46
+ context "when type is an empty string" do
47
+
48
+ let(:attributes) do
49
+ { "title" => "Sir", "_type" => "" }
50
+ end
51
+
52
+ let(:person) do
53
+ described_class.build(Person, attributes)
54
+ end
55
+
56
+ it "instantiates based on the type" do
57
+ expect(person.title).to eq("Sir")
58
+ end
59
+ end
60
+
61
+ context "when type is the lower case class name" do
62
+
63
+ let(:attributes) do
64
+ { "title" => "Sir", "_type" => "person" }
65
+ end
66
+
67
+ let(:person) do
68
+ described_class.build(Person, attributes)
69
+ end
70
+
71
+ it "instantiates based on the type" do
72
+ expect(person.title).to eq("Sir")
73
+ end
74
+ end
75
+ end
76
+
77
+ context "when type is not preset" do
78
+
79
+ let(:attributes) do
80
+ { "title" => "Sir" }
81
+ end
82
+
83
+ let(:person) do
84
+ described_class.build(Person, attributes)
85
+ end
86
+
87
+ it "instantiates based on the provided class" do
88
+ expect(person.title).to eq("Sir")
89
+ end
90
+ end
91
+ end
92
+
93
+ describe ".from_db" do
94
+
95
+ context "when the attributes are nil" do
96
+
97
+ let(:document) do
98
+ described_class.from_db(Address, nil)
99
+ end
100
+
101
+ it "generates based on the provided class" do
102
+ expect(document).to be_a(Address)
103
+ end
104
+
105
+ it "sets the attributes to empty" do
106
+ expect(document.attributes).to be_empty
107
+ end
108
+ end
109
+
110
+ context "when a type is in the attributes" do
111
+
112
+ context "when the type is a class" do
113
+
114
+ let(:attributes) do
115
+ { "_type" => "Person", "title" => "Sir" }
116
+ end
117
+
118
+ let(:document) do
119
+ described_class.from_db(Address, attributes)
120
+ end
121
+
122
+ it "generates based on the type" do
123
+ expect(document).to be_a(Person)
124
+ end
125
+
126
+ it "sets the attributes" do
127
+ expect(document.title).to eq("Sir")
128
+ end
129
+ end
130
+
131
+ context "when the type is empty" do
132
+
133
+ let(:attributes) do
134
+ { "_type" => "", "title" => "Sir" }
135
+ end
136
+
137
+ let(:document) do
138
+ described_class.from_db(Person, attributes)
139
+ end
140
+
141
+ it "generates based on the provided class" do
142
+ expect(document).to be_a(Person)
143
+ end
144
+
145
+ it "sets the attributes" do
146
+ expect(document.title).to eq("Sir")
147
+ end
148
+ end
149
+
150
+ context "when type is the lower case class name" do
151
+
152
+ let(:attributes) do
153
+ { "title" => "Sir", "_type" => "person" }
154
+ end
155
+
156
+ let(:person) do
157
+ described_class.from_db(Person, attributes)
158
+ end
159
+
160
+ it "instantiates based on the type" do
161
+ expect(person.title).to eq("Sir")
162
+ end
163
+ end
164
+ end
165
+
166
+ context "when a type is not in the attributes" do
167
+
168
+ let(:attributes) do
169
+ { "title" => "Sir" }
170
+ end
171
+
172
+ let(:document) do
173
+ described_class.from_db(Person, attributes)
174
+ end
175
+
176
+ it "generates based on the provided class" do
177
+ expect(document).to be_a(Person)
178
+ end
179
+
180
+ it "sets the attributes" do
181
+ expect(document.title).to eq("Sir")
182
+ end
183
+ end
184
+ end
185
+ end
@@ -0,0 +1,694 @@
1
+ require "spec_helper"
2
+
3
+ describe Mongoid::Fields::ForeignKey do
4
+
5
+ describe "#add_atomic_changes" do
6
+
7
+ let(:field) do
8
+ described_class.new(
9
+ :vals,
10
+ metadata: Person.relations["preferences"],
11
+ type: Array,
12
+ default: [],
13
+ identity: true
14
+ )
15
+ end
16
+
17
+ let(:person) do
18
+ Person.new
19
+ end
20
+
21
+ let(:preference_one) do
22
+ Preference.new
23
+ end
24
+
25
+ let(:preference_two) do
26
+ Preference.new
27
+ end
28
+
29
+ let(:preference_three) do
30
+ Preference.new
31
+ end
32
+
33
+ let(:mods) do
34
+ {}
35
+ end
36
+
37
+ before do
38
+ person.preferences.concat([ preference_one, preference_three ])
39
+ end
40
+
41
+ context "when adding and removing" do
42
+
43
+ before do
44
+ field.add_atomic_changes(
45
+ person,
46
+ "preference_ids",
47
+ "preference_ids",
48
+ mods,
49
+ [ preference_three.id ],
50
+ [ preference_two.id ]
51
+ )
52
+ end
53
+
54
+ it "adds the current to the modifications" do
55
+ expect(mods["preference_ids"]).to eq(
56
+ [ preference_one.id, preference_three.id ]
57
+ )
58
+ end
59
+ end
60
+ end
61
+
62
+ describe "#eval_default" do
63
+
64
+ let(:default) do
65
+ [ Moped::BSON::ObjectId.new ]
66
+ end
67
+
68
+ let(:field) do
69
+ described_class.new(
70
+ :vals,
71
+ metadata: Person.relations["posts"],
72
+ type: Array,
73
+ default: default,
74
+ identity: true
75
+ )
76
+ end
77
+
78
+ it "dups the default value" do
79
+ expect(field.eval_default(Person.new)).to_not equal(default)
80
+ end
81
+
82
+ it "returns the correct value" do
83
+ expect(field.eval_default(Person.new)).to eq(default)
84
+ end
85
+ end
86
+
87
+ describe "#foreign_key?" do
88
+
89
+ let(:field) do
90
+ described_class.new(
91
+ :vals,
92
+ metadata: Person.relations["posts"],
93
+ type: Array,
94
+ default: [],
95
+ identity: true
96
+ )
97
+ end
98
+
99
+ it "returns true" do
100
+ expect(field).to be_foreign_key
101
+ end
102
+ end
103
+
104
+ describe "#evolve" do
105
+
106
+ let(:metadata) do
107
+ Person.reflect_on_association(:preferences)
108
+ end
109
+
110
+ context "when provided a document" do
111
+
112
+ let(:field) do
113
+ described_class.new(:person_id, type: Object, metadata: metadata)
114
+ end
115
+
116
+ let(:game) do
117
+ Game.new
118
+ end
119
+
120
+ let(:evolved) do
121
+ field.evolve(game)
122
+ end
123
+
124
+ it "returns the id for the document" do
125
+ expect(evolved).to eq(game.id)
126
+ end
127
+ end
128
+
129
+ context "when the type is an array" do
130
+
131
+ let(:field) do
132
+ described_class.new(:preference_ids, type: Array, default: [], metadata: metadata)
133
+ end
134
+
135
+ context "when providing a single value" do
136
+
137
+ context "when the value is an id string" do
138
+
139
+ let(:id) do
140
+ Moped::BSON::ObjectId.new
141
+ end
142
+
143
+ let(:evolved) do
144
+ field.evolve(id.to_s)
145
+ end
146
+
147
+ it "converts the value to an object id" do
148
+ expect(evolved).to eq(id)
149
+ end
150
+ end
151
+
152
+ context "when the value is a normal string" do
153
+
154
+ let(:evolved) do
155
+ field.evolve("testing")
156
+ end
157
+
158
+ it "does not convert the value" do
159
+ expect(evolved).to eq("testing")
160
+ end
161
+ end
162
+
163
+ context "when the value is an empty string" do
164
+
165
+ let(:evolved) do
166
+ field.evolve("")
167
+ end
168
+
169
+ it "does not convert the value" do
170
+ expect(evolved).to be_empty
171
+ end
172
+ end
173
+ end
174
+
175
+ context "when providing an array" do
176
+
177
+ context "when the values are id strings" do
178
+
179
+ context "when the relation stores ids as object ids" do
180
+
181
+ let(:id_one) do
182
+ Moped::BSON::ObjectId.new
183
+ end
184
+
185
+ let(:id_two) do
186
+ Moped::BSON::ObjectId.new
187
+ end
188
+
189
+ let(:evolved) do
190
+ field.evolve([ id_one.to_s, id_two.to_s ])
191
+ end
192
+
193
+ it "converts the value to an object id" do
194
+ expect(evolved).to eq([ id_one, id_two ])
195
+ end
196
+ end
197
+
198
+ context "when the relation stores ids as strings" do
199
+
200
+ let!(:metadata) do
201
+ Agent.reflect_on_association(:accounts)
202
+ end
203
+
204
+ let!(:field) do
205
+ described_class.new(:account_ids, type: Array, default: [], metadata: metadata)
206
+ end
207
+
208
+ let(:id_one) do
209
+ Moped::BSON::ObjectId.new.to_s
210
+ end
211
+
212
+ let(:id_two) do
213
+ Moped::BSON::ObjectId.new.to_s
214
+ end
215
+
216
+ let(:evolved) do
217
+ field.evolve([ id_one, id_two ])
218
+ end
219
+
220
+ it "does not convert the values to object ids" do
221
+ expect(evolved).to eq([ id_one, id_two ])
222
+ end
223
+ end
224
+ end
225
+
226
+ context "when the values are normal strings" do
227
+
228
+ let(:evolved) do
229
+ field.evolve([ "testing" ])
230
+ end
231
+
232
+ it "does not convert the value" do
233
+ expect(evolved).to eq([ "testing" ])
234
+ end
235
+ end
236
+
237
+ context "when the values are empty strings" do
238
+
239
+ let(:evolved) do
240
+ field.evolve([ "" ])
241
+ end
242
+
243
+ it "does not convert the value" do
244
+ expect(evolved).to eq([ "" ])
245
+ end
246
+ end
247
+
248
+ context "when the values are nils" do
249
+
250
+ let(:evolved) do
251
+ field.evolve([ nil ])
252
+ end
253
+
254
+ it "does not convert the value" do
255
+ expect(evolved).to eq([ nil ])
256
+ end
257
+ end
258
+ end
259
+ end
260
+
261
+ context "when the type is an object" do
262
+
263
+ let(:metadata) do
264
+ Game.reflect_on_association(:person)
265
+ end
266
+
267
+ let(:field) do
268
+ described_class.new(:person_id, type: Object, metadata: metadata)
269
+ end
270
+
271
+ context "when providing a single value" do
272
+
273
+ context "when the relation stores object ids" do
274
+
275
+ context "when the value is an id string" do
276
+
277
+ let(:id) do
278
+ Moped::BSON::ObjectId.new
279
+ end
280
+
281
+ let(:evolved) do
282
+ field.evolve(id.to_s)
283
+ end
284
+
285
+ it "converts the value to an object id" do
286
+ expect(evolved).to eq(id)
287
+ end
288
+ end
289
+
290
+ context "when the value is a normal string" do
291
+
292
+ let(:evolved) do
293
+ field.evolve("testing")
294
+ end
295
+
296
+ it "does not convert the value" do
297
+ expect(evolved).to eq("testing")
298
+ end
299
+ end
300
+
301
+ context "when the value is an empty string" do
302
+
303
+ let(:evolved) do
304
+ field.evolve("")
305
+ end
306
+
307
+ it "does not convert the value" do
308
+ expect(evolved).to be_empty
309
+ end
310
+ end
311
+ end
312
+
313
+ context "when the relation stores string ids" do
314
+
315
+ let(:metadata) do
316
+ Comment.reflect_on_association(:account)
317
+ end
318
+
319
+ let(:field) do
320
+ described_class.new(:person_id, type: Object, metadata: metadata)
321
+ end
322
+
323
+ context "when the value is an id string" do
324
+
325
+ let(:id) do
326
+ Moped::BSON::ObjectId.new
327
+ end
328
+
329
+ let(:evolved) do
330
+ field.evolve(id.to_s)
331
+ end
332
+
333
+ it "does not convert the value to an object id" do
334
+ expect(evolved).to eq(id.to_s)
335
+ end
336
+ end
337
+
338
+ context "when the value is a normal string" do
339
+
340
+ let(:evolved) do
341
+ field.evolve("testing")
342
+ end
343
+
344
+ it "does not convert the value" do
345
+ expect(evolved).to eq("testing")
346
+ end
347
+ end
348
+
349
+ context "when the value is an empty string" do
350
+
351
+ let(:evolved) do
352
+ field.evolve("")
353
+ end
354
+
355
+ it "does not convert the value" do
356
+ expect(evolved).to be_empty
357
+ end
358
+ end
359
+ end
360
+ end
361
+
362
+ context "when providing an array" do
363
+
364
+ context "when the values are id strings" do
365
+
366
+ context "when the relation stores ids as object ids" do
367
+
368
+ let(:id_one) do
369
+ Moped::BSON::ObjectId.new
370
+ end
371
+
372
+ let(:id_two) do
373
+ Moped::BSON::ObjectId.new
374
+ end
375
+
376
+ let(:evolved) do
377
+ field.evolve([ id_one.to_s, id_two.to_s ])
378
+ end
379
+
380
+ it "converts the value to an object id" do
381
+ expect(evolved).to eq([ id_one, id_two ])
382
+ end
383
+ end
384
+
385
+ context "when the relation stores ids as strings" do
386
+
387
+ let(:metadata) do
388
+ Comment.reflect_on_association(:account)
389
+ end
390
+
391
+ let(:field) do
392
+ described_class.new(:person_id, type: Object, metadata: metadata)
393
+ end
394
+
395
+ let(:id_one) do
396
+ Moped::BSON::ObjectId.new.to_s
397
+ end
398
+
399
+ let(:id_two) do
400
+ Moped::BSON::ObjectId.new.to_s
401
+ end
402
+
403
+ let(:evolved) do
404
+ field.evolve([ id_one, id_two ])
405
+ end
406
+
407
+ it "does not convert the values to object ids" do
408
+ expect(evolved).to eq([ id_one, id_two ])
409
+ end
410
+ end
411
+ end
412
+
413
+ context "when the values are normal strings" do
414
+
415
+ let(:evolved) do
416
+ field.evolve([ "testing" ])
417
+ end
418
+
419
+ it "does not convert the value" do
420
+ expect(evolved).to eq([ "testing" ])
421
+ end
422
+ end
423
+
424
+ context "when the values are empty strings" do
425
+
426
+ let(:evolved) do
427
+ field.evolve([ "" ])
428
+ end
429
+
430
+ it "does not convert the value" do
431
+ expect(evolved).to eq([ "" ])
432
+ end
433
+ end
434
+
435
+ context "when the values are nils" do
436
+
437
+ let(:evolved) do
438
+ field.evolve([ nil ])
439
+ end
440
+
441
+ it "does not convert the value" do
442
+ expect(evolved).to eq([ nil ])
443
+ end
444
+ end
445
+ end
446
+ end
447
+ end
448
+
449
+ describe "#lazy?" do
450
+
451
+ context "when the key is resizable" do
452
+
453
+ let(:field) do
454
+ described_class.new(:test, type: Array)
455
+ end
456
+
457
+ it "returns true" do
458
+ expect(field).to be_lazy
459
+ end
460
+ end
461
+
462
+ context "when the key is not resizable" do
463
+
464
+ let(:field) do
465
+ described_class.new(:test, type: Moped::BSON::ObjectId)
466
+ end
467
+
468
+ it "returns false" do
469
+ expect(field).to_not be_lazy
470
+ end
471
+ end
472
+ end
473
+
474
+ describe "#mongoize" do
475
+
476
+ context "when the type is array" do
477
+
478
+ context "when the array is object ids" do
479
+
480
+ let(:metadata) do
481
+ Mongoid::Relations::Metadata.new(
482
+ inverse_class_name: "Game",
483
+ name: :person,
484
+ relation: Mongoid::Relations::Referenced::In
485
+ )
486
+ end
487
+
488
+ let(:field) do
489
+ described_class.new(
490
+ :vals,
491
+ type: Array,
492
+ default: [],
493
+ identity: true,
494
+ metadata: metadata
495
+ )
496
+ end
497
+
498
+ context "when provided nil" do
499
+
500
+ it "returns an empty array" do
501
+ expect(field.mongoize(nil)).to be_empty
502
+ end
503
+ end
504
+
505
+ context "when provided an empty array" do
506
+
507
+ let(:array) do
508
+ []
509
+ end
510
+
511
+ it "returns an empty array" do
512
+ expect(field.mongoize(array)).to eq(array)
513
+ end
514
+
515
+ it "returns the same instance" do
516
+ expect(field.mongoize(array)).to equal(array)
517
+ end
518
+ end
519
+
520
+ context "when using object ids" do
521
+
522
+ let(:object_id) do
523
+ Moped::BSON::ObjectId.new
524
+ end
525
+
526
+ it "performs conversion on the ids if strings" do
527
+ expect(field.mongoize([object_id.to_s])).to eq([object_id])
528
+ end
529
+ end
530
+
531
+ context "when not using object ids" do
532
+
533
+ let(:object_id) do
534
+ Moped::BSON::ObjectId.new
535
+ end
536
+
537
+ before do
538
+ Person.field(
539
+ :_id,
540
+ type: String,
541
+ pre_processed: true,
542
+ default: ->{ Moped::BSON::ObjectId.new.to_s }
543
+ )
544
+ end
545
+
546
+ after do
547
+ Person.field(
548
+ :_id,
549
+ type: Moped::BSON::ObjectId,
550
+ pre_processed: true,
551
+ default: ->{ Moped::BSON::ObjectId.new }
552
+ )
553
+ end
554
+
555
+ it "does not convert" do
556
+ expect(field.mongoize([object_id.to_s])).to eq([object_id.to_s])
557
+ end
558
+ end
559
+ end
560
+ end
561
+
562
+ context "when the type is object" do
563
+
564
+ context "when the array is object ids" do
565
+
566
+ let(:metadata) do
567
+ Mongoid::Relations::Metadata.new(
568
+ inverse_class_name: "Game",
569
+ name: :person,
570
+ relation: Mongoid::Relations::Referenced::In
571
+ )
572
+ end
573
+
574
+ let(:field) do
575
+ described_class.new(
576
+ :vals,
577
+ type: Object,
578
+ default: nil,
579
+ identity: true,
580
+ metadata: metadata
581
+ )
582
+ end
583
+
584
+ context "when using object ids" do
585
+
586
+ let(:object_id) do
587
+ Moped::BSON::ObjectId.new
588
+ end
589
+
590
+ it "performs conversion on the ids if strings" do
591
+ expect(field.mongoize(object_id.to_s)).to eq(object_id)
592
+ end
593
+ end
594
+
595
+ context "when not using object ids" do
596
+
597
+ context "when using strings" do
598
+
599
+ context "when provided a string" do
600
+
601
+ let(:object_id) do
602
+ Moped::BSON::ObjectId.new
603
+ end
604
+
605
+ before do
606
+ Person.field(
607
+ :_id,
608
+ type: String,
609
+ pre_processed: true,
610
+ default: ->{ Moped::BSON::ObjectId.new.to_s }
611
+ )
612
+ end
613
+
614
+ after do
615
+ Person.field(
616
+ :_id,
617
+ type: Moped::BSON::ObjectId,
618
+ pre_processed: true,
619
+ default: ->{ Moped::BSON::ObjectId.new }
620
+ )
621
+ end
622
+
623
+ it "does not convert" do
624
+ expect(field.mongoize(object_id.to_s)).to eq(object_id.to_s)
625
+ end
626
+ end
627
+ end
628
+
629
+ context "when using integers" do
630
+
631
+ context "when provided a string" do
632
+
633
+ before do
634
+ Person.field(:_id, type: Integer)
635
+ end
636
+
637
+ after do
638
+ Person.field(
639
+ :_id,
640
+ type: Moped::BSON::ObjectId,
641
+ pre_processed: true,
642
+ default: ->{ Moped::BSON::ObjectId.new }
643
+ )
644
+ end
645
+
646
+ it "converts the string to an integer" do
647
+ expect(field.mongoize("1")).to eq(1)
648
+ end
649
+ end
650
+ end
651
+ end
652
+ end
653
+ end
654
+ end
655
+
656
+ describe "#resizable" do
657
+
658
+ context "when the type is an array" do
659
+
660
+ let(:field) do
661
+ described_class.new(:vals, type: Array, default: [])
662
+ end
663
+
664
+ it "returns true" do
665
+ expect(field).to be_resizable
666
+ end
667
+ end
668
+
669
+ context "when the type is an object" do
670
+
671
+ let(:field) do
672
+ described_class.new(:vals, type: Object, default: [])
673
+ end
674
+
675
+ it "returns false" do
676
+ expect(field).to_not be_resizable
677
+ end
678
+ end
679
+ end
680
+
681
+ context "when the foreign key points is a many to many" do
682
+
683
+ context "when the related document stores non object ids" do
684
+
685
+ let(:agent) do
686
+ Agent.new(account_ids: [ true, false, 1, 2 ])
687
+ end
688
+
689
+ it "casts the ids on the initial set" do
690
+ expect(agent.account_ids).to eq([ "true", "false", "1", "2" ])
691
+ end
692
+ end
693
+ end
694
+ end