mongoid 7.5.4 → 8.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (298) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data/README.md +3 -3
  4. data/Rakefile +0 -25
  5. data/lib/config/locales/en.yml +46 -30
  6. data/lib/mongoid/association/accessors.rb +32 -3
  7. data/lib/mongoid/association/bindable.rb +48 -0
  8. data/lib/mongoid/association/builders.rb +4 -2
  9. data/lib/mongoid/association/eager_loadable.rb +29 -7
  10. data/lib/mongoid/association/embedded/batchable.rb +28 -5
  11. data/lib/mongoid/association/embedded/embedded_in/binding.rb +24 -2
  12. data/lib/mongoid/association/embedded/embedded_in.rb +2 -1
  13. data/lib/mongoid/association/embedded/embeds_many/binding.rb +1 -0
  14. data/lib/mongoid/association/embedded/embeds_many/buildable.rb +1 -1
  15. data/lib/mongoid/association/embedded/embeds_many/proxy.rb +40 -18
  16. data/lib/mongoid/association/embedded/embeds_one/buildable.rb +18 -4
  17. data/lib/mongoid/association/embedded/embeds_one/proxy.rb +21 -2
  18. data/lib/mongoid/association/macros.rb +2 -1
  19. data/lib/mongoid/association/many.rb +5 -0
  20. data/lib/mongoid/association/nested/many.rb +2 -1
  21. data/lib/mongoid/association/proxy.rb +12 -0
  22. data/lib/mongoid/association/referenced/auto_save.rb +3 -2
  23. data/lib/mongoid/association/referenced/belongs_to/binding.rb +1 -0
  24. data/lib/mongoid/association/referenced/belongs_to/buildable.rb +1 -1
  25. data/lib/mongoid/association/referenced/belongs_to.rb +1 -1
  26. data/lib/mongoid/association/referenced/counter_cache.rb +8 -8
  27. data/lib/mongoid/association/referenced/has_and_belongs_to_many/proxy.rb +64 -11
  28. data/lib/mongoid/association/referenced/has_and_belongs_to_many.rb +4 -1
  29. data/lib/mongoid/association/referenced/has_many/enumerable.rb +10 -18
  30. data/lib/mongoid/association/referenced/has_many/proxy.rb +12 -9
  31. data/lib/mongoid/association/referenced/has_one/buildable.rb +1 -1
  32. data/lib/mongoid/association/referenced/has_one/proxy.rb +8 -11
  33. data/lib/mongoid/association/referenced/syncable.rb +2 -2
  34. data/lib/mongoid/association/relatable.rb +38 -4
  35. data/lib/mongoid/attributes/processing.rb +9 -2
  36. data/lib/mongoid/attributes.rb +30 -27
  37. data/lib/mongoid/cacheable.rb +2 -2
  38. data/lib/mongoid/changeable.rb +37 -2
  39. data/lib/mongoid/clients/options.rb +4 -0
  40. data/lib/mongoid/clients/sessions.rb +2 -14
  41. data/lib/mongoid/config.rb +15 -11
  42. data/lib/mongoid/contextual/aggregable/memory.rb +23 -15
  43. data/lib/mongoid/contextual/aggregable/mongo.rb +1 -1
  44. data/lib/mongoid/contextual/map_reduce.rb +2 -2
  45. data/lib/mongoid/contextual/memory.rb +55 -28
  46. data/lib/mongoid/contextual/mongo.rb +173 -262
  47. data/lib/mongoid/contextual/none.rb +33 -15
  48. data/lib/mongoid/copyable.rb +32 -8
  49. data/lib/mongoid/criteria/includable.rb +24 -20
  50. data/lib/mongoid/criteria/marshalable.rb +10 -2
  51. data/lib/mongoid/criteria/queryable/extensions/array.rb +2 -15
  52. data/lib/mongoid/criteria/queryable/extensions/big_decimal.rb +25 -4
  53. data/lib/mongoid/criteria/queryable/extensions/boolean.rb +1 -1
  54. data/lib/mongoid/criteria/queryable/extensions/date.rb +6 -1
  55. data/lib/mongoid/criteria/queryable/extensions/date_time.rb +6 -1
  56. data/lib/mongoid/criteria/queryable/extensions/hash.rb +0 -16
  57. data/lib/mongoid/criteria/queryable/extensions/numeric.rb +1 -1
  58. data/lib/mongoid/criteria/queryable/extensions/object.rb +2 -1
  59. data/lib/mongoid/criteria/queryable/extensions/range.rb +13 -5
  60. data/lib/mongoid/criteria/queryable/extensions/regexp.rb +1 -1
  61. data/lib/mongoid/criteria/queryable/extensions/symbol.rb +3 -1
  62. data/lib/mongoid/criteria/queryable/extensions/time.rb +6 -1
  63. data/lib/mongoid/criteria/queryable/extensions/time_with_zone.rb +6 -1
  64. data/lib/mongoid/criteria/queryable/optional.rb +3 -9
  65. data/lib/mongoid/criteria/queryable/options.rb +1 -1
  66. data/lib/mongoid/criteria/queryable/selectable.rb +2 -24
  67. data/lib/mongoid/criteria/queryable/selector.rb +90 -5
  68. data/lib/mongoid/criteria/queryable/smash.rb +39 -6
  69. data/lib/mongoid/criteria/queryable/storable.rb +1 -1
  70. data/lib/mongoid/criteria/queryable.rb +11 -6
  71. data/lib/mongoid/criteria.rb +1 -28
  72. data/lib/mongoid/deprecable.rb +36 -0
  73. data/lib/mongoid/deprecation.rb +25 -0
  74. data/lib/mongoid/document.rb +88 -33
  75. data/lib/mongoid/equality.rb +4 -4
  76. data/lib/mongoid/errors/document_not_found.rb +6 -2
  77. data/lib/mongoid/errors/invalid_dot_dollar_assignment.rb +23 -0
  78. data/lib/mongoid/errors/invalid_field.rb +5 -1
  79. data/lib/mongoid/errors/invalid_field_type.rb +26 -0
  80. data/lib/mongoid/errors/too_many_nested_attribute_records.rb +1 -1
  81. data/lib/mongoid/errors.rb +2 -2
  82. data/lib/mongoid/extensions/array.rb +8 -6
  83. data/lib/mongoid/extensions/big_decimal.rb +29 -10
  84. data/lib/mongoid/extensions/binary.rb +42 -0
  85. data/lib/mongoid/extensions/boolean.rb +8 -2
  86. data/lib/mongoid/extensions/date.rb +26 -20
  87. data/lib/mongoid/extensions/date_time.rb +1 -1
  88. data/lib/mongoid/extensions/float.rb +4 -5
  89. data/lib/mongoid/extensions/hash.rb +12 -5
  90. data/lib/mongoid/extensions/integer.rb +4 -5
  91. data/lib/mongoid/extensions/object.rb +2 -0
  92. data/lib/mongoid/extensions/range.rb +41 -10
  93. data/lib/mongoid/extensions/regexp.rb +11 -4
  94. data/lib/mongoid/extensions/set.rb +11 -4
  95. data/lib/mongoid/extensions/string.rb +2 -13
  96. data/lib/mongoid/extensions/symbol.rb +3 -14
  97. data/lib/mongoid/extensions/time.rb +27 -16
  98. data/lib/mongoid/extensions/time_with_zone.rb +1 -2
  99. data/lib/mongoid/extensions.rb +1 -0
  100. data/lib/mongoid/factory.rb +42 -7
  101. data/lib/mongoid/fields/foreign_key.rb +7 -0
  102. data/lib/mongoid/fields/validators/macro.rb +3 -9
  103. data/lib/mongoid/fields.rb +49 -7
  104. data/lib/mongoid/findable.rb +21 -16
  105. data/lib/mongoid/indexable/specification.rb +1 -1
  106. data/lib/mongoid/indexable/validators/options.rb +4 -1
  107. data/lib/mongoid/interceptable.rb +69 -9
  108. data/lib/mongoid/persistable/creatable.rb +14 -5
  109. data/lib/mongoid/persistable/updatable.rb +12 -5
  110. data/lib/mongoid/persistence_context.rb +8 -42
  111. data/lib/mongoid/query_cache.rb +6 -258
  112. data/lib/mongoid/railties/controller_runtime.rb +1 -1
  113. data/lib/mongoid/reloadable.rb +7 -3
  114. data/lib/mongoid/scopable.rb +9 -11
  115. data/lib/mongoid/selectable.rb +1 -2
  116. data/lib/mongoid/shardable.rb +11 -35
  117. data/lib/mongoid/stateful.rb +27 -1
  118. data/lib/mongoid/timestamps/created.rb +1 -1
  119. data/lib/mongoid/timestamps/updated.rb +1 -1
  120. data/lib/mongoid/touchable.rb +2 -3
  121. data/lib/mongoid/traversable.rb +1 -0
  122. data/lib/mongoid/validatable/uniqueness.rb +2 -1
  123. data/lib/mongoid/version.rb +1 -1
  124. data/lib/mongoid/warnings.rb +3 -4
  125. data/lib/mongoid.rb +1 -0
  126. data/spec/config/mongoid.yml +16 -0
  127. data/spec/integration/app_spec.rb +8 -12
  128. data/spec/integration/associations/belongs_to_spec.rb +18 -0
  129. data/spec/integration/associations/embedded_spec.rb +15 -0
  130. data/spec/integration/associations/embeds_many_spec.rb +15 -2
  131. data/spec/integration/associations/embeds_one_spec.rb +18 -0
  132. data/spec/integration/associations/foreign_key_spec.rb +9 -0
  133. data/spec/integration/associations/has_and_belongs_to_many_spec.rb +21 -0
  134. data/spec/integration/associations/has_one_spec.rb +97 -1
  135. data/spec/integration/associations/scope_option_spec.rb +1 -1
  136. data/spec/integration/callbacks_models.rb +95 -1
  137. data/spec/integration/callbacks_spec.rb +226 -4
  138. data/spec/integration/criteria/range_spec.rb +95 -1
  139. data/spec/integration/discriminator_key_spec.rb +115 -76
  140. data/spec/integration/dots_and_dollars_spec.rb +277 -0
  141. data/spec/integration/i18n_fallbacks_spec.rb +1 -15
  142. data/spec/integration/matcher_examples_spec.rb +20 -13
  143. data/spec/integration/matcher_operator_data/type_decimal.yml +3 -2
  144. data/spec/integration/matcher_operator_spec.rb +3 -5
  145. data/spec/integration/persistence/range_field_spec.rb +350 -0
  146. data/spec/mongoid/association/counter_cache_spec.rb +1 -1
  147. data/spec/mongoid/association/depending_spec.rb +9 -9
  148. data/spec/mongoid/association/eager_spec.rb +2 -1
  149. data/spec/mongoid/association/embedded/embedded_in/binding_spec.rb +2 -1
  150. data/spec/mongoid/association/embedded/embedded_in/buildable_spec.rb +54 -0
  151. data/spec/mongoid/association/embedded/embedded_in/proxy_spec.rb +69 -9
  152. data/spec/mongoid/association/embedded/embeds_many/buildable_spec.rb +112 -0
  153. data/spec/mongoid/association/embedded/embeds_many/proxy_spec.rb +198 -8
  154. data/spec/mongoid/association/embedded/embeds_many_models.rb +36 -0
  155. data/spec/mongoid/association/embedded/embeds_many_query_spec.rb +12 -0
  156. data/spec/mongoid/association/embedded/embeds_many_spec.rb +68 -0
  157. data/spec/mongoid/association/embedded/embeds_one/buildable_spec.rb +25 -0
  158. data/spec/mongoid/association/embedded/embeds_one_models.rb +19 -0
  159. data/spec/mongoid/association/embedded/embeds_one_spec.rb +28 -0
  160. data/spec/mongoid/association/referenced/belongs_to/binding_spec.rb +2 -1
  161. data/spec/mongoid/association/referenced/belongs_to/buildable_spec.rb +54 -0
  162. data/spec/mongoid/association/referenced/belongs_to/proxy_spec.rb +15 -0
  163. data/spec/mongoid/association/referenced/belongs_to_models.rb +11 -0
  164. data/spec/mongoid/association/referenced/belongs_to_spec.rb +2 -2
  165. data/spec/mongoid/association/referenced/has_and_belongs_to_many/proxy_spec.rb +38 -5
  166. data/spec/mongoid/association/referenced/has_and_belongs_to_many_models.rb +25 -0
  167. data/spec/mongoid/association/referenced/has_and_belongs_to_many_spec.rb +35 -2
  168. data/spec/mongoid/association/referenced/has_many/buildable_spec.rb +109 -0
  169. data/spec/mongoid/association/referenced/has_many/enumerable_spec.rb +2 -56
  170. data/spec/mongoid/association/referenced/has_many/proxy_spec.rb +62 -13
  171. data/spec/mongoid/association/referenced/has_many_models.rb +3 -1
  172. data/spec/mongoid/association/referenced/has_many_spec.rb +25 -0
  173. data/spec/mongoid/association/referenced/has_one/buildable_spec.rb +2 -2
  174. data/spec/mongoid/association/referenced/has_one/proxy_spec.rb +107 -1
  175. data/spec/mongoid/association/referenced/has_one_models.rb +16 -0
  176. data/spec/mongoid/association/syncable_spec.rb +14 -0
  177. data/spec/mongoid/atomic/paths_spec.rb +0 -14
  178. data/spec/mongoid/attributes/nested_spec.rb +80 -11
  179. data/spec/mongoid/attributes/nested_spec_models.rb +48 -0
  180. data/spec/mongoid/attributes/projector_spec.rb +1 -5
  181. data/spec/mongoid/attributes_spec.rb +480 -27
  182. data/spec/mongoid/cacheable_spec.rb +3 -3
  183. data/spec/mongoid/changeable_spec.rb +130 -13
  184. data/spec/mongoid/clients/factory_spec.rb +23 -30
  185. data/spec/mongoid/clients/sessions_spec.rb +0 -38
  186. data/spec/mongoid/clients_spec.rb +2 -2
  187. data/spec/mongoid/config_spec.rb +52 -14
  188. data/spec/mongoid/contextual/aggregable/memory_spec.rb +396 -158
  189. data/spec/mongoid/contextual/aggregable/memory_table.yml +88 -0
  190. data/spec/mongoid/contextual/aggregable/memory_table_spec.rb +62 -0
  191. data/spec/mongoid/contextual/map_reduce_spec.rb +2 -16
  192. data/spec/mongoid/contextual/memory_spec.rb +521 -14
  193. data/spec/mongoid/contextual/mongo_spec.rb +566 -416
  194. data/spec/mongoid/contextual/none_spec.rb +11 -19
  195. data/spec/mongoid/copyable_spec.rb +451 -1
  196. data/spec/mongoid/criteria/findable_spec.rb +86 -210
  197. data/spec/mongoid/criteria/includable_spec.rb +1492 -0
  198. data/spec/mongoid/criteria/includable_spec_models.rb +54 -0
  199. data/spec/mongoid/criteria/marshalable_spec.rb +18 -1
  200. data/spec/mongoid/criteria/queryable/extensions/array_spec.rb +7 -19
  201. data/spec/mongoid/criteria/queryable/extensions/big_decimal_spec.rb +134 -26
  202. data/spec/mongoid/criteria/queryable/extensions/date_spec.rb +11 -0
  203. data/spec/mongoid/criteria/queryable/extensions/date_time_spec.rb +11 -0
  204. data/spec/mongoid/criteria/queryable/extensions/hash_spec.rb +0 -15
  205. data/spec/mongoid/criteria/queryable/extensions/numeric_spec.rb +73 -7
  206. data/spec/mongoid/criteria/queryable/extensions/time_spec.rb +11 -0
  207. data/spec/mongoid/criteria/queryable/extensions/time_with_zone_spec.rb +11 -0
  208. data/spec/mongoid/criteria/queryable/optional_spec.rb +0 -484
  209. data/spec/mongoid/criteria/queryable/selectable_logical_spec.rb +50 -0
  210. data/spec/mongoid/criteria/queryable/selectable_spec.rb +77 -85
  211. data/spec/mongoid/criteria/queryable/selector_spec.rb +16 -77
  212. data/spec/mongoid/criteria/queryable/storable_spec.rb +0 -72
  213. data/spec/mongoid/criteria_spec.rb +469 -1201
  214. data/spec/mongoid/document_fields_spec.rb +173 -24
  215. data/spec/mongoid/document_spec.rb +32 -41
  216. data/spec/mongoid/equality_spec.rb +12 -12
  217. data/spec/mongoid/errors/document_not_found_spec.rb +29 -2
  218. data/spec/mongoid/errors/invalid_field_spec.rb +1 -1
  219. data/spec/mongoid/errors/invalid_field_type_spec.rb +55 -0
  220. data/spec/mongoid/errors/mongoid_error_spec.rb +3 -1
  221. data/spec/mongoid/errors/no_environment_spec.rb +3 -3
  222. data/spec/mongoid/errors/too_many_nested_attribute_records_spec.rb +1 -1
  223. data/spec/mongoid/extensions/array_spec.rb +16 -2
  224. data/spec/mongoid/extensions/big_decimal_spec.rb +697 -212
  225. data/spec/mongoid/extensions/binary_spec.rb +44 -9
  226. data/spec/mongoid/extensions/boolean_spec.rb +68 -82
  227. data/spec/mongoid/extensions/date_class_mongoize_spec.rb +7 -3
  228. data/spec/mongoid/extensions/date_spec.rb +71 -1
  229. data/spec/mongoid/extensions/date_time_spec.rb +15 -9
  230. data/spec/mongoid/extensions/float_spec.rb +48 -76
  231. data/spec/mongoid/extensions/hash_spec.rb +30 -0
  232. data/spec/mongoid/extensions/integer_spec.rb +45 -66
  233. data/spec/mongoid/extensions/range_spec.rb +255 -54
  234. data/spec/mongoid/extensions/regexp_spec.rb +58 -33
  235. data/spec/mongoid/extensions/set_spec.rb +106 -0
  236. data/spec/mongoid/extensions/string_spec.rb +53 -25
  237. data/spec/mongoid/extensions/symbol_spec.rb +18 -25
  238. data/spec/mongoid/extensions/time_spec.rb +634 -66
  239. data/spec/mongoid/extensions/time_with_zone_spec.rb +17 -31
  240. data/spec/mongoid/factory_spec.rb +61 -1
  241. data/spec/mongoid/fields_spec.rb +321 -50
  242. data/spec/mongoid/findable_spec.rb +64 -29
  243. data/spec/mongoid/indexable/specification_spec.rb +2 -2
  244. data/spec/mongoid/indexable_spec.rb +16 -19
  245. data/spec/mongoid/interceptable_spec.rb +584 -5
  246. data/spec/mongoid/interceptable_spec_models.rb +235 -4
  247. data/spec/mongoid/matcher/extract_attribute_spec.rb +1 -5
  248. data/spec/mongoid/mongoizable_spec.rb +285 -0
  249. data/spec/mongoid/persistable/creatable_spec.rb +2 -2
  250. data/spec/mongoid/persistable/deletable_spec.rb +2 -2
  251. data/spec/mongoid/persistable/destroyable_spec.rb +2 -2
  252. data/spec/mongoid/persistable/upsertable_spec.rb +14 -0
  253. data/spec/mongoid/persistence_context_spec.rb +24 -0
  254. data/spec/mongoid/query_cache_middleware_spec.rb +0 -18
  255. data/spec/mongoid/query_cache_spec.rb +0 -154
  256. data/spec/mongoid/reloadable_spec.rb +35 -2
  257. data/spec/mongoid/scopable_spec.rb +36 -34
  258. data/spec/mongoid/shardable_models.rb +0 -14
  259. data/spec/mongoid/shardable_spec.rb +61 -153
  260. data/spec/mongoid/stateful_spec.rb +28 -0
  261. data/spec/mongoid/timestamps_spec.rb +390 -0
  262. data/spec/mongoid/timestamps_spec_models.rb +67 -0
  263. data/spec/mongoid/touchable_spec.rb +116 -0
  264. data/spec/mongoid/touchable_spec_models.rb +12 -8
  265. data/spec/mongoid/traversable_spec.rb +4 -11
  266. data/spec/mongoid/validatable/presence_spec.rb +1 -1
  267. data/spec/mongoid/validatable/uniqueness_spec.rb +60 -31
  268. data/spec/mongoid/warnings_spec.rb +35 -0
  269. data/spec/mongoid_spec.rb +1 -7
  270. data/spec/rails/controller_extension/controller_runtime_spec.rb +2 -2
  271. data/spec/rails/mongoid_spec.rb +4 -16
  272. data/spec/shared/lib/mrss/event_subscriber.rb +5 -15
  273. data/spec/shared/lib/mrss/lite_constraints.rb +0 -8
  274. data/spec/shared/shlib/server.sh +5 -5
  275. data/spec/support/constraints.rb +24 -0
  276. data/spec/support/macros.rb +30 -0
  277. data/spec/support/models/augmentation.rb +12 -0
  278. data/spec/support/models/band.rb +3 -0
  279. data/spec/support/models/catalog.rb +24 -0
  280. data/spec/support/models/circus.rb +3 -0
  281. data/spec/support/models/fanatic.rb +8 -0
  282. data/spec/support/models/implant.rb +9 -0
  283. data/spec/support/models/label.rb +2 -0
  284. data/spec/support/models/passport.rb +9 -0
  285. data/spec/support/models/person.rb +1 -0
  286. data/spec/support/models/player.rb +2 -0
  287. data/spec/support/models/powerup.rb +12 -0
  288. data/spec/support/models/registry.rb +1 -0
  289. data/spec/support/models/school.rb +14 -0
  290. data/spec/support/models/shield.rb +18 -0
  291. data/spec/support/models/student.rb +14 -0
  292. data/spec/support/models/weapon.rb +12 -0
  293. data.tar.gz.sig +0 -0
  294. metadata +689 -657
  295. metadata.gz.sig +0 -0
  296. data/lib/mongoid/errors/eager_load.rb +0 -23
  297. data/lib/mongoid/errors/invalid_value.rb +0 -17
  298. 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