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