mongoid 7.5.3 → 8.1.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (417) 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/Rakefile +25 -0
  6. data/lib/config/locales/en.yml +92 -43
  7. data/lib/mongoid/association/accessors.rb +40 -11
  8. data/lib/mongoid/association/bindable.rb +50 -2
  9. data/lib/mongoid/association/builders.rb +5 -3
  10. data/lib/mongoid/association/constrainable.rb +0 -1
  11. data/lib/mongoid/association/eager_loadable.rb +29 -7
  12. data/lib/mongoid/association/embedded/batchable.rb +34 -11
  13. data/lib/mongoid/association/embedded/cyclic.rb +1 -1
  14. data/lib/mongoid/association/embedded/embedded_in/binding.rb +24 -2
  15. data/lib/mongoid/association/embedded/embedded_in/buildable.rb +2 -2
  16. data/lib/mongoid/association/embedded/embedded_in/proxy.rb +4 -3
  17. data/lib/mongoid/association/embedded/embedded_in.rb +3 -2
  18. data/lib/mongoid/association/embedded/embeds_many/binding.rb +1 -0
  19. data/lib/mongoid/association/embedded/embeds_many/buildable.rb +4 -3
  20. data/lib/mongoid/association/embedded/embeds_many/proxy.rb +69 -45
  21. data/lib/mongoid/association/embedded/embeds_many.rb +2 -2
  22. data/lib/mongoid/association/embedded/embeds_one/buildable.rb +19 -5
  23. data/lib/mongoid/association/embedded/embeds_one/proxy.rb +24 -5
  24. data/lib/mongoid/association/embedded/embeds_one.rb +3 -3
  25. data/lib/mongoid/association/macros.rb +8 -1
  26. data/lib/mongoid/association/many.rb +11 -7
  27. data/lib/mongoid/association/nested/many.rb +5 -4
  28. data/lib/mongoid/association/nested/nested_buildable.rb +4 -4
  29. data/lib/mongoid/association/nested/one.rb +45 -7
  30. data/lib/mongoid/association/one.rb +2 -2
  31. data/lib/mongoid/association/options.rb +9 -9
  32. data/lib/mongoid/association/proxy.rb +15 -4
  33. data/lib/mongoid/association/referenced/auto_save.rb +4 -3
  34. data/lib/mongoid/association/referenced/belongs_to/binding.rb +1 -0
  35. data/lib/mongoid/association/referenced/belongs_to/buildable.rb +1 -1
  36. data/lib/mongoid/association/referenced/belongs_to/proxy.rb +5 -6
  37. data/lib/mongoid/association/referenced/belongs_to.rb +2 -2
  38. data/lib/mongoid/association/referenced/counter_cache.rb +10 -10
  39. data/lib/mongoid/association/referenced/eager.rb +2 -2
  40. data/lib/mongoid/association/referenced/has_and_belongs_to_many/proxy.rb +70 -13
  41. data/lib/mongoid/association/referenced/has_and_belongs_to_many.rb +6 -3
  42. data/lib/mongoid/association/referenced/has_many/enumerable.rb +22 -30
  43. data/lib/mongoid/association/referenced/has_many/proxy.rb +29 -19
  44. data/lib/mongoid/association/referenced/has_many.rb +3 -3
  45. data/lib/mongoid/association/referenced/has_one/buildable.rb +1 -1
  46. data/lib/mongoid/association/referenced/has_one/nested_builder.rb +5 -5
  47. data/lib/mongoid/association/referenced/has_one/proxy.rb +9 -12
  48. data/lib/mongoid/association/referenced/has_one.rb +3 -3
  49. data/lib/mongoid/association/referenced/syncable.rb +4 -4
  50. data/lib/mongoid/association/reflections.rb +4 -4
  51. data/lib/mongoid/association/relatable.rb +44 -10
  52. data/lib/mongoid/association.rb +5 -5
  53. data/lib/mongoid/atomic/modifiers.rb +2 -2
  54. data/lib/mongoid/atomic.rb +7 -0
  55. data/lib/mongoid/attributes/dynamic.rb +4 -4
  56. data/lib/mongoid/attributes/nested.rb +6 -6
  57. data/lib/mongoid/attributes/processing.rb +37 -6
  58. data/lib/mongoid/attributes/projector.rb +2 -2
  59. data/lib/mongoid/attributes/readonly.rb +3 -3
  60. data/lib/mongoid/attributes.rb +51 -42
  61. data/lib/mongoid/changeable.rb +147 -14
  62. data/lib/mongoid/clients/options.rb +5 -1
  63. data/lib/mongoid/clients/sessions.rb +2 -14
  64. data/lib/mongoid/clients/storage_options.rb +2 -5
  65. data/lib/mongoid/clients/validators/storage.rb +3 -15
  66. data/lib/mongoid/collection_configurable.rb +58 -0
  67. data/lib/mongoid/composable.rb +2 -0
  68. data/lib/mongoid/config/defaults.rb +60 -0
  69. data/lib/mongoid/config/options.rb +3 -0
  70. data/lib/mongoid/config/validators/async_query_executor.rb +24 -0
  71. data/lib/mongoid/config/validators/client.rb +6 -6
  72. data/lib/mongoid/config/validators.rb +1 -0
  73. data/lib/mongoid/config.rb +140 -18
  74. data/lib/mongoid/contextual/aggregable/memory.rb +24 -16
  75. data/lib/mongoid/contextual/aggregable/mongo.rb +5 -5
  76. data/lib/mongoid/contextual/aggregable/none.rb +1 -1
  77. data/lib/mongoid/contextual/atomic.rb +1 -1
  78. data/lib/mongoid/contextual/geo_near.rb +7 -7
  79. data/lib/mongoid/contextual/map_reduce.rb +2 -2
  80. data/lib/mongoid/contextual/memory.rb +285 -58
  81. data/lib/mongoid/contextual/mongo/documents_loader.rb +177 -0
  82. data/lib/mongoid/contextual/mongo.rb +517 -346
  83. data/lib/mongoid/contextual/none.rb +193 -20
  84. data/lib/mongoid/contextual/queryable.rb +1 -1
  85. data/lib/mongoid/contextual.rb +14 -2
  86. data/lib/mongoid/copyable.rb +32 -8
  87. data/lib/mongoid/criteria/findable.rb +8 -5
  88. data/lib/mongoid/criteria/includable.rb +27 -22
  89. data/lib/mongoid/criteria/marshalable.rb +10 -2
  90. data/lib/mongoid/criteria/permission.rb +1 -1
  91. data/lib/mongoid/criteria/queryable/aggregable.rb +2 -2
  92. data/lib/mongoid/criteria/queryable/extensions/array.rb +3 -16
  93. data/lib/mongoid/criteria/queryable/extensions/big_decimal.rb +25 -4
  94. data/lib/mongoid/criteria/queryable/extensions/boolean.rb +2 -2
  95. data/lib/mongoid/criteria/queryable/extensions/date.rb +6 -1
  96. data/lib/mongoid/criteria/queryable/extensions/date_time.rb +6 -1
  97. data/lib/mongoid/criteria/queryable/extensions/hash.rb +1 -17
  98. data/lib/mongoid/criteria/queryable/extensions/numeric.rb +1 -9
  99. data/lib/mongoid/criteria/queryable/extensions/object.rb +2 -1
  100. data/lib/mongoid/criteria/queryable/extensions/range.rb +13 -5
  101. data/lib/mongoid/criteria/queryable/extensions/regexp.rb +3 -3
  102. data/lib/mongoid/criteria/queryable/extensions/set.rb +1 -1
  103. data/lib/mongoid/criteria/queryable/extensions/string.rb +4 -14
  104. data/lib/mongoid/criteria/queryable/extensions/symbol.rb +4 -12
  105. data/lib/mongoid/criteria/queryable/extensions/time.rb +6 -1
  106. data/lib/mongoid/criteria/queryable/extensions/time_with_zone.rb +6 -1
  107. data/lib/mongoid/criteria/queryable/key.rb +4 -4
  108. data/lib/mongoid/criteria/queryable/mergeable.rb +1 -1
  109. data/lib/mongoid/criteria/queryable/optional.rb +11 -17
  110. data/lib/mongoid/criteria/queryable/options.rb +2 -2
  111. data/lib/mongoid/criteria/queryable/pipeline.rb +1 -1
  112. data/lib/mongoid/criteria/queryable/selectable.rb +47 -38
  113. data/lib/mongoid/criteria/queryable/selector.rb +93 -8
  114. data/lib/mongoid/criteria/queryable/smash.rb +40 -7
  115. data/lib/mongoid/criteria/queryable/storable.rb +1 -1
  116. data/lib/mongoid/criteria/queryable.rb +12 -7
  117. data/lib/mongoid/criteria/scopable.rb +2 -2
  118. data/lib/mongoid/criteria/translator.rb +45 -0
  119. data/lib/mongoid/criteria.rb +20 -40
  120. data/lib/mongoid/deprecable.rb +36 -0
  121. data/lib/mongoid/deprecation.rb +25 -0
  122. data/lib/mongoid/document.rb +127 -35
  123. data/lib/mongoid/equality.rb +8 -8
  124. data/lib/mongoid/errors/create_collection_failure.rb +33 -0
  125. data/lib/mongoid/errors/document_not_found.rb +10 -6
  126. data/lib/mongoid/errors/drop_collection_failure.rb +27 -0
  127. data/lib/mongoid/errors/immutable_attribute.rb +26 -0
  128. data/lib/mongoid/errors/invalid_async_query_executor.rb +25 -0
  129. data/lib/mongoid/errors/invalid_config_option.rb +1 -1
  130. data/lib/mongoid/errors/invalid_dependent_strategy.rb +1 -1
  131. data/lib/mongoid/errors/invalid_dot_dollar_assignment.rb +23 -0
  132. data/lib/mongoid/errors/invalid_field.rb +6 -2
  133. data/lib/mongoid/errors/invalid_field_type.rb +26 -0
  134. data/lib/mongoid/errors/invalid_global_executor_concurrency.rb +22 -0
  135. data/lib/mongoid/errors/invalid_relation.rb +1 -1
  136. data/lib/mongoid/errors/invalid_relation_option.rb +1 -1
  137. data/lib/mongoid/errors/invalid_session_use.rb +1 -1
  138. data/lib/mongoid/errors/invalid_storage_options.rb +1 -1
  139. data/lib/mongoid/errors/invalid_storage_parent.rb +2 -0
  140. data/lib/mongoid/errors/mongoid_error.rb +3 -3
  141. data/lib/mongoid/errors/nested_attributes_metadata_not_found.rb +1 -1
  142. data/lib/mongoid/errors/no_client_database.rb +1 -1
  143. data/lib/mongoid/errors/no_client_hosts.rb +1 -1
  144. data/lib/mongoid/errors/readonly_attribute.rb +1 -1
  145. data/lib/mongoid/errors/too_many_nested_attribute_records.rb +1 -1
  146. data/lib/mongoid/errors/unknown_attribute.rb +1 -1
  147. data/lib/mongoid/errors.rb +6 -3
  148. data/lib/mongoid/extensions/array.rb +9 -7
  149. data/lib/mongoid/extensions/big_decimal.rb +33 -10
  150. data/lib/mongoid/extensions/binary.rb +42 -0
  151. data/lib/mongoid/extensions/boolean.rb +8 -2
  152. data/lib/mongoid/extensions/date.rb +26 -20
  153. data/lib/mongoid/extensions/date_time.rb +1 -1
  154. data/lib/mongoid/extensions/false_class.rb +1 -1
  155. data/lib/mongoid/extensions/float.rb +7 -4
  156. data/lib/mongoid/extensions/hash.rb +19 -8
  157. data/lib/mongoid/extensions/integer.rb +7 -4
  158. data/lib/mongoid/extensions/module.rb +1 -1
  159. data/lib/mongoid/extensions/object.rb +10 -8
  160. data/lib/mongoid/extensions/range.rb +41 -10
  161. data/lib/mongoid/extensions/regexp.rb +11 -4
  162. data/lib/mongoid/extensions/set.rb +11 -4
  163. data/lib/mongoid/extensions/string.rb +11 -22
  164. data/lib/mongoid/extensions/symbol.rb +4 -15
  165. data/lib/mongoid/extensions/time.rb +29 -16
  166. data/lib/mongoid/extensions/time_with_zone.rb +1 -2
  167. data/lib/mongoid/extensions/true_class.rb +1 -1
  168. data/lib/mongoid/extensions.rb +1 -0
  169. data/lib/mongoid/factory.rb +55 -7
  170. data/lib/mongoid/fields/foreign_key.rb +11 -4
  171. data/lib/mongoid/fields/localized.rb +19 -4
  172. data/lib/mongoid/fields/standard.rb +17 -7
  173. data/lib/mongoid/fields/validators/macro.rb +3 -9
  174. data/lib/mongoid/fields.rb +129 -20
  175. data/lib/mongoid/findable.rb +54 -24
  176. data/lib/mongoid/indexable/specification.rb +2 -2
  177. data/lib/mongoid/indexable/validators/options.rb +6 -2
  178. data/lib/mongoid/interceptable.rb +76 -15
  179. data/lib/mongoid/matchable.rb +1 -1
  180. data/lib/mongoid/matcher/eq_impl.rb +1 -1
  181. data/lib/mongoid/matcher/type.rb +1 -1
  182. data/lib/mongoid/matcher.rb +33 -13
  183. data/lib/mongoid/persistable/creatable.rb +19 -9
  184. data/lib/mongoid/persistable/deletable.rb +2 -2
  185. data/lib/mongoid/persistable/destroyable.rb +1 -1
  186. data/lib/mongoid/persistable/savable.rb +14 -2
  187. data/lib/mongoid/persistable/unsettable.rb +2 -2
  188. data/lib/mongoid/persistable/updatable.rb +69 -12
  189. data/lib/mongoid/persistable/upsertable.rb +21 -2
  190. data/lib/mongoid/persistable.rb +6 -3
  191. data/lib/mongoid/persistence_context.rb +6 -4
  192. data/lib/mongoid/query_cache.rb +13 -261
  193. data/lib/mongoid/railties/controller_runtime.rb +1 -1
  194. data/lib/mongoid/railties/database.rake +7 -2
  195. data/lib/mongoid/reloadable.rb +10 -8
  196. data/lib/mongoid/scopable.rb +15 -13
  197. data/lib/mongoid/selectable.rb +1 -2
  198. data/lib/mongoid/serializable.rb +10 -6
  199. data/lib/mongoid/stateful.rb +57 -10
  200. data/lib/mongoid/tasks/database.rake +12 -0
  201. data/lib/mongoid/tasks/database.rb +20 -2
  202. data/lib/mongoid/threaded/lifecycle.rb +5 -5
  203. data/lib/mongoid/threaded.rb +42 -12
  204. data/lib/mongoid/timestamps/created.rb +1 -1
  205. data/lib/mongoid/timestamps/updated.rb +2 -2
  206. data/lib/mongoid/touchable.rb +2 -3
  207. data/lib/mongoid/traversable.rb +5 -4
  208. data/lib/mongoid/utils.rb +22 -0
  209. data/lib/mongoid/validatable/localizable.rb +1 -1
  210. data/lib/mongoid/validatable/macros.rb +5 -7
  211. data/lib/mongoid/validatable/presence.rb +2 -2
  212. data/lib/mongoid/validatable/uniqueness.rb +9 -8
  213. data/lib/mongoid/validatable.rb +9 -6
  214. data/lib/mongoid/version.rb +1 -1
  215. data/lib/mongoid/warnings.rb +19 -4
  216. data/lib/mongoid.rb +17 -3
  217. data/spec/config/mongoid.yml +16 -0
  218. data/spec/integration/app_spec.rb +10 -14
  219. data/spec/integration/associations/belongs_to_spec.rb +18 -0
  220. data/spec/integration/associations/embedded_spec.rb +15 -0
  221. data/spec/integration/associations/embeds_many_spec.rb +15 -2
  222. data/spec/integration/associations/embeds_one_spec.rb +18 -0
  223. data/spec/integration/associations/foreign_key_spec.rb +9 -0
  224. data/spec/integration/associations/has_and_belongs_to_many_spec.rb +21 -0
  225. data/spec/integration/associations/has_one_spec.rb +97 -1
  226. data/spec/integration/associations/scope_option_spec.rb +1 -1
  227. data/spec/integration/callbacks_models.rb +132 -1
  228. data/spec/integration/callbacks_spec.rb +360 -4
  229. data/spec/integration/criteria/range_spec.rb +95 -1
  230. data/spec/integration/discriminator_key_spec.rb +118 -80
  231. data/spec/integration/dots_and_dollars_spec.rb +277 -0
  232. data/spec/integration/i18n_fallbacks_spec.rb +3 -32
  233. data/spec/integration/matcher_examples_spec.rb +20 -13
  234. data/spec/integration/matcher_operator_data/type_decimal.yml +3 -2
  235. data/spec/integration/matcher_operator_spec.rb +3 -5
  236. data/spec/integration/persistence/range_field_spec.rb +350 -0
  237. data/spec/mongoid/association/counter_cache_spec.rb +1 -1
  238. data/spec/mongoid/association/depending_spec.rb +9 -9
  239. data/spec/mongoid/association/eager_spec.rb +2 -1
  240. data/spec/mongoid/association/embedded/embedded_in/binding_spec.rb +2 -1
  241. data/spec/mongoid/association/embedded/embedded_in/buildable_spec.rb +54 -0
  242. data/spec/mongoid/association/embedded/embedded_in/proxy_spec.rb +96 -9
  243. data/spec/mongoid/association/embedded/embeds_many/buildable_spec.rb +112 -0
  244. data/spec/mongoid/association/embedded/embeds_many/proxy_spec.rb +255 -65
  245. data/spec/mongoid/association/embedded/embeds_many_models.rb +37 -0
  246. data/spec/mongoid/association/embedded/embeds_many_query_spec.rb +12 -0
  247. data/spec/mongoid/association/embedded/embeds_many_spec.rb +68 -0
  248. data/spec/mongoid/association/embedded/embeds_one/buildable_spec.rb +25 -0
  249. data/spec/mongoid/association/embedded/embeds_one/proxy_spec.rb +15 -2
  250. data/spec/mongoid/association/embedded/embeds_one_models.rb +19 -0
  251. data/spec/mongoid/association/embedded/embeds_one_spec.rb +28 -0
  252. data/spec/mongoid/association/referenced/belongs_to/binding_spec.rb +2 -1
  253. data/spec/mongoid/association/referenced/belongs_to/buildable_spec.rb +54 -0
  254. data/spec/mongoid/association/referenced/belongs_to/proxy_spec.rb +15 -0
  255. data/spec/mongoid/association/referenced/belongs_to_models.rb +11 -0
  256. data/spec/mongoid/association/referenced/belongs_to_spec.rb +4 -20
  257. data/spec/mongoid/association/referenced/has_and_belongs_to_many/proxy_spec.rb +186 -229
  258. data/spec/mongoid/association/referenced/has_and_belongs_to_many_models.rb +25 -0
  259. data/spec/mongoid/association/referenced/has_and_belongs_to_many_spec.rb +35 -2
  260. data/spec/mongoid/association/referenced/has_many/buildable_spec.rb +109 -0
  261. data/spec/mongoid/association/referenced/has_many/enumerable_spec.rb +2 -56
  262. data/spec/mongoid/association/referenced/has_many/proxy_spec.rb +173 -177
  263. data/spec/mongoid/association/referenced/has_many_models.rb +3 -1
  264. data/spec/mongoid/association/referenced/has_many_spec.rb +25 -0
  265. data/spec/mongoid/association/referenced/has_one/buildable_spec.rb +2 -2
  266. data/spec/mongoid/association/referenced/has_one/proxy_spec.rb +107 -1
  267. data/spec/mongoid/association/referenced/has_one_models.rb +16 -0
  268. data/spec/mongoid/association/syncable_spec.rb +15 -1
  269. data/spec/mongoid/atomic/paths_spec.rb +0 -14
  270. data/spec/mongoid/attributes/nested_spec.rb +80 -11
  271. data/spec/mongoid/attributes/nested_spec_models.rb +48 -0
  272. data/spec/mongoid/attributes/projector_spec.rb +1 -5
  273. data/spec/mongoid/attributes_spec.rb +510 -33
  274. data/spec/mongoid/changeable_spec.rb +429 -37
  275. data/spec/mongoid/clients/factory_spec.rb +23 -30
  276. data/spec/mongoid/clients/sessions_spec.rb +0 -38
  277. data/spec/mongoid/clients_spec.rb +149 -15
  278. data/spec/mongoid/collection_configurable_spec.rb +158 -0
  279. data/spec/mongoid/config/defaults_spec.rb +160 -0
  280. data/spec/mongoid/config_spec.rb +214 -31
  281. data/spec/mongoid/contextual/aggregable/memory_spec.rb +396 -158
  282. data/spec/mongoid/contextual/aggregable/memory_table.yml +88 -0
  283. data/spec/mongoid/contextual/aggregable/memory_table_spec.rb +62 -0
  284. data/spec/mongoid/contextual/map_reduce_spec.rb +2 -16
  285. data/spec/mongoid/contextual/memory_spec.rb +850 -88
  286. data/spec/mongoid/contextual/mongo/documents_loader_spec.rb +187 -0
  287. data/spec/mongoid/contextual/mongo_spec.rb +1572 -435
  288. data/spec/mongoid/contextual/none_spec.rb +60 -21
  289. data/spec/mongoid/copyable_spec.rb +453 -11
  290. data/spec/mongoid/criteria/findable_spec.rb +86 -210
  291. data/spec/mongoid/criteria/includable_spec.rb +1492 -0
  292. data/spec/mongoid/criteria/includable_spec_models.rb +54 -0
  293. data/spec/mongoid/criteria/marshalable_spec.rb +18 -1
  294. data/spec/mongoid/criteria/queryable/extensions/array_spec.rb +7 -19
  295. data/spec/mongoid/criteria/queryable/extensions/big_decimal_spec.rb +134 -26
  296. data/spec/mongoid/criteria/queryable/extensions/date_spec.rb +11 -0
  297. data/spec/mongoid/criteria/queryable/extensions/date_time_spec.rb +11 -0
  298. data/spec/mongoid/criteria/queryable/extensions/hash_spec.rb +0 -15
  299. data/spec/mongoid/criteria/queryable/extensions/numeric_spec.rb +73 -7
  300. data/spec/mongoid/criteria/queryable/extensions/string_spec.rb +4 -69
  301. data/spec/mongoid/criteria/queryable/extensions/symbol_spec.rb +0 -59
  302. data/spec/mongoid/criteria/queryable/extensions/time_spec.rb +11 -0
  303. data/spec/mongoid/criteria/queryable/extensions/time_with_zone_spec.rb +11 -0
  304. data/spec/mongoid/criteria/queryable/optional_spec.rb +15 -484
  305. data/spec/mongoid/criteria/queryable/options_spec.rb +1 -1
  306. data/spec/mongoid/criteria/queryable/selectable_logical_spec.rb +469 -0
  307. data/spec/mongoid/criteria/queryable/selectable_spec.rb +78 -86
  308. data/spec/mongoid/criteria/queryable/selector_spec.rb +90 -5
  309. data/spec/mongoid/criteria/queryable/storable_spec.rb +72 -0
  310. data/spec/mongoid/criteria/translator_spec.rb +132 -0
  311. data/spec/mongoid/criteria_projection_spec.rb +1 -5
  312. data/spec/mongoid/criteria_spec.rb +469 -1205
  313. data/spec/mongoid/document_fields_spec.rb +173 -24
  314. data/spec/mongoid/document_spec.rb +32 -41
  315. data/spec/mongoid/errors/document_not_found_spec.rb +29 -2
  316. data/spec/mongoid/errors/invalid_field_spec.rb +1 -1
  317. data/spec/mongoid/errors/invalid_field_type_spec.rb +55 -0
  318. data/spec/mongoid/errors/mongoid_error_spec.rb +3 -1
  319. data/spec/mongoid/errors/no_environment_spec.rb +3 -3
  320. data/spec/mongoid/errors/readonly_document_spec.rb +2 -2
  321. data/spec/mongoid/errors/too_many_nested_attribute_records_spec.rb +1 -1
  322. data/spec/mongoid/extensions/array_spec.rb +16 -2
  323. data/spec/mongoid/extensions/big_decimal_spec.rb +712 -212
  324. data/spec/mongoid/extensions/binary_spec.rb +44 -9
  325. data/spec/mongoid/extensions/boolean_spec.rb +68 -82
  326. data/spec/mongoid/extensions/date_class_mongoize_spec.rb +7 -3
  327. data/spec/mongoid/extensions/date_spec.rb +71 -1
  328. data/spec/mongoid/extensions/date_time_spec.rb +15 -9
  329. data/spec/mongoid/extensions/float_spec.rb +53 -74
  330. data/spec/mongoid/extensions/hash_spec.rb +33 -3
  331. data/spec/mongoid/extensions/integer_spec.rb +50 -64
  332. data/spec/mongoid/extensions/range_spec.rb +255 -54
  333. data/spec/mongoid/extensions/regexp_spec.rb +58 -33
  334. data/spec/mongoid/extensions/set_spec.rb +106 -0
  335. data/spec/mongoid/extensions/string_spec.rb +53 -25
  336. data/spec/mongoid/extensions/symbol_spec.rb +18 -25
  337. data/spec/mongoid/extensions/time_spec.rb +639 -106
  338. data/spec/mongoid/extensions/time_with_zone_spec.rb +24 -83
  339. data/spec/mongoid/factory_spec.rb +61 -1
  340. data/spec/mongoid/fields/localized_spec.rb +80 -37
  341. data/spec/mongoid/fields_spec.rb +500 -84
  342. data/spec/mongoid/findable_spec.rb +450 -58
  343. data/spec/mongoid/indexable/specification_spec.rb +2 -2
  344. data/spec/mongoid/indexable_spec.rb +55 -30
  345. data/spec/mongoid/interceptable_spec.rb +599 -8
  346. data/spec/mongoid/interceptable_spec_models.rb +235 -4
  347. data/spec/mongoid/matcher/extract_attribute_spec.rb +1 -5
  348. data/spec/mongoid/mongoizable_spec.rb +285 -0
  349. data/spec/mongoid/persistable/creatable_spec.rb +2 -2
  350. data/spec/mongoid/persistable/deletable_spec.rb +28 -8
  351. data/spec/mongoid/persistable/destroyable_spec.rb +28 -8
  352. data/spec/mongoid/persistable/incrementable_spec.rb +37 -0
  353. data/spec/mongoid/persistable/logical_spec.rb +37 -0
  354. data/spec/mongoid/persistable/poppable_spec.rb +36 -0
  355. data/spec/mongoid/persistable/pullable_spec.rb +72 -0
  356. data/spec/mongoid/persistable/pushable_spec.rb +72 -0
  357. data/spec/mongoid/persistable/renamable_spec.rb +36 -0
  358. data/spec/mongoid/persistable/savable_spec.rb +96 -0
  359. data/spec/mongoid/persistable/settable_spec.rb +37 -0
  360. data/spec/mongoid/persistable/unsettable_spec.rb +36 -0
  361. data/spec/mongoid/persistable/updatable_spec.rb +20 -28
  362. data/spec/mongoid/persistable/upsertable_spec.rb +89 -1
  363. data/spec/mongoid/persistence_context_spec.rb +31 -57
  364. data/spec/mongoid/query_cache_middleware_spec.rb +0 -18
  365. data/spec/mongoid/query_cache_spec.rb +56 -215
  366. data/spec/mongoid/reloadable_spec.rb +83 -6
  367. data/spec/mongoid/scopable_spec.rb +91 -1
  368. data/spec/mongoid/serializable_spec.rb +9 -30
  369. data/spec/mongoid/shardable_spec.rb +4 -4
  370. data/spec/mongoid/stateful_spec.rb +150 -8
  371. data/spec/mongoid/tasks/database_rake_spec.rb +74 -0
  372. data/spec/mongoid/tasks/database_spec.rb +127 -0
  373. data/spec/mongoid/timestamps_spec.rb +392 -4
  374. data/spec/mongoid/timestamps_spec_models.rb +67 -0
  375. data/spec/mongoid/touchable_spec.rb +390 -2
  376. data/spec/mongoid/touchable_spec_models.rb +14 -8
  377. data/spec/mongoid/traversable_spec.rb +13 -35
  378. data/spec/mongoid/validatable/presence_spec.rb +1 -1
  379. data/spec/mongoid/validatable/uniqueness_spec.rb +58 -31
  380. data/spec/mongoid/warnings_spec.rb +35 -0
  381. data/spec/mongoid_spec.rb +34 -16
  382. data/spec/rails/controller_extension/controller_runtime_spec.rb +2 -2
  383. data/spec/rails/mongoid_spec.rb +4 -16
  384. data/spec/spec_helper.rb +5 -0
  385. data/spec/support/constraints.rb +24 -0
  386. data/spec/support/immutable_ids.rb +118 -0
  387. data/spec/support/macros.rb +78 -0
  388. data/spec/support/models/artist.rb +0 -1
  389. data/spec/support/models/augmentation.rb +12 -0
  390. data/spec/support/models/band.rb +4 -0
  391. data/spec/support/models/book.rb +1 -0
  392. data/spec/support/models/building.rb +2 -0
  393. data/spec/support/models/catalog.rb +24 -0
  394. data/spec/support/models/circus.rb +3 -0
  395. data/spec/support/models/cover.rb +10 -0
  396. data/spec/support/models/fanatic.rb +8 -0
  397. data/spec/support/models/implant.rb +9 -0
  398. data/spec/support/models/label.rb +2 -0
  399. data/spec/support/models/passport.rb +9 -0
  400. data/spec/support/models/person.rb +2 -0
  401. data/spec/support/models/player.rb +2 -0
  402. data/spec/support/models/powerup.rb +12 -0
  403. data/spec/support/models/product.rb +1 -0
  404. data/spec/support/models/purse.rb +9 -0
  405. data/spec/support/models/registry.rb +1 -0
  406. data/spec/support/models/school.rb +14 -0
  407. data/spec/support/models/shield.rb +18 -0
  408. data/spec/support/models/student.rb +14 -0
  409. data/spec/support/models/weapon.rb +12 -0
  410. data.tar.gz.sig +0 -0
  411. metadata +718 -641
  412. metadata.gz.sig +0 -0
  413. data/lib/mongoid/errors/eager_load.rb +0 -23
  414. data/lib/mongoid/errors/invalid_value.rb +0 -17
  415. data/spec/mongoid/criteria/queryable/extensions/bignum_spec.rb +0 -60
  416. data/spec/mongoid/criteria/queryable/extensions/fixnum_spec.rb +0 -60
  417. data/spec/mongoid/errors/eager_load_spec.rb +0 -31
