mongoid 7.5.4 → 8.1.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (414) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data/CHANGELOG.md +3 -3
  4. data/README.md +6 -6
  5. data/lib/config/locales/en.yml +92 -43
  6. data/lib/mongoid/association/accessors.rb +40 -11
  7. data/lib/mongoid/association/bindable.rb +50 -2
  8. data/lib/mongoid/association/builders.rb +5 -3
  9. data/lib/mongoid/association/constrainable.rb +0 -1
  10. data/lib/mongoid/association/eager_loadable.rb +29 -7
  11. data/lib/mongoid/association/embedded/batchable.rb +34 -11
  12. data/lib/mongoid/association/embedded/cyclic.rb +1 -1
  13. data/lib/mongoid/association/embedded/embedded_in/binding.rb +24 -2
  14. data/lib/mongoid/association/embedded/embedded_in/buildable.rb +2 -2
  15. data/lib/mongoid/association/embedded/embedded_in/proxy.rb +4 -3
  16. data/lib/mongoid/association/embedded/embedded_in.rb +3 -2
  17. data/lib/mongoid/association/embedded/embeds_many/binding.rb +1 -0
  18. data/lib/mongoid/association/embedded/embeds_many/buildable.rb +4 -3
  19. data/lib/mongoid/association/embedded/embeds_many/proxy.rb +69 -45
  20. data/lib/mongoid/association/embedded/embeds_many.rb +2 -2
  21. data/lib/mongoid/association/embedded/embeds_one/buildable.rb +19 -5
  22. data/lib/mongoid/association/embedded/embeds_one/proxy.rb +24 -5
  23. data/lib/mongoid/association/embedded/embeds_one.rb +3 -3
  24. data/lib/mongoid/association/macros.rb +8 -1
  25. data/lib/mongoid/association/many.rb +11 -7
  26. data/lib/mongoid/association/nested/many.rb +5 -4
  27. data/lib/mongoid/association/nested/nested_buildable.rb +4 -4
  28. data/lib/mongoid/association/nested/one.rb +45 -7
  29. data/lib/mongoid/association/one.rb +2 -2
  30. data/lib/mongoid/association/options.rb +9 -9
  31. data/lib/mongoid/association/proxy.rb +15 -4
  32. data/lib/mongoid/association/referenced/auto_save.rb +4 -3
  33. data/lib/mongoid/association/referenced/belongs_to/binding.rb +1 -0
  34. data/lib/mongoid/association/referenced/belongs_to/buildable.rb +1 -1
  35. data/lib/mongoid/association/referenced/belongs_to/proxy.rb +5 -6
  36. data/lib/mongoid/association/referenced/belongs_to.rb +2 -2
  37. data/lib/mongoid/association/referenced/counter_cache.rb +10 -10
  38. data/lib/mongoid/association/referenced/eager.rb +2 -2
  39. data/lib/mongoid/association/referenced/has_and_belongs_to_many/proxy.rb +70 -13
  40. data/lib/mongoid/association/referenced/has_and_belongs_to_many.rb +6 -3
  41. data/lib/mongoid/association/referenced/has_many/enumerable.rb +22 -30
  42. data/lib/mongoid/association/referenced/has_many/proxy.rb +29 -19
  43. data/lib/mongoid/association/referenced/has_many.rb +3 -3
  44. data/lib/mongoid/association/referenced/has_one/buildable.rb +1 -1
  45. data/lib/mongoid/association/referenced/has_one/nested_builder.rb +5 -5
  46. data/lib/mongoid/association/referenced/has_one/proxy.rb +9 -12
  47. data/lib/mongoid/association/referenced/has_one.rb +3 -3
  48. data/lib/mongoid/association/referenced/syncable.rb +4 -4
  49. data/lib/mongoid/association/reflections.rb +4 -4
  50. data/lib/mongoid/association/relatable.rb +44 -10
  51. data/lib/mongoid/association.rb +5 -5
  52. data/lib/mongoid/atomic/modifiers.rb +2 -2
  53. data/lib/mongoid/atomic.rb +7 -0
  54. data/lib/mongoid/attributes/dynamic.rb +4 -4
  55. data/lib/mongoid/attributes/nested.rb +6 -6
  56. data/lib/mongoid/attributes/processing.rb +37 -6
  57. data/lib/mongoid/attributes/projector.rb +2 -2
  58. data/lib/mongoid/attributes/readonly.rb +3 -3
  59. data/lib/mongoid/attributes.rb +51 -42
  60. data/lib/mongoid/changeable.rb +147 -14
  61. data/lib/mongoid/clients/options.rb +5 -1
  62. data/lib/mongoid/clients/sessions.rb +2 -14
  63. data/lib/mongoid/clients/storage_options.rb +2 -5
  64. data/lib/mongoid/clients/validators/storage.rb +3 -15
  65. data/lib/mongoid/collection_configurable.rb +58 -0
  66. data/lib/mongoid/composable.rb +2 -0
  67. data/lib/mongoid/config/defaults.rb +60 -0
  68. data/lib/mongoid/config/options.rb +3 -0
  69. data/lib/mongoid/config/validators/async_query_executor.rb +24 -0
  70. data/lib/mongoid/config/validators/client.rb +6 -6
  71. data/lib/mongoid/config/validators.rb +1 -0
  72. data/lib/mongoid/config.rb +140 -18
  73. data/lib/mongoid/contextual/aggregable/memory.rb +24 -16
  74. data/lib/mongoid/contextual/aggregable/mongo.rb +5 -5
  75. data/lib/mongoid/contextual/aggregable/none.rb +1 -1
  76. data/lib/mongoid/contextual/atomic.rb +1 -1
  77. data/lib/mongoid/contextual/geo_near.rb +7 -7
  78. data/lib/mongoid/contextual/map_reduce.rb +2 -2
  79. data/lib/mongoid/contextual/memory.rb +285 -58
  80. data/lib/mongoid/contextual/mongo/documents_loader.rb +177 -0
  81. data/lib/mongoid/contextual/mongo.rb +517 -346
  82. data/lib/mongoid/contextual/none.rb +193 -20
  83. data/lib/mongoid/contextual/queryable.rb +1 -1
  84. data/lib/mongoid/contextual.rb +14 -2
  85. data/lib/mongoid/copyable.rb +32 -8
  86. data/lib/mongoid/criteria/findable.rb +8 -5
  87. data/lib/mongoid/criteria/includable.rb +27 -22
  88. data/lib/mongoid/criteria/marshalable.rb +10 -2
  89. data/lib/mongoid/criteria/permission.rb +1 -1
  90. data/lib/mongoid/criteria/queryable/aggregable.rb +2 -2
  91. data/lib/mongoid/criteria/queryable/extensions/array.rb +3 -16
  92. data/lib/mongoid/criteria/queryable/extensions/big_decimal.rb +25 -4
  93. data/lib/mongoid/criteria/queryable/extensions/boolean.rb +2 -2
  94. data/lib/mongoid/criteria/queryable/extensions/date.rb +6 -1
  95. data/lib/mongoid/criteria/queryable/extensions/date_time.rb +6 -1
  96. data/lib/mongoid/criteria/queryable/extensions/hash.rb +1 -17
  97. data/lib/mongoid/criteria/queryable/extensions/numeric.rb +1 -9
  98. data/lib/mongoid/criteria/queryable/extensions/object.rb +2 -1
  99. data/lib/mongoid/criteria/queryable/extensions/range.rb +13 -5
  100. data/lib/mongoid/criteria/queryable/extensions/regexp.rb +3 -3
  101. data/lib/mongoid/criteria/queryable/extensions/set.rb +1 -1
  102. data/lib/mongoid/criteria/queryable/extensions/string.rb +4 -14
  103. data/lib/mongoid/criteria/queryable/extensions/symbol.rb +4 -12
  104. data/lib/mongoid/criteria/queryable/extensions/time.rb +6 -1
  105. data/lib/mongoid/criteria/queryable/extensions/time_with_zone.rb +6 -1
  106. data/lib/mongoid/criteria/queryable/key.rb +4 -4
  107. data/lib/mongoid/criteria/queryable/mergeable.rb +1 -1
  108. data/lib/mongoid/criteria/queryable/optional.rb +11 -17
  109. data/lib/mongoid/criteria/queryable/options.rb +2 -2
  110. data/lib/mongoid/criteria/queryable/pipeline.rb +1 -1
  111. data/lib/mongoid/criteria/queryable/selectable.rb +47 -38
  112. data/lib/mongoid/criteria/queryable/selector.rb +92 -7
  113. data/lib/mongoid/criteria/queryable/smash.rb +40 -7
  114. data/lib/mongoid/criteria/queryable.rb +12 -7
  115. data/lib/mongoid/criteria/scopable.rb +2 -2
  116. data/lib/mongoid/criteria/translator.rb +45 -0
  117. data/lib/mongoid/criteria.rb +20 -40
  118. data/lib/mongoid/deprecable.rb +36 -0
  119. data/lib/mongoid/deprecation.rb +25 -0
  120. data/lib/mongoid/document.rb +127 -35
  121. data/lib/mongoid/equality.rb +8 -8
  122. data/lib/mongoid/errors/create_collection_failure.rb +33 -0
  123. data/lib/mongoid/errors/document_not_found.rb +10 -6
  124. data/lib/mongoid/errors/drop_collection_failure.rb +27 -0
  125. data/lib/mongoid/errors/immutable_attribute.rb +26 -0
  126. data/lib/mongoid/errors/invalid_async_query_executor.rb +25 -0
  127. data/lib/mongoid/errors/invalid_config_option.rb +1 -1
  128. data/lib/mongoid/errors/invalid_dependent_strategy.rb +1 -1
  129. data/lib/mongoid/errors/invalid_dot_dollar_assignment.rb +23 -0
  130. data/lib/mongoid/errors/invalid_field.rb +6 -2
  131. data/lib/mongoid/errors/invalid_field_type.rb +26 -0
  132. data/lib/mongoid/errors/invalid_global_executor_concurrency.rb +22 -0
  133. data/lib/mongoid/errors/invalid_relation.rb +1 -1
  134. data/lib/mongoid/errors/invalid_relation_option.rb +1 -1
  135. data/lib/mongoid/errors/invalid_session_use.rb +1 -1
  136. data/lib/mongoid/errors/invalid_storage_options.rb +1 -1
  137. data/lib/mongoid/errors/invalid_storage_parent.rb +2 -0
  138. data/lib/mongoid/errors/mongoid_error.rb +3 -3
  139. data/lib/mongoid/errors/nested_attributes_metadata_not_found.rb +1 -1
  140. data/lib/mongoid/errors/no_client_database.rb +1 -1
  141. data/lib/mongoid/errors/no_client_hosts.rb +1 -1
  142. data/lib/mongoid/errors/readonly_attribute.rb +1 -1
  143. data/lib/mongoid/errors/too_many_nested_attribute_records.rb +1 -1
  144. data/lib/mongoid/errors/unknown_attribute.rb +1 -1
  145. data/lib/mongoid/errors.rb +6 -3
  146. data/lib/mongoid/extensions/array.rb +9 -7
  147. data/lib/mongoid/extensions/big_decimal.rb +33 -10
  148. data/lib/mongoid/extensions/binary.rb +42 -0
  149. data/lib/mongoid/extensions/boolean.rb +8 -2
  150. data/lib/mongoid/extensions/date.rb +26 -20
  151. data/lib/mongoid/extensions/date_time.rb +1 -1
  152. data/lib/mongoid/extensions/false_class.rb +1 -1
  153. data/lib/mongoid/extensions/float.rb +7 -4
  154. data/lib/mongoid/extensions/hash.rb +19 -8
  155. data/lib/mongoid/extensions/integer.rb +7 -4
  156. data/lib/mongoid/extensions/module.rb +1 -1
  157. data/lib/mongoid/extensions/object.rb +10 -8
  158. data/lib/mongoid/extensions/range.rb +41 -10
  159. data/lib/mongoid/extensions/regexp.rb +11 -4
  160. data/lib/mongoid/extensions/set.rb +11 -4
  161. data/lib/mongoid/extensions/string.rb +11 -22
  162. data/lib/mongoid/extensions/symbol.rb +4 -15
  163. data/lib/mongoid/extensions/time.rb +29 -16
  164. data/lib/mongoid/extensions/time_with_zone.rb +1 -2
  165. data/lib/mongoid/extensions/true_class.rb +1 -1
  166. data/lib/mongoid/extensions.rb +1 -0
  167. data/lib/mongoid/factory.rb +55 -7
  168. data/lib/mongoid/fields/foreign_key.rb +11 -4
  169. data/lib/mongoid/fields/localized.rb +19 -4
  170. data/lib/mongoid/fields/standard.rb +17 -7
  171. data/lib/mongoid/fields/validators/macro.rb +3 -9
  172. data/lib/mongoid/fields.rb +129 -20
  173. data/lib/mongoid/findable.rb +54 -24
  174. data/lib/mongoid/indexable/specification.rb +2 -2
  175. data/lib/mongoid/indexable/validators/options.rb +6 -2
  176. data/lib/mongoid/interceptable.rb +76 -15
  177. data/lib/mongoid/matchable.rb +1 -1
  178. data/lib/mongoid/matcher/eq_impl.rb +1 -1
  179. data/lib/mongoid/matcher/type.rb +1 -1
  180. data/lib/mongoid/matcher.rb +33 -13
  181. data/lib/mongoid/persistable/creatable.rb +19 -9
  182. data/lib/mongoid/persistable/deletable.rb +2 -2
  183. data/lib/mongoid/persistable/destroyable.rb +1 -1
  184. data/lib/mongoid/persistable/savable.rb +14 -2
  185. data/lib/mongoid/persistable/unsettable.rb +2 -2
  186. data/lib/mongoid/persistable/updatable.rb +69 -12
  187. data/lib/mongoid/persistable/upsertable.rb +21 -2
  188. data/lib/mongoid/persistable.rb +6 -3
  189. data/lib/mongoid/persistence_context.rb +6 -4
  190. data/lib/mongoid/query_cache.rb +13 -261
  191. data/lib/mongoid/railties/controller_runtime.rb +1 -1
  192. data/lib/mongoid/railties/database.rake +7 -2
  193. data/lib/mongoid/reloadable.rb +10 -8
  194. data/lib/mongoid/scopable.rb +15 -13
  195. data/lib/mongoid/selectable.rb +1 -2
  196. data/lib/mongoid/serializable.rb +10 -6
  197. data/lib/mongoid/stateful.rb +57 -10
  198. data/lib/mongoid/tasks/database.rake +12 -0
  199. data/lib/mongoid/tasks/database.rb +20 -2
  200. data/lib/mongoid/threaded/lifecycle.rb +5 -5
  201. data/lib/mongoid/threaded.rb +42 -12
  202. data/lib/mongoid/timestamps/created.rb +1 -1
  203. data/lib/mongoid/timestamps/updated.rb +2 -2
  204. data/lib/mongoid/touchable.rb +2 -3
  205. data/lib/mongoid/traversable.rb +5 -4
  206. data/lib/mongoid/utils.rb +22 -0
  207. data/lib/mongoid/validatable/localizable.rb +1 -1
  208. data/lib/mongoid/validatable/macros.rb +5 -7
  209. data/lib/mongoid/validatable/presence.rb +2 -2
  210. data/lib/mongoid/validatable/uniqueness.rb +9 -8
  211. data/lib/mongoid/validatable.rb +9 -6
  212. data/lib/mongoid/version.rb +1 -1
  213. data/lib/mongoid/warnings.rb +19 -4
  214. data/lib/mongoid.rb +17 -3
  215. data/spec/config/mongoid.yml +16 -0
  216. data/spec/integration/app_spec.rb +10 -14
  217. data/spec/integration/associations/belongs_to_spec.rb +18 -0
  218. data/spec/integration/associations/embedded_spec.rb +15 -0
  219. data/spec/integration/associations/embeds_many_spec.rb +15 -2
  220. data/spec/integration/associations/embeds_one_spec.rb +18 -0
  221. data/spec/integration/associations/foreign_key_spec.rb +9 -0
  222. data/spec/integration/associations/has_and_belongs_to_many_spec.rb +21 -0
  223. data/spec/integration/associations/has_one_spec.rb +97 -1
  224. data/spec/integration/associations/scope_option_spec.rb +1 -1
  225. data/spec/integration/callbacks_models.rb +132 -1
  226. data/spec/integration/callbacks_spec.rb +360 -4
  227. data/spec/integration/criteria/range_spec.rb +95 -1
  228. data/spec/integration/discriminator_key_spec.rb +118 -80
  229. data/spec/integration/dots_and_dollars_spec.rb +277 -0
  230. data/spec/integration/i18n_fallbacks_spec.rb +3 -32
  231. data/spec/integration/matcher_examples_spec.rb +20 -13
  232. data/spec/integration/matcher_operator_data/type_decimal.yml +3 -2
  233. data/spec/integration/matcher_operator_spec.rb +3 -5
  234. data/spec/integration/persistence/range_field_spec.rb +350 -0
  235. data/spec/mongoid/association/counter_cache_spec.rb +1 -1
  236. data/spec/mongoid/association/depending_spec.rb +9 -9
  237. data/spec/mongoid/association/eager_spec.rb +2 -1
  238. data/spec/mongoid/association/embedded/embedded_in/binding_spec.rb +2 -1
  239. data/spec/mongoid/association/embedded/embedded_in/buildable_spec.rb +54 -0
  240. data/spec/mongoid/association/embedded/embedded_in/proxy_spec.rb +96 -9
  241. data/spec/mongoid/association/embedded/embeds_many/buildable_spec.rb +112 -0
  242. data/spec/mongoid/association/embedded/embeds_many/proxy_spec.rb +255 -65
  243. data/spec/mongoid/association/embedded/embeds_many_models.rb +37 -0
  244. data/spec/mongoid/association/embedded/embeds_many_query_spec.rb +12 -0
  245. data/spec/mongoid/association/embedded/embeds_many_spec.rb +68 -0
  246. data/spec/mongoid/association/embedded/embeds_one/buildable_spec.rb +25 -0
  247. data/spec/mongoid/association/embedded/embeds_one/proxy_spec.rb +15 -2
  248. data/spec/mongoid/association/embedded/embeds_one_models.rb +19 -0
  249. data/spec/mongoid/association/embedded/embeds_one_spec.rb +28 -0
  250. data/spec/mongoid/association/referenced/belongs_to/binding_spec.rb +2 -1
  251. data/spec/mongoid/association/referenced/belongs_to/buildable_spec.rb +54 -0
  252. data/spec/mongoid/association/referenced/belongs_to/proxy_spec.rb +15 -0
  253. data/spec/mongoid/association/referenced/belongs_to_models.rb +11 -0
  254. data/spec/mongoid/association/referenced/belongs_to_spec.rb +4 -20
  255. data/spec/mongoid/association/referenced/has_and_belongs_to_many/proxy_spec.rb +186 -229
  256. data/spec/mongoid/association/referenced/has_and_belongs_to_many_models.rb +25 -0
  257. data/spec/mongoid/association/referenced/has_and_belongs_to_many_spec.rb +35 -2
  258. data/spec/mongoid/association/referenced/has_many/buildable_spec.rb +109 -0
  259. data/spec/mongoid/association/referenced/has_many/enumerable_spec.rb +2 -56
  260. data/spec/mongoid/association/referenced/has_many/proxy_spec.rb +173 -177
  261. data/spec/mongoid/association/referenced/has_many_models.rb +3 -1
  262. data/spec/mongoid/association/referenced/has_many_spec.rb +25 -0
  263. data/spec/mongoid/association/referenced/has_one/buildable_spec.rb +2 -2
  264. data/spec/mongoid/association/referenced/has_one/proxy_spec.rb +107 -1
  265. data/spec/mongoid/association/referenced/has_one_models.rb +16 -0
  266. data/spec/mongoid/association/syncable_spec.rb +15 -1
  267. data/spec/mongoid/atomic/paths_spec.rb +0 -14
  268. data/spec/mongoid/attributes/nested_spec.rb +80 -11
  269. data/spec/mongoid/attributes/nested_spec_models.rb +48 -0
  270. data/spec/mongoid/attributes/projector_spec.rb +1 -5
  271. data/spec/mongoid/attributes_spec.rb +510 -33
  272. data/spec/mongoid/changeable_spec.rb +429 -37
  273. data/spec/mongoid/clients/factory_spec.rb +23 -30
  274. data/spec/mongoid/clients/sessions_spec.rb +0 -38
  275. data/spec/mongoid/clients_spec.rb +149 -15
  276. data/spec/mongoid/collection_configurable_spec.rb +158 -0
  277. data/spec/mongoid/config/defaults_spec.rb +160 -0
  278. data/spec/mongoid/config_spec.rb +214 -31
  279. data/spec/mongoid/contextual/aggregable/memory_spec.rb +396 -158
  280. data/spec/mongoid/contextual/aggregable/memory_table.yml +88 -0
  281. data/spec/mongoid/contextual/aggregable/memory_table_spec.rb +62 -0
  282. data/spec/mongoid/contextual/map_reduce_spec.rb +2 -16
  283. data/spec/mongoid/contextual/memory_spec.rb +850 -88
  284. data/spec/mongoid/contextual/mongo/documents_loader_spec.rb +187 -0
  285. data/spec/mongoid/contextual/mongo_spec.rb +1572 -435
  286. data/spec/mongoid/contextual/none_spec.rb +60 -21
  287. data/spec/mongoid/copyable_spec.rb +453 -11
  288. data/spec/mongoid/criteria/findable_spec.rb +86 -210
  289. data/spec/mongoid/criteria/includable_spec.rb +1492 -0
  290. data/spec/mongoid/criteria/includable_spec_models.rb +54 -0
  291. data/spec/mongoid/criteria/marshalable_spec.rb +18 -1
  292. data/spec/mongoid/criteria/queryable/extensions/array_spec.rb +7 -19
  293. data/spec/mongoid/criteria/queryable/extensions/big_decimal_spec.rb +134 -26
  294. data/spec/mongoid/criteria/queryable/extensions/date_spec.rb +11 -0
  295. data/spec/mongoid/criteria/queryable/extensions/date_time_spec.rb +11 -0
  296. data/spec/mongoid/criteria/queryable/extensions/hash_spec.rb +0 -15
  297. data/spec/mongoid/criteria/queryable/extensions/numeric_spec.rb +73 -7
  298. data/spec/mongoid/criteria/queryable/extensions/string_spec.rb +4 -69
  299. data/spec/mongoid/criteria/queryable/extensions/symbol_spec.rb +0 -59
  300. data/spec/mongoid/criteria/queryable/extensions/time_spec.rb +11 -0
  301. data/spec/mongoid/criteria/queryable/extensions/time_with_zone_spec.rb +11 -0
  302. data/spec/mongoid/criteria/queryable/optional_spec.rb +15 -484
  303. data/spec/mongoid/criteria/queryable/options_spec.rb +1 -1
  304. data/spec/mongoid/criteria/queryable/selectable_logical_spec.rb +469 -0
  305. data/spec/mongoid/criteria/queryable/selectable_spec.rb +78 -86
  306. data/spec/mongoid/criteria/queryable/selector_spec.rb +15 -3
  307. data/spec/mongoid/criteria/translator_spec.rb +132 -0
  308. data/spec/mongoid/criteria_projection_spec.rb +1 -5
  309. data/spec/mongoid/criteria_spec.rb +469 -1205
  310. data/spec/mongoid/document_fields_spec.rb +173 -24
  311. data/spec/mongoid/document_spec.rb +32 -41
  312. data/spec/mongoid/errors/document_not_found_spec.rb +29 -2
  313. data/spec/mongoid/errors/invalid_field_spec.rb +1 -1
  314. data/spec/mongoid/errors/invalid_field_type_spec.rb +55 -0
  315. data/spec/mongoid/errors/mongoid_error_spec.rb +3 -1
  316. data/spec/mongoid/errors/no_environment_spec.rb +3 -3
  317. data/spec/mongoid/errors/readonly_document_spec.rb +2 -2
  318. data/spec/mongoid/errors/too_many_nested_attribute_records_spec.rb +1 -1
  319. data/spec/mongoid/extensions/array_spec.rb +16 -2
  320. data/spec/mongoid/extensions/big_decimal_spec.rb +712 -212
  321. data/spec/mongoid/extensions/binary_spec.rb +44 -9
  322. data/spec/mongoid/extensions/boolean_spec.rb +68 -82
  323. data/spec/mongoid/extensions/date_class_mongoize_spec.rb +7 -3
  324. data/spec/mongoid/extensions/date_spec.rb +71 -1
  325. data/spec/mongoid/extensions/date_time_spec.rb +15 -9
  326. data/spec/mongoid/extensions/float_spec.rb +53 -74
  327. data/spec/mongoid/extensions/hash_spec.rb +33 -3
  328. data/spec/mongoid/extensions/integer_spec.rb +50 -64
  329. data/spec/mongoid/extensions/range_spec.rb +255 -54
  330. data/spec/mongoid/extensions/regexp_spec.rb +58 -33
  331. data/spec/mongoid/extensions/set_spec.rb +106 -0
  332. data/spec/mongoid/extensions/string_spec.rb +53 -25
  333. data/spec/mongoid/extensions/symbol_spec.rb +18 -25
  334. data/spec/mongoid/extensions/time_spec.rb +639 -106
  335. data/spec/mongoid/extensions/time_with_zone_spec.rb +24 -83
  336. data/spec/mongoid/factory_spec.rb +61 -1
  337. data/spec/mongoid/fields/localized_spec.rb +80 -37
  338. data/spec/mongoid/fields_spec.rb +500 -84
  339. data/spec/mongoid/findable_spec.rb +450 -58
  340. data/spec/mongoid/indexable/specification_spec.rb +2 -2
  341. data/spec/mongoid/indexable_spec.rb +55 -30
  342. data/spec/mongoid/interceptable_spec.rb +599 -8
  343. data/spec/mongoid/interceptable_spec_models.rb +235 -4
  344. data/spec/mongoid/matcher/extract_attribute_spec.rb +1 -5
  345. data/spec/mongoid/mongoizable_spec.rb +285 -0
  346. data/spec/mongoid/persistable/creatable_spec.rb +2 -2
  347. data/spec/mongoid/persistable/deletable_spec.rb +28 -8
  348. data/spec/mongoid/persistable/destroyable_spec.rb +28 -8
  349. data/spec/mongoid/persistable/incrementable_spec.rb +37 -0
  350. data/spec/mongoid/persistable/logical_spec.rb +37 -0
  351. data/spec/mongoid/persistable/poppable_spec.rb +36 -0
  352. data/spec/mongoid/persistable/pullable_spec.rb +72 -0
  353. data/spec/mongoid/persistable/pushable_spec.rb +72 -0
  354. data/spec/mongoid/persistable/renamable_spec.rb +36 -0
  355. data/spec/mongoid/persistable/savable_spec.rb +96 -0
  356. data/spec/mongoid/persistable/settable_spec.rb +37 -0
  357. data/spec/mongoid/persistable/unsettable_spec.rb +36 -0
  358. data/spec/mongoid/persistable/updatable_spec.rb +20 -28
  359. data/spec/mongoid/persistable/upsertable_spec.rb +89 -1
  360. data/spec/mongoid/persistence_context_spec.rb +31 -57
  361. data/spec/mongoid/query_cache_middleware_spec.rb +0 -18
  362. data/spec/mongoid/query_cache_spec.rb +56 -215
  363. data/spec/mongoid/reloadable_spec.rb +83 -6
  364. data/spec/mongoid/scopable_spec.rb +91 -1
  365. data/spec/mongoid/serializable_spec.rb +9 -30
  366. data/spec/mongoid/shardable_spec.rb +4 -4
  367. data/spec/mongoid/stateful_spec.rb +150 -8
  368. data/spec/mongoid/tasks/database_rake_spec.rb +74 -0
  369. data/spec/mongoid/tasks/database_spec.rb +127 -0
  370. data/spec/mongoid/timestamps_spec.rb +392 -4
  371. data/spec/mongoid/timestamps_spec_models.rb +67 -0
  372. data/spec/mongoid/touchable_spec.rb +390 -2
  373. data/spec/mongoid/touchable_spec_models.rb +14 -8
  374. data/spec/mongoid/traversable_spec.rb +13 -35
  375. data/spec/mongoid/validatable/presence_spec.rb +1 -1
  376. data/spec/mongoid/validatable/uniqueness_spec.rb +58 -31
  377. data/spec/mongoid/warnings_spec.rb +35 -0
  378. data/spec/mongoid_spec.rb +34 -16
  379. data/spec/rails/controller_extension/controller_runtime_spec.rb +2 -2
  380. data/spec/rails/mongoid_spec.rb +4 -16
  381. data/spec/spec_helper.rb +5 -0
  382. data/spec/support/constraints.rb +24 -0
  383. data/spec/support/immutable_ids.rb +118 -0
  384. data/spec/support/macros.rb +78 -0
  385. data/spec/support/models/artist.rb +0 -1
  386. data/spec/support/models/augmentation.rb +12 -0
  387. data/spec/support/models/band.rb +4 -0
  388. data/spec/support/models/book.rb +1 -0
  389. data/spec/support/models/building.rb +2 -0
  390. data/spec/support/models/catalog.rb +24 -0
  391. data/spec/support/models/circus.rb +3 -0
  392. data/spec/support/models/cover.rb +10 -0
  393. data/spec/support/models/fanatic.rb +8 -0
  394. data/spec/support/models/implant.rb +9 -0
  395. data/spec/support/models/label.rb +2 -0
  396. data/spec/support/models/passport.rb +9 -0
  397. data/spec/support/models/person.rb +2 -0
  398. data/spec/support/models/player.rb +2 -0
  399. data/spec/support/models/powerup.rb +12 -0
  400. data/spec/support/models/product.rb +1 -0
  401. data/spec/support/models/purse.rb +9 -0
  402. data/spec/support/models/registry.rb +1 -0
  403. data/spec/support/models/school.rb +14 -0
  404. data/spec/support/models/shield.rb +18 -0
  405. data/spec/support/models/student.rb +14 -0
  406. data/spec/support/models/weapon.rb +12 -0
  407. data.tar.gz.sig +0 -0
  408. metadata +93 -15
  409. metadata.gz.sig +0 -0
  410. data/lib/mongoid/errors/eager_load.rb +0 -23
  411. data/lib/mongoid/errors/invalid_value.rb +0 -17
  412. data/spec/mongoid/criteria/queryable/extensions/bignum_spec.rb +0 -60
  413. data/spec/mongoid/criteria/queryable/extensions/fixnum_spec.rb +0 -60
  414. data/spec/mongoid/errors/eager_load_spec.rb +0 -31
