mongoid 7.5.4 → 8.1.7

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 (442) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +3 -3
  3. data/README.md +6 -6
  4. data/Rakefile +44 -46
  5. data/lib/config/locales/en.yml +92 -43
  6. data/lib/mongoid/association/accessors.rb +44 -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 +85 -46
  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 +40 -21
  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 +16 -7
  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 +153 -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 +540 -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 +15 -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 +37 -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 +38 -9
  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 +142 -28
  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 +186 -16
  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 +48 -14
  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 +17 -13
  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 +3 -4
  205. data/lib/mongoid/traversable.rb +10 -5
  206. data/lib/mongoid/utils.rb +22 -0
  207. data/lib/mongoid/validatable/associated.rb +98 -17
  208. data/lib/mongoid/validatable/localizable.rb +1 -1
  209. data/lib/mongoid/validatable/macros.rb +5 -7
  210. data/lib/mongoid/validatable/presence.rb +2 -2
  211. data/lib/mongoid/validatable/uniqueness.rb +9 -8
  212. data/lib/mongoid/validatable.rb +17 -6
  213. data/lib/mongoid/version.rb +1 -1
  214. data/lib/mongoid/warnings.rb +19 -4
  215. data/lib/mongoid.rb +17 -3
  216. data/spec/config/mongoid.yml +16 -0
  217. data/spec/integration/app_spec.rb +24 -19
  218. data/spec/integration/associations/belongs_to_spec.rb +18 -0
  219. data/spec/integration/associations/embedded_spec.rb +15 -0
  220. data/spec/integration/associations/embeds_many_spec.rb +15 -2
  221. data/spec/integration/associations/embeds_one_spec.rb +18 -0
  222. data/spec/integration/associations/foreign_key_spec.rb +9 -0
  223. data/spec/integration/associations/has_and_belongs_to_many_spec.rb +61 -0
  224. data/spec/integration/associations/has_one_spec.rb +97 -1
  225. data/spec/integration/associations/scope_option_spec.rb +1 -1
  226. data/spec/integration/callbacks_models.rb +132 -1
  227. data/spec/integration/callbacks_spec.rb +381 -4
  228. data/spec/integration/criteria/range_spec.rb +95 -1
  229. data/spec/integration/discriminator_key_spec.rb +118 -80
  230. data/spec/integration/dots_and_dollars_spec.rb +277 -0
  231. data/spec/integration/i18n_fallbacks_spec.rb +3 -32
  232. data/spec/integration/matcher_examples_spec.rb +20 -13
  233. data/spec/integration/matcher_operator_data/type_decimal.yml +3 -2
  234. data/spec/integration/matcher_operator_spec.rb +3 -5
  235. data/spec/integration/persistence/range_field_spec.rb +350 -0
  236. data/spec/mongoid/association/counter_cache_spec.rb +1 -1
  237. data/spec/mongoid/association/depending_spec.rb +9 -9
  238. data/spec/mongoid/association/eager_spec.rb +2 -1
  239. data/spec/mongoid/association/embedded/embedded_in/binding_spec.rb +2 -1
  240. data/spec/mongoid/association/embedded/embedded_in/buildable_spec.rb +54 -0
  241. data/spec/mongoid/association/embedded/embedded_in/proxy_spec.rb +96 -9
  242. data/spec/mongoid/association/embedded/embeds_many/buildable_spec.rb +112 -0
  243. data/spec/mongoid/association/embedded/embeds_many/proxy_spec.rb +290 -65
  244. data/spec/mongoid/association/embedded/embeds_many_models.rb +37 -0
  245. data/spec/mongoid/association/embedded/embeds_many_query_spec.rb +16 -0
  246. data/spec/mongoid/association/embedded/embeds_many_spec.rb +68 -0
  247. data/spec/mongoid/association/embedded/embeds_one/buildable_spec.rb +25 -0
  248. data/spec/mongoid/association/embedded/embeds_one/proxy_spec.rb +15 -2
  249. data/spec/mongoid/association/embedded/embeds_one_models.rb +19 -0
  250. data/spec/mongoid/association/embedded/embeds_one_spec.rb +28 -0
  251. data/spec/mongoid/association/referenced/belongs_to/binding_spec.rb +2 -1
  252. data/spec/mongoid/association/referenced/belongs_to/buildable_spec.rb +54 -0
  253. data/spec/mongoid/association/referenced/belongs_to/proxy_spec.rb +19 -0
  254. data/spec/mongoid/association/referenced/belongs_to_models.rb +11 -0
  255. data/spec/mongoid/association/referenced/belongs_to_spec.rb +4 -20
  256. data/spec/mongoid/association/referenced/has_and_belongs_to_many/proxy_spec.rb +186 -229
  257. data/spec/mongoid/association/referenced/has_and_belongs_to_many_models.rb +25 -0
  258. data/spec/mongoid/association/referenced/has_and_belongs_to_many_spec.rb +35 -2
  259. data/spec/mongoid/association/referenced/has_many/buildable_spec.rb +109 -0
  260. data/spec/mongoid/association/referenced/has_many/enumerable_spec.rb +2 -56
  261. data/spec/mongoid/association/referenced/has_many/proxy_spec.rb +215 -177
  262. data/spec/mongoid/association/referenced/has_many_models.rb +3 -1
  263. data/spec/mongoid/association/referenced/has_many_spec.rb +25 -0
  264. data/spec/mongoid/association/referenced/has_one/buildable_spec.rb +2 -2
  265. data/spec/mongoid/association/referenced/has_one/proxy_spec.rb +107 -1
  266. data/spec/mongoid/association/referenced/has_one_models.rb +16 -0
  267. data/spec/mongoid/association/syncable_spec.rb +15 -1
  268. data/spec/mongoid/atomic/paths_spec.rb +0 -14
  269. data/spec/mongoid/attributes/nested_spec.rb +80 -11
  270. data/spec/mongoid/attributes/nested_spec_models.rb +48 -0
  271. data/spec/mongoid/attributes/projector_spec.rb +1 -5
  272. data/spec/mongoid/attributes_spec.rb +526 -33
  273. data/spec/mongoid/changeable_spec.rb +429 -37
  274. data/spec/mongoid/clients/factory_spec.rb +23 -30
  275. data/spec/mongoid/clients/sessions_spec.rb +0 -38
  276. data/spec/mongoid/clients_spec.rb +149 -15
  277. data/spec/mongoid/collection_configurable_spec.rb +158 -0
  278. data/spec/mongoid/config/defaults_spec.rb +160 -0
  279. data/spec/mongoid/config_spec.rb +214 -31
  280. data/spec/mongoid/contextual/aggregable/memory_spec.rb +396 -158
  281. data/spec/mongoid/contextual/aggregable/memory_table.yml +88 -0
  282. data/spec/mongoid/contextual/aggregable/memory_table_spec.rb +62 -0
  283. data/spec/mongoid/contextual/map_reduce_spec.rb +2 -16
  284. data/spec/mongoid/contextual/memory_spec.rb +850 -88
  285. data/spec/mongoid/contextual/mongo/documents_loader_spec.rb +187 -0
  286. data/spec/mongoid/contextual/mongo_spec.rb +2256 -1005
  287. data/spec/mongoid/contextual/none_spec.rb +60 -21
  288. data/spec/mongoid/copyable_spec.rb +453 -11
  289. data/spec/mongoid/criteria/findable_spec.rb +86 -210
  290. data/spec/mongoid/criteria/includable_spec.rb +1492 -0
  291. data/spec/mongoid/criteria/includable_spec_models.rb +54 -0
  292. data/spec/mongoid/criteria/marshalable_spec.rb +18 -1
  293. data/spec/mongoid/criteria/queryable/extensions/array_spec.rb +7 -19
  294. data/spec/mongoid/criteria/queryable/extensions/big_decimal_spec.rb +134 -26
  295. data/spec/mongoid/criteria/queryable/extensions/date_spec.rb +11 -0
  296. data/spec/mongoid/criteria/queryable/extensions/date_time_spec.rb +11 -0
  297. data/spec/mongoid/criteria/queryable/extensions/hash_spec.rb +0 -15
  298. data/spec/mongoid/criteria/queryable/extensions/numeric_spec.rb +73 -7
  299. data/spec/mongoid/criteria/queryable/extensions/string_spec.rb +4 -69
  300. data/spec/mongoid/criteria/queryable/extensions/symbol_spec.rb +0 -59
  301. data/spec/mongoid/criteria/queryable/extensions/time_spec.rb +11 -0
  302. data/spec/mongoid/criteria/queryable/extensions/time_with_zone_spec.rb +11 -0
  303. data/spec/mongoid/criteria/queryable/optional_spec.rb +15 -484
  304. data/spec/mongoid/criteria/queryable/options_spec.rb +1 -1
  305. data/spec/mongoid/criteria/queryable/selectable_logical_spec.rb +469 -0
  306. data/spec/mongoid/criteria/queryable/selectable_spec.rb +78 -86
  307. data/spec/mongoid/criteria/queryable/selector_spec.rb +15 -3
  308. data/spec/mongoid/criteria/translator_spec.rb +132 -0
  309. data/spec/mongoid/criteria_projection_spec.rb +1 -5
  310. data/spec/mongoid/criteria_spec.rb +469 -1205
  311. data/spec/mongoid/document_fields_spec.rb +173 -24
  312. data/spec/mongoid/document_spec.rb +32 -41
  313. data/spec/mongoid/errors/document_not_found_spec.rb +29 -2
  314. data/spec/mongoid/errors/invalid_field_spec.rb +1 -1
  315. data/spec/mongoid/errors/invalid_field_type_spec.rb +55 -0
  316. data/spec/mongoid/errors/mongoid_error_spec.rb +3 -1
  317. data/spec/mongoid/errors/no_environment_spec.rb +3 -3
  318. data/spec/mongoid/errors/readonly_document_spec.rb +2 -2
  319. data/spec/mongoid/errors/too_many_nested_attribute_records_spec.rb +1 -1
  320. data/spec/mongoid/extensions/array_spec.rb +16 -2
  321. data/spec/mongoid/extensions/big_decimal_spec.rb +712 -212
  322. data/spec/mongoid/extensions/binary_spec.rb +44 -9
  323. data/spec/mongoid/extensions/boolean_spec.rb +68 -82
  324. data/spec/mongoid/extensions/date_class_mongoize_spec.rb +7 -3
  325. data/spec/mongoid/extensions/date_spec.rb +71 -1
  326. data/spec/mongoid/extensions/date_time_spec.rb +15 -9
  327. data/spec/mongoid/extensions/float_spec.rb +53 -74
  328. data/spec/mongoid/extensions/hash_spec.rb +33 -3
  329. data/spec/mongoid/extensions/integer_spec.rb +50 -64
  330. data/spec/mongoid/extensions/range_spec.rb +255 -54
  331. data/spec/mongoid/extensions/regexp_spec.rb +58 -33
  332. data/spec/mongoid/extensions/set_spec.rb +106 -0
  333. data/spec/mongoid/extensions/string_spec.rb +53 -25
  334. data/spec/mongoid/extensions/symbol_spec.rb +18 -25
  335. data/spec/mongoid/extensions/time_spec.rb +639 -106
  336. data/spec/mongoid/extensions/time_with_zone_spec.rb +24 -83
  337. data/spec/mongoid/factory_spec.rb +61 -1
  338. data/spec/mongoid/fields/localized_spec.rb +80 -37
  339. data/spec/mongoid/fields_spec.rb +503 -87
  340. data/spec/mongoid/findable_spec.rb +450 -58
  341. data/spec/mongoid/indexable/specification_spec.rb +2 -2
  342. data/spec/mongoid/indexable_spec.rb +55 -30
  343. data/spec/mongoid/interceptable_spec.rb +824 -22
  344. data/spec/mongoid/interceptable_spec_models.rb +235 -4
  345. data/spec/mongoid/matcher/extract_attribute_spec.rb +1 -5
  346. data/spec/mongoid/mongoizable_spec.rb +285 -0
  347. data/spec/mongoid/persistable/creatable_spec.rb +2 -2
  348. data/spec/mongoid/persistable/deletable_spec.rb +28 -8
  349. data/spec/mongoid/persistable/destroyable_spec.rb +28 -8
  350. data/spec/mongoid/persistable/incrementable_spec.rb +37 -0
  351. data/spec/mongoid/persistable/logical_spec.rb +37 -0
  352. data/spec/mongoid/persistable/poppable_spec.rb +36 -0
  353. data/spec/mongoid/persistable/pullable_spec.rb +72 -0
  354. data/spec/mongoid/persistable/pushable_spec.rb +72 -0
  355. data/spec/mongoid/persistable/renamable_spec.rb +36 -0
  356. data/spec/mongoid/persistable/savable_spec.rb +96 -0
  357. data/spec/mongoid/persistable/settable_spec.rb +37 -0
  358. data/spec/mongoid/persistable/unsettable_spec.rb +36 -0
  359. data/spec/mongoid/persistable/updatable_spec.rb +20 -28
  360. data/spec/mongoid/persistable/upsertable_spec.rb +89 -1
  361. data/spec/mongoid/persistence_context_spec.rb +31 -57
  362. data/spec/mongoid/query_cache_middleware_spec.rb +0 -18
  363. data/spec/mongoid/query_cache_spec.rb +56 -215
  364. data/spec/mongoid/reloadable_spec.rb +83 -6
  365. data/spec/mongoid/scopable_spec.rb +91 -1
  366. data/spec/mongoid/serializable_spec.rb +25 -39
  367. data/spec/mongoid/shardable_spec.rb +4 -4
  368. data/spec/mongoid/stateful_spec.rb +150 -8
  369. data/spec/mongoid/tasks/database_rake_spec.rb +74 -0
  370. data/spec/mongoid/tasks/database_spec.rb +127 -0
  371. data/spec/mongoid/timestamps_spec.rb +392 -4
  372. data/spec/mongoid/timestamps_spec_models.rb +67 -0
  373. data/spec/mongoid/touchable_spec.rb +390 -2
  374. data/spec/mongoid/touchable_spec_models.rb +14 -8
  375. data/spec/mongoid/traversable_spec.rb +13 -35
  376. data/spec/mongoid/validatable/associated_spec.rb +27 -34
  377. data/spec/mongoid/validatable/presence_spec.rb +1 -1
  378. data/spec/mongoid/validatable/uniqueness_spec.rb +58 -31
  379. data/spec/mongoid/warnings_spec.rb +35 -0
  380. data/spec/mongoid_spec.rb +34 -16
  381. data/spec/rails/controller_extension/controller_runtime_spec.rb +2 -2
  382. data/spec/rails/mongoid_spec.rb +4 -16
  383. data/spec/spec_helper.rb +5 -0
  384. data/spec/support/constraints.rb +24 -0
  385. data/spec/support/immutable_ids.rb +118 -0
  386. data/spec/support/macros.rb +78 -0
  387. data/spec/support/models/artist.rb +0 -1
  388. data/spec/support/models/augmentation.rb +12 -0
  389. data/spec/support/models/band.rb +5 -0
  390. data/spec/support/models/book.rb +1 -0
  391. data/spec/support/models/building.rb +2 -0
  392. data/spec/support/models/catalog.rb +24 -0
  393. data/spec/support/models/circus.rb +3 -0
  394. data/spec/support/models/cover.rb +10 -0
  395. data/spec/support/models/fanatic.rb +8 -0
  396. data/spec/support/models/implant.rb +9 -0
  397. data/spec/support/models/label.rb +2 -0
  398. data/spec/support/models/lat_lng.rb +6 -0
  399. data/spec/support/models/name.rb +10 -0
  400. data/spec/support/models/passport.rb +9 -0
  401. data/spec/support/models/person.rb +2 -0
  402. data/spec/support/models/player.rb +2 -0
  403. data/spec/support/models/powerup.rb +12 -0
  404. data/spec/support/models/product.rb +1 -0
  405. data/spec/support/models/purse.rb +9 -0
  406. data/spec/support/models/registry.rb +1 -0
  407. data/spec/support/models/school.rb +14 -0
  408. data/spec/support/models/shield.rb +18 -0
  409. data/spec/support/models/student.rb +14 -0
  410. data/spec/support/models/weapon.rb +12 -0
  411. metadata +101 -96
  412. checksums.yaml.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
  418. data/spec/shared/LICENSE +0 -20
  419. data/spec/shared/bin/get-mongodb-download-url +0 -17
  420. data/spec/shared/bin/s3-copy +0 -45
  421. data/spec/shared/bin/s3-upload +0 -69
  422. data/spec/shared/lib/mrss/child_process_helper.rb +0 -80
  423. data/spec/shared/lib/mrss/cluster_config.rb +0 -231
  424. data/spec/shared/lib/mrss/constraints.rb +0 -378
  425. data/spec/shared/lib/mrss/docker_runner.rb +0 -291
  426. data/spec/shared/lib/mrss/eg_config_utils.rb +0 -51
  427. data/spec/shared/lib/mrss/event_subscriber.rb +0 -210
  428. data/spec/shared/lib/mrss/lite_constraints.rb +0 -238
  429. data/spec/shared/lib/mrss/server_version_registry.rb +0 -120
  430. data/spec/shared/lib/mrss/session_registry.rb +0 -69
  431. data/spec/shared/lib/mrss/session_registry_legacy.rb +0 -60
  432. data/spec/shared/lib/mrss/spec_organizer.rb +0 -179
  433. data/spec/shared/lib/mrss/utils.rb +0 -15
  434. data/spec/shared/share/Dockerfile.erb +0 -325
  435. data/spec/shared/share/haproxy-1.conf +0 -16
  436. data/spec/shared/share/haproxy-2.conf +0 -17
  437. data/spec/shared/shlib/config.sh +0 -27
  438. data/spec/shared/shlib/distro.sh +0 -74
  439. data/spec/shared/shlib/server.sh +0 -392
  440. data/spec/shared/shlib/set_env.sh +0 -169
  441. data.tar.gz.sig +0 -0
  442. metadata.gz.sig +0 -3
@@ -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(