@@ -6,20 +6,12 @@ describe Mongoid::Extensions::Time do
6
6
 
7
7
  describe ".demongoize" do
8
8
 
9
- after(:all) do
10
- Mongoid.use_utc = false
11
- Mongoid.use_activesupport_time_zone = true
12
- end
13
-
14
9
  let!(:time) do
15
10
  Time.local(2010, 11, 19)
16
11
  end
17
12
 
18
13
  context "when the time zone is not defined" do
19
-
20
- before do
21
- Mongoid.use_utc = false
22
- end
14
+ config_override :use_utc, false
23
15
 
24
16
  context "when the local time is not observing daylight saving" do
25
17
 
@@ -57,19 +49,21 @@ describe Mongoid::Extensions::Time do
57
49
  end
58
50
 
59
51
  context "when using the ActiveSupport time zone" do
52
+ config_override :use_activesupport_time_zone, true
53
+ time_zone_override "Stockholm"
60
54
 
61
- before do
62
- Mongoid.use_activesupport_time_zone = true
63
- Time.zone = "Stockholm"
64
- end
55
+ context "when demongoizing a Time" do
65
56
 
66
- after do
67
- Time.zone = nil
68
- Mongoid.use_activesupport_time_zone = false
57
+ it "returns an ActiveSupport::TimeWithZone" do
58
+ expect(Time.demongoize(time).class).to eq(ActiveSupport::TimeWithZone)
59
+ end
69
60
  end