@@ -2,17 +2,17 @@
2
2
 
3
3
  require 'spec_helper'
4
4
 
5
- describe "#discriminator_key" do
5
+ describe "#discriminator_key" do
6
6
 
7
7
  context "when the discriminator key is not set on a class" do
8
- let(:piano) do
8
+ let(:piano) do
9
9
  Piano.new
10
10
  end
11
11
 
12
- let(:guitar) do
12
+ let(:guitar) do
13
13
  Guitar.new
14
- end
15
-
14
+ end
15
+
16
16
  it "sets the child discriminator key to _type: Piano" do
17
17
  expect(piano._type).to eq("Piano")
18
18
  end
@@ -21,7 +21,7 @@ describe "#discriminator_key" do
21
21
  expect(guitar._type).to eq("Guitar")
22
22
  end
23
23
  end
24
-
24
+
25
25
  context "when the discriminator key is changed in the parent" do
26
26
  before do
27
27
  Instrument.discriminator_key = "hello2"
@@ -31,11 +31,11 @@ describe "#discriminator_key" do
31
31
  Instrument.discriminator_key = nil
32
32
  end
33
33
 
34
- let(:piano) do
34
+ let(:piano) do
35
35
  Piano.new
36
36
  end
37
37
 
38
- let(:guitar) do
38
+ let(:guitar) do
39
39
  Guitar.new
40
40
  end
41
41
 
@@ -54,22 +54,24 @@ describe "#discriminator_key" do
54
54
  class GlobalIntDiscriminatorParent
55
55
  include Mongoid::Document
56
56
  end
57
-
57
+
58
58
  class GlobalIntDiscriminatorChild < GlobalIntDiscriminatorParent
59
59
  end
60
-
60
+
61
61
  Mongoid.discriminator_key = "test"
62
62
  end
63
63
 
64
64
  after do
65
65
  Mongoid.discriminator_key = "_type"
66
+ Object.send(:remove_const, :GlobalIntDiscriminatorParent)
67
+ Object.send(:remove_const, :GlobalIntDiscriminatorChild)
66
68
  end
67
69
 
68
- let(:child) do
70
+ let(:child) do
69
71
  GlobalIntDiscriminatorChild.new
70
72
  end
71
73
 
72
- it "has a discriminator key _type" do
74
+ it "has a discriminator key _type" do
73
75
  expect(child._type).to eq("GlobalIntDiscriminatorChild")
74
76
  end
75
77
 
@@ -79,36 +81,38 @@ describe "#discriminator_key" do
79
81
  end
80
82
 
81
83
  context "before class creation" do
84
+ config_override :discriminator_key, "test"
85
+
82
86
  before do