70
61
 
71
- it "returns an ActiveSupport::TimeWithZone" do
72
- expect(Time.demongoize(time).class).to eq(ActiveSupport::TimeWithZone)
62
+ context "when demongoizing a Date" do
63
+
64
+ it "returns an ActiveSupport::TimeWithZone" do
65
+ expect(Time.demongoize(Date.today).class).to eq(ActiveSupport::TimeWithZone)
66
+ end
73
67
  end
74
68
 
75
69
  context "when the local time is not observing daylight saving" do
@@ -114,35 +108,20 @@ describe Mongoid::Extensions::Time do
114
108
  end
115
109
 
116
110
  context "when the time zone is defined as UTC" do
117
-
118
- before do
119
- Mongoid.use_utc = true
120
- end
121
-
122
- after do
123
- Mongoid.use_utc = false
124
- end
111
+ config_override :use_utc, true
125
112
 
126
113
  it "returns utc" do
127
114
  expect(Time.demongoize(time.dup.utc).utc_offset).to eq(0)
128
115
  end
129
116
 
130
117
  context "when using the ActiveSupport time zone" do
118
+ config_override :use_activesupport_time_zone, true
119
+ time_zone_override "Stockholm"
131
120
 
132
121
  let(:time) do
133
122
  Time.utc(2010, 11, 19, 0, 30)