83
- Mongoid.discriminator_key = "test"
84
87
 
85
88
  class PreGlobalIntDiscriminatorParent
86
89
  include Mongoid::Document
87
90
  end
88
-
91
+
89
92
  class PreGlobalIntDiscriminatorChild < PreGlobalIntDiscriminatorParent
90
93
  end
91
94
  end
92
95
 
93
96
  after do
94
- Mongoid.discriminator_key = "_type"
97
+ Object.send(:remove_const, :PreGlobalIntDiscriminatorParent)
98
+ Object.send(:remove_const, :PreGlobalIntDiscriminatorChild)
95
99
  end
96
100
 
97
- let(:child) do
101
+ let(:child) do
98
102
  PreGlobalIntDiscriminatorChild.new
99
103
  end
100
104
 
101
- it "creates a field with new discriminator key" do
105
+ it "creates a field with new discriminator key" do
102
106
  expect(child.test).to eq("PreGlobalIntDiscriminatorChild")
103
107
  end
104
-
108
+
105
109
  it "does not have the default value as a field" do
106
110
  expect(defined?(child._type)).to be nil
107
111
  end
108
112
  end
109
113
  end
110
114
 
111
- context "when the discriminator key is changed in the parent" do
115
+ context "when the discriminator key is changed in the parent" do
112
116
  context "after child class creation" do
113
117
  before do
114
118
  class LocalIntDiscriminatorParent
@@ -121,15 +125,20 @@ describe "#discriminator_key" do
121
125
  LocalIntDiscriminatorParent.discriminator_key = "test2"
122
126
  end
123
127
 
124
- let(:child) do
128
+ after do
129
+ Object.send(:remove_const, :LocalIntDiscriminatorParent)
130
+ Object.send(:remove_const, :LocalIntDiscriminatorChild)
131
+ end
132
+
133
+ let(:child) do
125
134
  LocalIntDiscriminatorChild.new
126
135
  end
127
136
 
128
- it "still has _type field in the child" do
137
+ it "still has _type field in the child" do
129
138
  expect(child._type).to include("LocalIntDiscriminatorChild")
130
139
  end
131
140
 
132
- it "has the new field in the child" do
141
+ it "has the new field in the child" do
133
142
  expect(child.test2).to include("LocalIntDiscriminatorChild")
134
143
  end
135
144
  end
@@ -145,11 +154,16 @@ describe "#discriminator_key" do
145
154
  end
146
155
  end
147
156
 
148
- let(:child) do
157
+ after do
158
+ Object.send(:remove_const, :PreLocalIntDiscriminatorParent)
159
+ Object.send(:remove_const, :PreLocalIntDiscriminatorChild)
160
+ end
161
+
162
+ let(:child) do
149
163
  PreLocalIntDiscriminatorChild.new