134
123
  end
135
124
 
136
- before do
137
- Mongoid.use_activesupport_time_zone = true
138
- Time.zone = "Stockholm"
139
- end
140
-
141
- after do
142
- Time.zone = nil
143
- Mongoid.use_activesupport_time_zone = false
144
- end
145
-
146
125
  it "returns utc" do
147
126
  expect(Time.demongoize(time)).to eq(
148
127
  ActiveSupport::TimeZone['UTC'].local(2010, 11, 19, 0, 30)
@@ -163,6 +142,330 @@ describe Mongoid::Extensions::Time do
163
142
  expect(Time.demongoize(nil)).to be_nil
164
143
  end
165
144
  end
145
+
146
+ context "when the value is uncastable" do
147
+
148
+ it "returns nil" do
149
+ expect(Time.demongoize("bogus")).to be_nil
150
+ end
151
+ end
152
+
153
+ context "when the value is a string" do
154
+
155
+ context "when use_utc is false" do
156
+ config_override :use_utc, false
157
+
158
+ context "when using active support's time zone" do
159
+ include_context 'using AS time zone'
160
+
161
+ context "when the string is a valid time with time zone" do
162
+
163
+ let(:string) do
164
+ # JST is +0900
165
+ "2010-11-19 00:24:49.123457 +1100"
166
+ end
167
+
168
+ let(:mongoized) do
169
+ Time.demongoize(string)
170
+ end
171
+
172
+ let(:expected_time) { Time.parse("2010-11-18 13:24:49.123457 +0000").in_time_zone }
173
+
174
+ it "converts to the AS time zone" do
175
+ expect(mongoized.zone).to eq("JST")
176
+ end
177
+
178
+ it_behaves_like 'mongoizes to AS::TimeWithZone'
179
+ it_behaves_like 'maintains precision when mongoized'
180
+ end
181
+
182
+ context "when the string is a valid time without time zone" do
183
+
184
+ let(:string) do
185
+ "2010-11-19 00:24:49.123457"
186
+ end
187
+
188
+ let(:mongoized) do
189
+ Time.demongoize(string)
190
+ end
191
+
192
+ let(:expected_time) { Time.parse("2010-11-18 15:24:49.123457 +0000").in_time_zone }
193
+
194
+ it "converts to the AS time zone" do
195
+ expect(mongoized.zone).to eq("JST")
196
+ end
197
+
198
+ it_behaves_like 'mongoizes to AS::TimeWithZone'
199
+ it_behaves_like 'maintains precision when mongoized'
200
+ end
201
+
202
+ context "when the string is a valid time without time" do
203
+
204
+ let(:string) do
205
+ "2010-11-19"
206
+ end
207
+
208
+ let(:mongoized) do
209
+ Time.demongoize(string)
210
+ end
211
+
212
+ let(:expected_time) { Time.parse("2010-11-18 15:00:00 +0000").in_time_zone }
213
+
214
+ it "converts to the AS time zone" do
215
+ expect(mongoized.zone).to eq("JST")
216
+ end
217
+
218
+ it_behaves_like 'mongoizes to AS::TimeWithZone'
219
+ end
220
+
221
+ context "when the string is an invalid time" do
222
+
223
+ let(:string) do
224
+ "bogus"
225
+ end
226
+
227
+ it "returns nil" do
228
+ expect(Time.demongoize(string)).to be_nil
229
+ end
230
+ end
231
+ end
232
+
233
+ context "when not using active support's time zone" do
234
+ include_context 'not using AS time zone'
235
+
236
+ context "when the string is a valid time with time zone" do
237
+
238
+ let(:string) do
239
+ "2010-11-19 00:24:49.123457 +1100"
240
+ end
241
+
242
+ let(:expected_time) { Time.parse("2010-11-18 13:24:49.123457 +0000").in_time_zone }
243
+
244
+ let(:mongoized) do
245
+ Time.demongoize(string)
246
+ end
247
+
248
+ it_behaves_like 'mongoizes to Time'
249
+ it_behaves_like 'maintains precision when mongoized'
250
+ end
251
+
252
+ context "when the string is a valid time without time zone" do
253
+
254
+ let(:string) do
255
+ "2010-11-19 00:24:49.123457"
256
+ end
257
+
258
+ let(:utc_offset) do
259
+ Time.now.utc_offset
260
+ end
261
+
262
+ let(:expected_time) { Time.parse("2010-11-19 00:24:49.123457 +0000") - Time.parse(string).utc_offset }
263
+
264
+ let(:mongoized) do
265
+ Time.demongoize(string)
266
+ end
267
+
268
+ it 'test operates in multiple time zones' do
269
+ expect(utc_offset).not_to eq(Time.zone.now.utc_offset)
270
+ end
271
+
272
+ it_behaves_like 'mongoizes to Time'
273
+ it_behaves_like 'maintains precision when mongoized'
274
+ end
275
+
276
+ context "when the string is a valid time without time" do
277
+
278
+ let(:string) do
279
+ "2010-11-19"
280
+ end
281
+
282
+ let(:mongoized) do
283
+ Time.demongoize(string)
284
+ end
285
+
286
+ let(:utc_offset) do
287
+ Time.now.utc_offset
288
+ end
289
+
290
+ let(:expected_time) { Time.parse("2010-11-19 00:00:00 +0000") - Time.parse(string).utc_offset }
291
+
292
+ it 'test operates in multiple time zones' do
293
+ expect(utc_offset).not_to eq(Time.zone.now.utc_offset)
294
+ end
295
+
296
+ it_behaves_like 'mongoizes to Time'
297
+ end
298
+
299
+ context "when the string is an invalid time" do
300
+
301
+ let(:string) do
302
+ "bogus"
303
+ end
304
+
305
+ it "returns nil" do
306
+ expect(Time.demongoize(string)).to be_nil
307
+ end
308
+ end
309
+ end
310
+ end
311
+
312
+ context "when use_utc is true" do
313
+ config_override :use_utc, true
314
+
315
+ context "when using active support's time zone" do
316
+ include_context 'using AS time zone'
317
+
318
+ context "when the string is a valid time with time zone" do
319
+
320
+ let(:string) do
321
+ # JST is +0900
322
+ "2010-11-19 00:24:49.123457 +1100"
323
+ end
324
+
325
+ let(:mongoized) do
326
+ Time.demongoize(string)
327
+ end
328
+
329
+ let(:expected_time) { Time.parse("2010-11-18 13:24:49.123457 +0000").in_time_zone }
330
+
331
+ it "converts to UTC" do
332
+ expect(mongoized.zone).to eq("UTC")
333
+ end
334
+
335
+ it_behaves_like 'mongoizes to AS::TimeWithZone'
336
+ it_behaves_like 'maintains precision when mongoized'
337
+ end
338
+
339
+ context "when the string is a valid time without time zone" do
340
+
341
+ let(:string) do
342
+ "2010-11-19 00:24:49.123457"
343
+ end
344
+
345
+ let(:mongoized) do
346
+ Time.demongoize(string)
347
+ end
348
+
349
+ let(:expected_time) { Time.parse("2010-11-18 15:24:49.123457 +0000").in_time_zone }
350
+
351
+ it "converts to UTC" do
352
+ expect(mongoized.zone).to eq("UTC")
353
+ end
354
+
355
+ it_behaves_like 'mongoizes to AS::TimeWithZone'
356
+ it_behaves_like 'maintains precision when mongoized'
357
+ end
358
+
359
+ context "when the string is a valid time without time" do
360
+
361
+ let(:string) do
362
+ "2010-11-19"
363
+ end
364
+
365
+ let(:mongoized) do
366
+ Time.demongoize(string)
367
+ end
368
+
369
+ let(:expected_time) { Time.parse("2010-11-18 15:00:00 +0000").in_time_zone }
370
+
371
+ it "converts to UTC" do
372
+ expect(mongoized.zone).to eq("UTC")
373
+ end
374
+
375
+ it_behaves_like 'mongoizes to AS::TimeWithZone'
376
+ end
377
+
378
+ context "when the string is an invalid time" do
379
+
380
+ let(:string) do
381
+ "bogus"
382
+ end
383
+
384
+ it "returns nil" do
385
+ expect(Time.demongoize(string)).to be_nil
386
+ end
387
+ end
388
+ end
389
+
390
+ context "when not using active support's time zone" do
391
+ include_context 'not using AS time zone'
392
+
393
+ context "when the string is a valid time with time zone" do
394
+
395
+ let(:string) do
396
+ "2010-11-19 00:24:49.123457 +1100"
397
+ end
398
+
399
+ let(:expected_time) { Time.parse("2010-11-18 13:24:49.123457 +0000").in_time_zone }
400
+
401
+ let(:mongoized) do
402
+ Time.demongoize(string)
403
+ end
404
+
405
+ it_behaves_like 'mongoizes to Time'
406
+ it_behaves_like 'maintains precision when mongoized'
407
+ end
408
+
409
+ context "when the string is a valid time without time zone" do
410
+
411
+ let(:string) do
412
+ "2010-11-19 00:24:49.123457"
413
+ end
414
+
415
+ let(:utc_offset) do
416
+ Time.now.utc_offset
417
+ end
418
+
419
+ let(:expected_time) { Time.parse("2010-11-19 00:24:49.123457 +0000") - Time.parse(string).utc_offset }
420
+
421
+ let(:mongoized) do
422
+ Time.demongoize(string)
423
+ end
424
+
425
+ it 'test operates in multiple time zones' do
426
+ expect(utc_offset).not_to eq(Time.zone.now.utc_offset)
427
+ end
428
+
429
+ it_behaves_like 'mongoizes to Time'
430
+ it_behaves_like 'maintains precision when mongoized'
431
+ end
432
+
433
+ context "when the string is a valid time without time" do
434
+
435
+ let(:string) do
436
+ "2010-11-19"
437
+ end
438
+
439
+ let(:mongoized) do
440
+ Time.demongoize(string)
441
+ end
442
+
443
+ let(:utc_offset) do
444
+ Time.now.utc_offset
445
+ end
446
+
447
+ let(:expected_time) { Time.parse("2010-11-19 00:00:00 +0000") - Time.parse(string).utc_offset }
448
+
449
+ it 'test operates in multiple time zones' do
450
+ expect(utc_offset).not_to eq(Time.zone.now.utc_offset)
451
+ end
452
+
453
+ it_behaves_like 'mongoizes to Time'
454
+ end
455
+
456
+ context "when the string is an invalid time" do
457
+
458
+ let(:string) do
459
+ "bogus"
460
+ end
461
+
462
+ it "returns nil" do
463
+ expect(Time.demongoize(string)).to be_nil
464
+ end
465
+ end
466
+ end
467
+ end
468
+ end
166
469
  end
167
470
 
168
471
  describe ".mongoize" do
@@ -180,65 +483,319 @@ describe Mongoid::Extensions::Time do
180
483
 
181
484
  context "when string is empty" do
182
485
 
486
+ let(:mongoized) do
487
+ Time.mongoize("")
488
+ end
489
+
183
490
  it "returns nil" do
184
- expect(Time.mongoize("")).to be_nil
491
+ expect(mongoized).to be_nil
185
492
  end
186
493
  end
187
494
 
188
- context "when given a string" do
495
+ context "when the value is a string" do
189
496
 
190
- context "when the string is a valid time" do
497
+ context "when use_utc is false" do
498
+ config_override :use_utc, false
191
499
 
192
- it "converts to a utc time" do
193
- expect(Time.mongoize(time.to_s).utc_offset).to eq(0)
194
- end
500
+ context "when using active support's time zone" do
501
+ include_context 'using AS time zone'
195
502
 
196
- it "serializes with time parsing" do
197
- expect(Time.mongoize(time.to_s)).to eq(Time.parse(time.to_s).utc)
198
- end
503
+ context "when the string is a valid time with time zone" do
199
504
 
200
- it "returns a local date from the string" do
201
- expect(Time.mongoize(time.to_s)).to eq(
202
- Time.local(time.year, time.month, time.day, time.hour, time.min, time.sec)
203
- )
505
+ let(:string) do
506
+ # JST is +0900
507
+ "2010-11-19 00:24:49.123457 +1100"
508
+ end
509
+
510
+ let(:mongoized) do
511
+ Time.mongoize(string)
512
+ end
513
+
514
+ let(:expected_time) { Time.parse("2010-11-18 13:24:49.123457 +0000").in_time_zone }
515
+
516
+ it "converts to UTC" do
517
+ expect(mongoized.zone).to eq("UTC")
518
+ end
519
+
520
+ it_behaves_like 'maintains precision when mongoized'
521
+ end
522
+
523
+ context "when the string is a valid time without time zone" do
524
+
525
+ let(:string) do
526
+ "2010-11-19 00:24:49.123457"
527
+ end
528
+
529
+ let(:mongoized) do
530
+ Time.mongoize(string)
531
+ end
532
+
533
+ let(:expected_time) { Time.parse("2010-11-18 15:24:49.123457 +0000").in_time_zone }
534
+
535
+ it "converts to UTC" do
536
+ expect(mongoized.zone).to eq("UTC")
537
+ end
538
+
539
+ it_behaves_like 'maintains precision when mongoized'
540
+ end
541
+
542
+ context "when the string is a valid time without time" do
543
+
544
+ let(:string) do
545
+ "2010-11-19"
546
+ end
547
+
548
+ let(:mongoized) do
549
+ Time.mongoize(string)
550
+ end
551
+
552
+ let(:expected_time) { Time.parse("2010-11-18 15:00:00 +0000").in_time_zone }
553
+
554
+ it "converts to UTC" do
555
+ expect(mongoized.zone).to eq("UTC")
556
+ end
557
+ end
558
+
559
+ context "when the string is an invalid time" do
560
+
561
+ let(:string) do
562
+ "bogus"
563
+ end
564
+
565
+ it "returns nil" do
566
+ expect(Time.mongoize(string)).to be_nil
567
+ end
568
+ end
204
569
  end
205
- end
206
570
 
207
- context "when the string is an invalid time" do
571
+ context "when not using active support's time zone" do
572
+ include_context 'not using AS time zone'
573
+
574
+ context "when the string is a valid time with time zone" do
575
+
576
+ let(:string) do
577
+ "2010-11-19 00:24:49.123457 +1100"
578
+ end
579
+
580
+ let(:expected_time) { Time.parse("2010-11-18 13:24:49.123457 +0000").in_time_zone }
581
+
582
+ let(:mongoized) do
583
+ Time.mongoize(string)
584
+ end
585
+
586
+ it_behaves_like 'mongoizes to Time'
587
+ it_behaves_like 'maintains precision when mongoized'
588
+ end
589
+
590
+ context "when the string is a valid time without time zone" do
591
+
592
+ let(:string) do
593
+ "2010-11-19 00:24:49.123457"
594
+ end
595
+
596
+ let(:utc_offset) do
597
+ Time.now.utc_offset
598
+ end
599
+
600
+ let(:expected_time) { Time.parse("2010-11-19 00:24:49.123457 +0000") - Time.parse(string).utc_offset }
208
601
 
209
- it "converts the time to nil" do
210
- expect(Time.mongoize("time")).to eq(nil)
602
+ let(:mongoized) do
603
+ Time.mongoize(string)
604
+ end
605
+
606
+ it 'test operates in multiple time zones' do
607
+ expect(utc_offset).not_to eq(Time.zone.now.utc_offset)
608
+ end
609
+
610
+ it_behaves_like 'mongoizes to Time'
611
+ it_behaves_like 'maintains precision when mongoized'
612
+ end
613
+
614
+ context "when the string is a valid time without time" do
615
+
616
+ let(:string) do
617
+ "2010-11-19"
618
+ end
619
+
620
+ let(:mongoized) do
621
+ Time.mongoize(string)
622
+ end
623
+
624
+ let(:utc_offset) do
625
+ Time.now.utc_offset
626
+ end
627
+
628
+ let(:expected_time) { Time.parse("2010-11-19 00:00:00 +0000") - Time.parse(string).utc_offset }
629
+
630
+ it 'test operates in multiple time zones' do
631
+ expect(utc_offset).not_to eq(Time.zone.now.utc_offset)
632
+ end
633
+
634
+ it_behaves_like 'mongoizes to Time'
635
+ end
636
+
637
+ context "when the string is an invalid time" do
638
+
639
+ let(:string) do
640
+ "bogus"
641
+ end
642
+
643
+ it "returns nil" do
644
+ expect(Time.mongoize(string)).to be_nil
645
+ end
646
+ end
211
647
  end
212
648
  end
213
649
 
214
- context "when using the ActiveSupport time zone" do
650
+ context "when use_utc is true" do
651
+ config_override :use_utc, true
215
652
 
216
- before do
217
- Mongoid.use_activesupport_time_zone = true
218
- # if this is actually your time zone, the following tests are useless
219
- Time.zone = "Stockholm"
220
- end
653
+ context "when using active support's time zone" do
654
+ include_context 'using AS time zone'
221
655
 
222
- after do
223
- Time.zone = nil
224
- Mongoid.use_activesupport_time_zone = false
225
- end
656
+ context "when the string is a valid time with time zone" do
226
657
 
227
- context "when the local time is not observing daylight saving" do
658
+ let(:string) do
659
+ # JST is +0900
660
+ "2010-11-19 00:24:49.123457 +1100"
661
+ end
228
662
 
229
- it "returns the local time" do
230
- expect(Time.mongoize('2010-11-19 5:00:00')).to eq(
231
- Time.utc(2010, 11, 19, 4)
232
- )
663
+ let(:mongoized) do
664
+ Time.mongoize(string)
665
+ end
666
+
667
+ let(:expected_time) { Time.parse("2010-11-18 13:24:49.123457 +0000").in_time_zone }
668
+
669
+ it "converts to UTC" do
670
+ expect(mongoized.zone).to eq("UTC")
671
+ end
672
+
673
+ it_behaves_like 'maintains precision when mongoized'
674
+ end
675
+
676
+ context "when the string is a valid time without time zone" do
677
+
678
+ let(:string) do
679
+ "2010-11-19 00:24:49.123457"
680
+ end
681
+
682
+ let(:mongoized) do
683
+ Time.mongoize(string)
684
+ end
685
+
686
+ let(:expected_time) { Time.parse("2010-11-18 15:24:49.123457 +0000").in_time_zone }
687
+
688
+ it "converts to UTC" do
689
+ expect(mongoized.zone).to eq("UTC")
690
+ end
691
+
692
+ it_behaves_like 'maintains precision when mongoized'
693
+ end
694
+
695
+ context "when the string is a valid time without time" do
696
+
697
+ let(:string) do
698
+ "2010-11-19"
699
+ end
700
+
701
+ let(:mongoized) do
702
+ Time.mongoize(string)
703
+ end
704
+
705
+ let(:expected_time) { Time.parse("2010-11-18 15:00:00 +0000").in_time_zone }
706
+
707
+ it "converts to UTC" do
708
+ expect(mongoized.zone).to eq("UTC")
709
+ end
710
+ end
711
+
712
+ context "when the string is an invalid time" do
713
+
714
+ let(:string) do
715
+ "bogus"
716
+ end
717
+
718
+ it "returns nil" do
719
+ expect(Time.mongoize(string)).to be_nil
720
+ end
233
721
  end
234
722
  end
235
723
 
236
- context "when the local time is observing daylight saving" do
724
+ context "when not using active support's time zone" do
725
+ include_context 'not using AS time zone'
237
726
 
238
- it "returns the local time" do
239
- expect(Time.mongoize('2010-9-19 5:00:00')).to eq(
240
- Time.utc(2010, 9, 19, 3)
241
- )
727
+ context "when the string is a valid time with time zone" do
728
+
729
+ let(:string) do
730
+ "2010-11-19 00:24:49.123457 +1100"
731
+ end
732
+
733
+ let(:expected_time) { Time.parse("2010-11-18 13:24:49.123457 +0000").in_time_zone }
734
+
735
+ let(:mongoized) do
736
+ Time.mongoize(string)
737
+ end
738
+
739
+ it_behaves_like 'mongoizes to Time'
740
+ it_behaves_like 'maintains precision when mongoized'
741
+ end
742
+
743
+ context "when the string is a valid time without time zone" do
744
+
745
+ let(:string) do
746
+ "2010-11-19 00:24:49.123457"
747
+ end
748
+
749
+ let(:utc_offset) do
750
+ Time.now.utc_offset
751
+ end
752
+
753
+ let(:expected_time) { Time.parse("2010-11-19 00:24:49.123457 +0000") - Time.parse(string).utc_offset }
754
+
755
+ let(:mongoized) do
756
+ Time.mongoize(string)
757
+ end
758
+
759
+ it 'test operates in multiple time zones' do
760
+ expect(utc_offset).not_to eq(Time.zone.now.utc_offset)
761
+ end
762
+
763
+ it_behaves_like 'mongoizes to Time'
764
+ it_behaves_like 'maintains precision when mongoized'
765
+ end
766
+
767
+ context "when the string is a valid time without time" do
768
+
769
+ let(:string) do
770
+ "2010-11-19"
771
+ end
772
+
773
+ let(:mongoized) do
774
+ Time.mongoize(string)
775
+ end
776
+
777
+ let(:utc_offset) do
778
+ Time.now.utc_offset
779
+ end
780
+
781
+ let(:expected_time) { Time.parse("2010-11-19 00:00:00 +0000") - Time.parse(string).utc_offset }
782
+
783
+ it 'test operates in multiple time zones' do
784
+ expect(utc_offset).not_to eq(Time.zone.now.utc_offset)
785
+ end
786
+
787
+ it_behaves_like 'mongoizes to Time'
788
+ end
789
+
790
+ context "when the string is an invalid time" do
791
+
792
+ let(:string) do
793
+ "bogus"
794
+ end
795
+
796
+ it "returns nil" do
797
+ expect(Time.mongoize(string)).to be_nil
798
+ end
242
799
  end
243
800
  end
244
801
  end
@@ -283,22 +840,14 @@ describe Mongoid::Extensions::Time do
283
840
  end
284
841
 
285
842
  context "when using the ActiveSupport time zone" do
843
+ config_override :use_activesupport_time_zone, true
844
+ # if this is actually your time zone, the following tests are useless
845
+ time_zone_override "Stockholm"
286
846
 
287
847
  let(:datetime) do
288
848
  DateTime.new(2010, 11, 19)
289
849
  end
290
850
 
291
- before do
292
- Mongoid.use_activesupport_time_zone = true
293
- # if this is actually your time zone, the following tests are useless
294
- Time.zone = "Stockholm"
295
- end
296
-
297
- after do
298
- Time.zone = nil
299
- Mongoid.use_activesupport_time_zone = false
300
- end
301
-
302
851
  it "assumes the given time is local" do
303
852
  expect(Time.mongoize(datetime)).to eq(
304
853
  Time.utc(2010, 11, 19)
@@ -374,22 +923,14 @@ describe Mongoid::Extensions::Time do
374
923
  end
375
924
 
376
925
  context "when using the ActiveSupport time zone" do
926
+ config_override :use_activesupport_time_zone, true
927
+ # if this is actually your time zone, the following tests are useless
928
+ time_zone_override "Stockholm"
377
929
 
378
930
  let(:date) do
379
931
  Date.new(2010, 11, 19)
380
932
  end
381
933
 
382
- before do
383
- Mongoid.use_activesupport_time_zone = true
384
- # if this is actually your time zone, the following tests are useless
385
- Time.zone = "Stockholm"
386
- end
387
-
388
- after do
389
- Time.zone = nil
390
- Mongoid.use_activesupport_time_zone = false
391
- end
392
-
393
934
  it "assumes the given time is local" do
394
935
  expect(Time.mongoize(date)).to eq(Time.utc(2010, 11, 18, 23))
395
936
  end
@@ -407,17 +948,9 @@ describe Mongoid::Extensions::Time do
407
948
  end
408
949
 
409
950
  context "when using the ActiveSupport time zone" do
410
-
411
- before do
412
- Mongoid.use_activesupport_time_zone = true
413
- # if this is actually your time zone, the following tests are useless
414
- Time.zone = "Stockholm"
415
- end
416
-
417
- after do
418
- Time.zone = nil
419
- Mongoid.use_activesupport_time_zone = false
420
- end
951
+ config_override :use_activesupport_time_zone, true
952
+ # if this is actually your time zone, the following tests are useless
953
+ time_zone_override "Stockholm"
421
954
 
422
955
  it "assumes the given time is local" do
423
956
  expect(Time.mongoize(array)).to eq(