150
164
  end
151
165
 
152
- it "creates a new field in the child" do
166
+ it "creates a new field in the child" do
153
167
  expect(child.test2).to include("PreLocalIntDiscriminatorChild")
154
168
  end
155
169
 
@@ -159,9 +173,9 @@ describe "#discriminator_key" do
159
173
  end
160
174
  end
161
175
 
162
- context "when adding to the db" do
176
+ context "when adding to the db" do
163
177
  context "when changing the discriminator_key" do
164
- before do
178
+ before do
165
179
  class DBDiscriminatorParent
166
180
  include Mongoid::Document
167
181
  self.discriminator_key = "dkey"
@@ -171,34 +185,44 @@ describe "#discriminator_key" do
171
185
  end
172
186
  DBDiscriminatorChild.create!
173
187
  end
174
-
175
- it "has the correct count" do
188
+
189
+ after do
190
+ Object.send(:remove_const, :DBDiscriminatorParent)
191
+ Object.send(:remove_const, :DBDiscriminatorChild)
192
+ end
193
+
194
+ it "has the correct count" do
176
195
  expect(DBDiscriminatorChild.count).to eq(1)
177
196
  end
178
197
 
179
- it "has the correct count in the parent" do
198
+ it "has the correct count in the parent" do
180
199
  expect(DBDiscriminatorParent.count).to eq(1)
181
200
  end
182
201
  end
183
202
 
184
203
  context "when changing the discriminator_key after saving to the db" do
185
- before do
204
+ before do
186
205
  class DBDiscriminatorParent
187
206
  include Mongoid::Document
188
207
  end
189
-
208
+
190
209
  class DBDiscriminatorChild < DBDiscriminatorParent
191
210
  end
192
211
  DBDiscriminatorChild.create!
193
212
  DBDiscriminatorParent.discriminator_key = "dkey2"
194
213
  DBDiscriminatorChild.create!
195
214
  end
196
-
197
- it "only finds the documents with the new discriminator key" do
215
+
216
+ after do
217
+ Object.send(:remove_const, :DBDiscriminatorParent)
218
+ Object.send(:remove_const, :DBDiscriminatorChild)
219
+ end
220
+
221
+ it "only finds the documents with the new discriminator key" do
198
222
  expect(DBDiscriminatorChild.count).to eq(1)
199
223
  end
200
224
 
201
- it "has the correct count in the parent" do
225
+ it "has the correct count in the parent" do
202
226
  expect(DBDiscriminatorParent.count).to eq(2)
203
227
  end
204
228
  end
@@ -213,45 +237,51 @@ describe "#discriminator_key" do
213
237
  field :x, type: Integer
214
238
  field :y, type: Integer
215
239
  embedded_in :canvas
216
-
240
+
217
241
  self.discriminator_key = "shape_type"
218
242
  end
219
-
243
+
220
244
  class Example1Circle < Example1Shape
221
245
  field :radius, type: Float
222
246
  end
223
-
247
+
224
248
  class Example1Rectangle < Example1Shape
225
249
  field :width, type: Float
226
250
  field :height, type: Float
227
251
  end
228
252
  end
229
-
230
- let(:rectangle) do
253
+
254
+ after do
255
+ Object.send(:remove_const, :Example1Shape)
256
+ Object.send(:remove_const, :Example1Circle)
257
+ Object.send(:remove_const, :Example1Rectangle)
258
+ end
259
+
260
+ let(:rectangle) do
231
261
  Example1Rectangle.new
232
262
  end
233
-
234
- let(:circle) do
263
+
264
+ let(:circle) do
235
265
  Example1Circle.new
236
266
  end
237
-
238
- it "has the new discriminator key: Rectangle" do
267
+
268
+ it "has the new discriminator key: Rectangle" do
239
269
  expect(rectangle.shape_type).to eq("Example1Rectangle")
240
270
  end
241
-
271
+
242
272
  it "does not have the default discriminator key: Rectangle" do
243
273
  expect(defined?(rectangle._type)).to be nil
244
274
  end
245
-
246
- it "has the new discriminator key: Circle" do
275
+
276
+ it "has the new discriminator key: Circle" do
247
277
  expect(circle.shape_type).to eq("Example1Circle")
248
278
  end
249
-
279
+
250
280
  it "does not have the default discriminator key: Circle" do
251
281
  expect(defined?(circle._type)).to be nil
252
282
  end
253
283
  end
254
-
284
+
255
285
  context "Example 2" do
256
286
  before do
257
287
  class Example2Shape
@@ -260,91 +290,99 @@ describe "#discriminator_key" do
260
290
  field :y, type: Integer
261
291
  embedded_in :canvas
262
292
  end
263
-
293
+
264
294
  class Example2Circle < Example2Shape
265
295
  field :radius, type: Float
266
296
  end
267
-
297
+
268
298
  class Example2Rectangle < Example2Shape
269
299
  field :width, type: Float
270
300
  field :height, type: Float
271
301
  end
272
-
302
+
273
303
  Example2Shape.discriminator_key = "shape_type"
274
304
  end
275
-
276
- let(:rectangle) do
305
+
306
+ after do
307
+ Example2Shape.discriminator_key = "_type"
308
+ Object.send(:remove_const, :Example2Shape)
309
+ Object.send(:remove_const, :Example2Circle)
310
+ Object.send(:remove_const, :Example2Rectangle)
311
+ end
312
+
313
+ let(:rectangle) do
277
314
  Example2Rectangle.new
278
315
  end
279
-
280
- let(:circle) do
316
+
317
+ let(:circle) do
281
318
  Example2Circle.new
282
319
  end
283
-
284
- it "has the new discriminator key: Rectangle" do
320
+
321
+ it "has the new discriminator key: Rectangle" do
285
322
  expect(rectangle.shape_type).to eq("Example2Rectangle")
286
323
  end
287
-
324
+
288
325
  it "has default discriminator key: Rectangle" do
289
326
  expect(rectangle._type).to eq("Example2Rectangle")
290
327
  end
291
-
292
- it "has the new discriminator key: Circle" do
328
+
329
+ it "has the new discriminator key: Circle" do
293
330
  expect(circle.shape_type).to eq("Example2Circle")
294
331
  end
295
-
332
+
296
333
  it "has default discriminator key: Circle" do
297
334
  expect(circle._type).to eq("Example2Circle")
298
335
  end
299
336
  end
300
-
337
+
301
338
  context "Example 3" do
339
+ config_override :discriminator_key, "shape_type"
340
+
302
341
  before do
303
-
304
- Mongoid.discriminator_key = "shape_type"
305
-
306
342
  class Example3Shape
307
343
  include Mongoid::Document
308
344
  field :x, type: Integer
309
345
  field :y, type: Integer
310
346
  embedded_in :canvas
311
347
  end
312
-
348
+
313
349
  class Example3Circle < Example3Shape
314
350
  field :radius, type: Float
315
351
  end
316
-
352
+
317
353
  class Example3Rectangle < Example3Shape
318
354
  field :width, type: Float
319
355
  field :height, type: Float
320
356
  end
321
-
357
+
322
358
  end
323
359
 
324
- after do
325
- Mongoid.discriminator_key = "_type"
360
+ after do
361
+ Object.send(:remove_const, :Example3Shape)
362
+ Object.send(:remove_const, :Example3Circle)
363
+ Object.send(:remove_const, :Example3Rectangle)
326
364
  end
327
-
328
- let(:rectangle) do
365
+
366
+ let(:rectangle) do
329
367
  Example3Rectangle.new
330
368
  end
331
-
332
- let(:circle) do
369
+
370
+ let(:circle) do
333
371
  Example3Circle.new
334
372
  end
335
-
336
- it "has the new discriminator key: Rectangle" do
373
+
374
+ it "has the new discriminator key: Rectangle" do
337
375
  expect(rectangle.shape_type).to eq("Example3Rectangle")
338
376
  end
339
-
377
+
340
378
  it "does not have the default discriminator key: Rectangle" do
341
379
  expect(defined?(rectangle._type)).to be nil
342
380
  end
343
-
344
- it "has the new discriminator key: Circle" do
381
+
382
+ it "has the new discriminator key: Circle" do
345
383
  expect(circle.shape_type).to eq("Example3Circle")
346
384
  end
347
-
385
+
348
386
  it "does not have the default discriminator key: Circle" do
349
387
  expect(defined?(circle._type)).to be nil
350
388
  end
@@ -0,0 +1,277 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "spec_helper"
4
+
5
+ describe "Dots and Dollars" do
6
+ min_server_version '5.0'
7
+
8
+ before(:all) do
9
+ class DADMUser
10
+ include Mongoid::Document
11
+ field :"first.last", type: String, default: "Neil.Shweky"
12
+ field :"$_amount", type: Integer, default: 0
13
+ field :"$a.b", type: Boolean, default: true
14
+ end
15
+ end
16
+
17
+ let!(:user) { DADMUser.create! }
18
+
19
+ describe "accessing the fields" do
20
+
21
+ context "when using the field getters" do
22
+
23
+ context "on dotted fields" do
24
+ it "gets the right value" do
25
+ expect(user.send(:"first.last")).to eq("Neil.Shweky")
26
+ end
27
+ end
28
+
29
+ context "on dollared fields" do
30
+ it "gets the right value" do
31
+ expect(user.send(:"$_amount")).to eq(0)
32
+ end
33
+ end
34
+
35
+ context "on dotted and dollared fields" do
36
+ it "gets the right value" do
37
+ expect(user.send(:"$a.b")).to be true
38
+ end
39
+ end
40
+ end
41
+
42
+ context "when using the read_attribute" do
43
+
44
+ context "on dotted fields" do
45
+ it "gets the right value" do
46
+ expect(user.read_attribute("first.last")).to eq("Neil.Shweky")
47
+ end
48
+ end
49
+
50
+ context "on dollared fields" do
51
+ it "gets the right value" do
52
+ expect(user.read_attribute("$_amount")).to eq(0)
53
+ end
54
+ end
55
+
56
+ context "on dotted and dollared fields" do
57
+ it "gets the right value" do
58
+ expect(user.read_attribute("$a.b")).to be true
59
+ end
60
+ end
61
+ end
62
+
63
+ context "when using the field setters" do
64
+
65
+ context "on dotted fields" do
66
+ it "raises an error" do
67
+ expect do
68
+ user.send(:"first.last=", "Nissim.Shweky")
69
+ end.to raise_error(Mongoid::Errors::InvalidDotDollarAssignment)
70
+ end
71
+ end
72
+
73
+ context "on dollared fields" do
74
+ it "raises an error" do
75
+ expect do
76
+ user.send(:"$_amount=", 1)
77
+ end.to raise_error(Mongoid::Errors::InvalidDotDollarAssignment)
78
+ end
79
+ end
80
+
81
+ context "on dotted and dollared fields" do
82
+ it "raises an error" do
83
+ expect do
84
+ user.send(:"$a.b=", false)
85
+ end.to raise_error(Mongoid::Errors::InvalidDotDollarAssignment)
86
+ end
87
+ end
88
+ end
89
+
90
+ context "when updating via write_attribute" do
91
+
92
+ context "on dotted fields" do
93
+ it "raises an error" do
94
+ expect do
95
+ user.write_attribute("first.last", "Nissim.Shweky")
96
+ end.to raise_error(Mongoid::Errors::InvalidDotDollarAssignment)
97
+ end
98
+ end
99
+
100
+ context "on dollared fields" do
101
+ it "raises an error" do
102
+ expect do
103
+ user.write_attribute("$_amount", 1)
104
+ end.to raise_error(Mongoid::Errors::InvalidDotDollarAssignment)
105
+ end
106
+ end
107
+
108
+ context "on dotted and dollared fields" do
109
+ it "raises an error" do
110
+ expect do
111
+ user.write_attribute("$a.b", false)
112
+ end.to raise_error(Mongoid::Errors::InvalidDotDollarAssignment)
113
+ end
114
+ end
115
+ end
116
+
117
+ context "when updating via update_attribute" do
118
+
119
+ context "on dotted fields" do
120
+ it "raises an error" do
121
+ expect do
122
+ user.update_attribute("first.last", "Nissim.Shweky")
123
+ end.to raise_error(Mongoid::Errors::InvalidDotDollarAssignment)
124
+ end
125
+ end
126
+
127
+ context "on dollared fields" do
128
+ it "raises an error" do
129
+ expect do
130
+ user.update_attribute("$_amount", 1)
131
+ end.to raise_error(Mongoid::Errors::InvalidDotDollarAssignment)
132
+ end
133
+ end
134
+
135
+ context "on dotted and dollared fields" do
136
+ it "raises an error" do
137
+ expect do
138
+ user.update_attribute("$a.b", false)
139
+ end.to raise_error(Mongoid::Errors::InvalidDotDollarAssignment)
140
+ end
141
+ end
142
+ end
143
+
144
+ context "when updating via update_attributes!" do
145
+
146
+ context "on dotted fields" do
147
+ it "raises an error" do
148
+ expect do
149
+ user.update_attributes!("first.last": "Nissim.Shweky")
150
+ end.to raise_error(Mongoid::Errors::InvalidDotDollarAssignment)
151
+ end
152
+ end
153
+
154
+ context "on dollared fields" do
155
+ it "raises an error" do
156
+ expect do
157
+ user.update_attributes!("$_amount": 1)
158
+ end.to raise_error(Mongoid::Errors::InvalidDotDollarAssignment)
159
+ end
160
+ end
161
+
162
+ context "on dotted and dollared fields" do
163
+ it "raises an error" do
164
+ expect do
165
+ user.update_attributes!("$a.b": false)
166
+ end.to raise_error(Mongoid::Errors::InvalidDotDollarAssignment)
167
+ end
168
+ end
169
+ end
170
+
171
+ context "when updating via []=" do
172
+
173
+ context "on dotted fields" do
174
+ it "raises an error" do
175
+ expect do
176
+ user[:"first.last"] = "Nissim.Shweky"
177
+ end.to raise_error(Mongoid::Errors::InvalidDotDollarAssignment)
178
+ end
179
+ end
180
+
181
+ context "on dollared fields" do
182
+ it "raises an error" do
183
+ expect do
184
+ user[:"$_amount"] = 1
185
+ end.to raise_error(Mongoid::Errors::InvalidDotDollarAssignment)
186
+ end
187
+ end
188
+
189
+ context "on dotted and dollared fields" do
190
+ it "raises an error" do
191
+ expect do
192
+ user[:"$a.b"] = false
193
+ end.to raise_error(Mongoid::Errors::InvalidDotDollarAssignment)
194
+ end
195
+ end
196
+ end
197
+
198
+ context "when updating via remove_attribute" do
199
+
200
+ context "on dotted fields" do
201
+ it "raises an error" do
202
+ expect do
203
+ user.remove_attribute("first.last")
204
+ end.to raise_error(Mongoid::Errors::InvalidDotDollarAssignment)
205
+ end
206
+ end
207
+
208
+ context "on dollared fields" do
209
+ it "raises an error" do
210
+ expect do
211
+ user.remove_attribute("$_amount")
212
+ end.to raise_error(Mongoid::Errors::InvalidDotDollarAssignment)
213
+ end
214
+ end
215
+
216
+ context "on dotted and dollared fields" do
217
+ it "raises an error" do
218
+ expect do
219
+ user.remove_attribute("$a.b")
220
+ end.to raise_error(Mongoid::Errors::InvalidDotDollarAssignment)
221
+ end
222
+ end
223
+ end
224
+ end
225
+
226
+ describe "persisting to the db" do
227
+
228
+ context "when saving to the db" do
229
+
230
+ let(:user) { DADMUser.new }
231
+
232
+ it "the save succeeds" do
233
+ expect do
234
+ user.save!
235
+ end.to_not raise_error
236
+ end
237
+ end
238
+
239
+ context "when retrieving it from the db" do
240
+
241
+ let(:from_db) { DADMUser.first }
242
+
243
+ it "has the fields populated correctly" do
244
+ expect(from_db.attributes["first.last"]).to eq("Neil.Shweky")
245
+ expect(from_db.attributes["$_amount"]).to eq(0)
246
+ expect(from_db.attributes["$a.b"]).to eq(true)
247
+ end
248
+ end
249
+ end
250
+
251
+ describe "querying that field" do
252
+
253
+ context "when attempting to query a dotted field" do
254
+
255
+ let(:queried) do
256
+ DADMUser.where("first.last": "Neil.Shweky").first
257
+ end
258
+
259
+ it "does not work" do
260
+ expect(queried).to be nil
261
+ end
262
+ end
263
+
264
+ context "when attempting to query a dollared field" do
265
+
266
+ let(:queried) do
267
+ DADMUser.where("$_amount": 0).first
268
+ end
269
+
270
+ it "raise an error" do
271
+ expect do
272
+ queried
273
+ end.to raise_error(Mongo::Error::OperationFailure)
274
+ end
275
+ end
276
+ end
277
+ end