mongoid 5.4.1 → 6.0.0.beta

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 (264) hide show
  1. checksums.yaml +5 -5
  2. checksums.yaml.gz.sig +0 -0
  3. data.tar.gz.sig +0 -0
  4. data/lib/config/locales/en.yml +23 -16
  5. data/lib/mongoid.rb +4 -9
  6. data/lib/mongoid/atomic.rb +1 -1
  7. data/lib/mongoid/atomic/modifiers.rb +8 -12
  8. data/lib/mongoid/attributes.rb +9 -11
  9. data/lib/mongoid/attributes/dynamic.rb +5 -6
  10. data/lib/mongoid/attributes/nested.rb +1 -1
  11. data/lib/mongoid/attributes/processing.rb +4 -0
  12. data/lib/mongoid/attributes/readonly.rb +22 -0
  13. data/lib/mongoid/cacheable.rb +36 -0
  14. data/lib/mongoid/changeable.rb +37 -1
  15. data/lib/mongoid/clients.rb +0 -63
  16. data/lib/mongoid/clients/factory.rb +0 -2
  17. data/lib/mongoid/clients/options.rb +54 -249
  18. data/lib/mongoid/clients/storage_options.rb +1 -69
  19. data/lib/mongoid/composable.rb +26 -2
  20. data/lib/mongoid/config.rb +1 -1
  21. data/lib/mongoid/config/options.rb +1 -1
  22. data/lib/mongoid/contextual/aggregable/mongo.rb +1 -0
  23. data/lib/mongoid/contextual/atomic.rb +6 -9
  24. data/lib/mongoid/contextual/geo_near.rb +2 -3
  25. data/lib/mongoid/contextual/map_reduce.rb +97 -24
  26. data/lib/mongoid/contextual/memory.rb +7 -4
  27. data/lib/mongoid/contextual/mongo.rb +63 -54
  28. data/lib/mongoid/contextual/none.rb +2 -2
  29. data/lib/mongoid/copyable.rb +19 -19
  30. data/lib/mongoid/criteria.rb +5 -4
  31. data/lib/mongoid/criteria/findable.rb +2 -3
  32. data/lib/mongoid/criteria/includable.rb +63 -16
  33. data/lib/mongoid/criteria/marshalable.rb +2 -2
  34. data/lib/mongoid/criteria/modifiable.rb +17 -1
  35. data/lib/mongoid/criteria/options.rb +25 -0
  36. data/lib/mongoid/criteria/queryable.rb +86 -0
  37. data/lib/mongoid/criteria/queryable/aggregable.rb +120 -0
  38. data/lib/mongoid/criteria/queryable/extensions.rb +28 -0
  39. data/lib/mongoid/criteria/queryable/extensions/array.rb +185 -0
  40. data/lib/mongoid/criteria/queryable/extensions/big_decimal.rb +37 -0
  41. data/lib/mongoid/criteria/queryable/extensions/boolean.rb +34 -0
  42. data/lib/mongoid/criteria/queryable/extensions/date.rb +63 -0
  43. data/lib/mongoid/criteria/queryable/extensions/date_time.rb +53 -0
  44. data/lib/mongoid/criteria/queryable/extensions/hash.rb +200 -0
  45. data/lib/mongoid/criteria/queryable/extensions/nil_class.rb +86 -0
  46. data/lib/mongoid/criteria/queryable/extensions/numeric.rb +90 -0
  47. data/lib/mongoid/criteria/queryable/extensions/object.rb +206 -0
  48. data/lib/mongoid/criteria/queryable/extensions/range.rb +70 -0
  49. data/lib/mongoid/criteria/queryable/extensions/regexp.rb +45 -0
  50. data/lib/mongoid/criteria/queryable/extensions/set.rb +34 -0
  51. data/lib/mongoid/criteria/queryable/extensions/string.rb +137 -0
  52. data/lib/mongoid/criteria/queryable/extensions/symbol.rb +79 -0
  53. data/lib/mongoid/criteria/queryable/extensions/time.rb +60 -0
  54. data/lib/mongoid/criteria/queryable/extensions/time_with_zone.rb +54 -0
  55. data/lib/mongoid/criteria/queryable/forwardable.rb +65 -0
  56. data/lib/mongoid/criteria/queryable/key.rb +103 -0
  57. data/lib/mongoid/criteria/queryable/macroable.rb +27 -0
  58. data/lib/mongoid/criteria/queryable/mergeable.rb +271 -0
  59. data/lib/mongoid/criteria/queryable/optional.rb +411 -0
  60. data/lib/mongoid/criteria/queryable/options.rb +136 -0
  61. data/lib/mongoid/criteria/queryable/pipeline.rb +111 -0
  62. data/lib/mongoid/criteria/queryable/selectable.rb +662 -0
  63. data/lib/mongoid/criteria/queryable/selector.rb +196 -0
  64. data/lib/mongoid/criteria/queryable/smash.rb +103 -0
  65. data/lib/mongoid/document.rb +9 -23
  66. data/lib/mongoid/errors.rb +2 -1
  67. data/lib/mongoid/errors/ambiguous_relationship.rb +1 -1
  68. data/lib/mongoid/errors/delete_restriction.rb +2 -2
  69. data/lib/mongoid/errors/invalid_field.rb +2 -2
  70. data/lib/mongoid/errors/invalid_persistence_option.rb +29 -0
  71. data/lib/mongoid/errors/invalid_relation.rb +66 -0
  72. data/lib/mongoid/errors/inverse_not_found.rb +1 -1
  73. data/lib/mongoid/errors/mongoid_error.rb +1 -1
  74. data/lib/mongoid/evolvable.rb +1 -1
  75. data/lib/mongoid/extensions.rb +0 -5
  76. data/lib/mongoid/extensions/big_decimal.rb +17 -8
  77. data/lib/mongoid/extensions/date.rb +4 -1
  78. data/lib/mongoid/extensions/hash.rb +2 -3
  79. data/lib/mongoid/extensions/object.rb +2 -2
  80. data/lib/mongoid/extensions/string.rb +4 -3
  81. data/lib/mongoid/extensions/time.rb +5 -2
  82. data/lib/mongoid/factory.rb +1 -0
  83. data/lib/mongoid/fields/foreign_key.rb +2 -2
  84. data/lib/mongoid/fields/localized.rb +3 -8
  85. data/lib/mongoid/fields/validators/macro.rb +18 -0
  86. data/lib/mongoid/findable.rb +3 -3
  87. data/lib/mongoid/indexable.rb +17 -16
  88. data/lib/mongoid/indexable/specification.rb +1 -1
  89. data/lib/mongoid/indexable/validators/options.rb +1 -2
  90. data/lib/mongoid/interceptable.rb +6 -17
  91. data/lib/mongoid/loggable.rb +1 -1
  92. data/lib/mongoid/matchable.rb +3 -10
  93. data/lib/mongoid/matchable/gt.rb +2 -0
  94. data/lib/mongoid/matchable/gte.rb +2 -0
  95. data/lib/mongoid/matchable/lt.rb +2 -0
  96. data/lib/mongoid/matchable/lte.rb +2 -0
  97. data/lib/mongoid/persistable.rb +6 -5
  98. data/lib/mongoid/persistable/creatable.rb +2 -0
  99. data/lib/mongoid/persistable/deletable.rb +7 -3
  100. data/lib/mongoid/persistable/settable.rb +3 -16
  101. data/lib/mongoid/persistable/updatable.rb +10 -12
  102. data/lib/mongoid/persistence_context.rb +216 -0
  103. data/lib/mongoid/query_cache.rb +5 -30
  104. data/lib/mongoid/relations/accessors.rb +6 -2
  105. data/lib/mongoid/relations/auto_save.rb +12 -4
  106. data/lib/mongoid/relations/bindings/embedded/in.rb +4 -0
  107. data/lib/mongoid/relations/bindings/embedded/many.rb +8 -1
  108. data/lib/mongoid/relations/bindings/embedded/one.rb +10 -0
  109. data/lib/mongoid/relations/bindings/referenced/many.rb +4 -0
  110. data/lib/mongoid/relations/builders.rb +2 -2
  111. data/lib/mongoid/relations/builders/embedded/one.rb +1 -1
  112. data/lib/mongoid/relations/builders/nested_attributes/many.rb +1 -1
  113. data/lib/mongoid/relations/conversions.rb +1 -1
  114. data/lib/mongoid/relations/counter_cache.rb +28 -18
  115. data/lib/mongoid/relations/eager.rb +19 -7
  116. data/lib/mongoid/relations/eager/base.rb +5 -5
  117. data/lib/mongoid/relations/embedded/batchable.rb +9 -33
  118. data/lib/mongoid/relations/embedded/in.rb +16 -2
  119. data/lib/mongoid/relations/embedded/many.rb +23 -8
  120. data/lib/mongoid/relations/embedded/one.rb +17 -2
  121. data/lib/mongoid/relations/macros.rb +9 -2
  122. data/lib/mongoid/relations/metadata.rb +3 -3
  123. data/lib/mongoid/relations/nested_builder.rb +1 -1
  124. data/lib/mongoid/relations/options.rb +2 -2
  125. data/lib/mongoid/relations/proxy.rb +2 -33
  126. data/lib/mongoid/relations/referenced/in.rb +23 -11
  127. data/lib/mongoid/relations/referenced/many.rb +24 -16
  128. data/lib/mongoid/relations/referenced/many_to_many.rb +20 -13
  129. data/lib/mongoid/relations/referenced/one.rb +17 -1
  130. data/lib/mongoid/relations/reflections.rb +3 -5
  131. data/lib/mongoid/relations/touchable.rb +1 -1
  132. data/lib/mongoid/reloadable.rb +1 -1
  133. data/lib/mongoid/scopable.rb +3 -3
  134. data/lib/mongoid/serializable.rb +2 -3
  135. data/lib/mongoid/tasks/database.rb +1 -2
  136. data/lib/mongoid/threaded.rb +4 -4
  137. data/lib/mongoid/traversable.rb +1 -1
  138. data/lib/mongoid/validatable.rb +1 -1
  139. data/lib/mongoid/validatable/macros.rb +2 -4
  140. data/lib/mongoid/validatable/uniqueness.rb +1 -2
  141. data/lib/mongoid/version.rb +1 -1
  142. data/lib/rails/generators/mongoid/config/templates/mongoid.yml +4 -7
  143. data/spec/app/models/album.rb +5 -1
  144. data/spec/app/models/artist.rb +21 -0
  145. data/spec/app/models/band.rb +0 -1
  146. data/spec/app/models/church.rb +0 -2
  147. data/spec/app/models/ordered_post.rb +5 -0
  148. data/spec/app/models/oscar.rb +1 -2
  149. data/spec/app/models/person.rb +3 -1
  150. data/spec/app/models/post.rb +0 -1
  151. data/spec/app/models/princess.rb +2 -0
  152. data/spec/app/models/record.rb +1 -0
  153. data/spec/app/models/thing.rb +1 -1
  154. data/spec/config/mongoid.yml +1 -5
  155. data/spec/mongoid/atomic/modifiers_spec.rb +17 -17
  156. data/spec/mongoid/atomic_spec.rb +17 -17
  157. data/spec/mongoid/attributes/nested_spec.rb +14 -14
  158. data/spec/mongoid/attributes/readonly_spec.rb +87 -44
  159. data/spec/mongoid/attributes_spec.rb +63 -0
  160. data/spec/mongoid/cacheable_spec.rb +112 -0
  161. data/spec/mongoid/changeable_spec.rb +58 -0
  162. data/spec/mongoid/clients/factory_spec.rb +3 -11
  163. data/spec/mongoid/clients/options_spec.rb +378 -96
  164. data/spec/mongoid/clients_spec.rb +207 -170
  165. data/spec/mongoid/composable_spec.rb +7 -0
  166. data/spec/mongoid/config_spec.rb +41 -21
  167. data/spec/mongoid/contextual/atomic_spec.rb +77 -343
  168. data/spec/mongoid/contextual/map_reduce_spec.rb +119 -111
  169. data/spec/mongoid/contextual/memory_spec.rb +56 -316
  170. data/spec/mongoid/contextual/mongo_spec.rb +104 -378
  171. data/spec/mongoid/copyable_spec.rb +8 -15
  172. data/spec/mongoid/criteria/modifiable_spec.rb +239 -7
  173. data/spec/mongoid/criteria/options_spec.rb +29 -0
  174. data/spec/mongoid/criteria/queryable/aggregable_spec.rb +370 -0
  175. data/spec/mongoid/criteria/queryable/extensions/array_spec.rb +523 -0
  176. data/spec/mongoid/criteria/queryable/extensions/big_decimal_spec.rb +59 -0
  177. data/spec/mongoid/criteria/queryable/extensions/bignum_spec.rb +58 -0
  178. data/spec/mongoid/criteria/queryable/extensions/boolean_spec.rb +213 -0
  179. data/spec/mongoid/criteria/queryable/extensions/date_spec.rb +330 -0
  180. data/spec/mongoid/criteria/queryable/extensions/date_time_spec.rb +405 -0
  181. data/spec/mongoid/criteria/queryable/extensions/fixnum_spec.rb +58 -0
  182. data/spec/mongoid/criteria/queryable/extensions/float_spec.rb +65 -0
  183. data/spec/mongoid/criteria/queryable/extensions/hash_spec.rb +327 -0
  184. data/spec/mongoid/criteria/queryable/extensions/integer_spec.rb +65 -0
  185. data/spec/mongoid/criteria/queryable/extensions/nil_class_spec.rb +77 -0
  186. data/spec/mongoid/criteria/queryable/extensions/object_spec.rb +108 -0
  187. data/spec/mongoid/criteria/queryable/extensions/range_spec.rb +309 -0
  188. data/spec/mongoid/{extensions/origin/regexp_raw_spec.rb → criteria/queryable/extensions/regexp_spec.rb} +21 -20
  189. data/spec/mongoid/criteria/queryable/extensions/set_spec.rb +39 -0
  190. data/spec/mongoid/criteria/queryable/extensions/string_spec.rb +302 -0
  191. data/spec/mongoid/criteria/queryable/extensions/symbol_spec.rb +167 -0
  192. data/spec/mongoid/criteria/queryable/extensions/time_spec.rb +376 -0
  193. data/spec/mongoid/criteria/queryable/extensions/time_with_zone_spec.rb +347 -0
  194. data/spec/mongoid/criteria/queryable/forwardable_spec.rb +87 -0
  195. data/spec/mongoid/criteria/queryable/key_spec.rb +52 -0
  196. data/spec/mongoid/criteria/queryable/mergeable_spec.rb +49 -0
  197. data/spec/mongoid/criteria/queryable/optional_spec.rb +1786 -0
  198. data/spec/mongoid/criteria/queryable/options_spec.rb +360 -0
  199. data/spec/mongoid/criteria/queryable/pipeline_spec.rb +200 -0
  200. data/spec/mongoid/criteria/queryable/queryable_spec.rb +137 -0
  201. data/spec/mongoid/criteria/queryable/selectable_spec.rb +4159 -0
  202. data/spec/mongoid/criteria/queryable/selector_spec.rb +778 -0
  203. data/spec/mongoid/criteria/queryable/smash_spec.rb +30 -0
  204. data/spec/mongoid/criteria_spec.rb +45 -63
  205. data/spec/mongoid/document_spec.rb +21 -88
  206. data/spec/mongoid/errors/invalid_relation_spec.rb +37 -0
  207. data/spec/mongoid/errors/mongoid_error_spec.rb +6 -3
  208. data/spec/mongoid/extensions/big_decimal_spec.rb +320 -18
  209. data/spec/mongoid/extensions/date_spec.rb +2 -6
  210. data/spec/mongoid/extensions/date_time_spec.rb +2 -6
  211. data/spec/mongoid/extensions/float_spec.rb +8 -1
  212. data/spec/mongoid/extensions/integer_spec.rb +8 -1
  213. data/spec/mongoid/extensions/object_spec.rb +11 -0
  214. data/spec/mongoid/extensions/string_spec.rb +21 -0
  215. data/spec/mongoid/extensions/time_spec.rb +4 -8
  216. data/spec/mongoid/extensions/time_with_zone_spec.rb +2 -6
  217. data/spec/mongoid/fields/localized_spec.rb +0 -91
  218. data/spec/mongoid/findable_spec.rb +46 -1
  219. data/spec/mongoid/indexable_spec.rb +6 -46
  220. data/spec/mongoid/interceptable_spec.rb +49 -10
  221. data/spec/mongoid/matchable/gt_spec.rb +11 -0
  222. data/spec/mongoid/matchable/gte_spec.rb +10 -0
  223. data/spec/mongoid/matchable/lt_spec.rb +11 -0
  224. data/spec/mongoid/matchable/lte_spec.rb +11 -0
  225. data/spec/mongoid/matchable_spec.rb +1 -51
  226. data/spec/mongoid/persistable/creatable_spec.rb +2 -2
  227. data/spec/mongoid/persistable/deletable_spec.rb +1 -1
  228. data/spec/mongoid/persistable/destroyable_spec.rb +6 -2
  229. data/spec/mongoid/persistable/savable_spec.rb +30 -30
  230. data/spec/mongoid/persistable/settable_spec.rb +0 -185
  231. data/spec/mongoid/persistable/updatable_spec.rb +166 -5
  232. data/spec/mongoid/persistence_context_spec.rb +654 -0
  233. data/spec/mongoid/positional_spec.rb +10 -10
  234. data/spec/mongoid/query_cache_spec.rb +89 -65
  235. data/spec/mongoid/relations/accessors_spec.rb +1 -1
  236. data/spec/mongoid/relations/auto_save_spec.rb +39 -6
  237. data/spec/mongoid/relations/builders_spec.rb +37 -10
  238. data/spec/mongoid/relations/counter_cache_spec.rb +64 -15
  239. data/spec/mongoid/relations/cyclic_spec.rb +0 -22
  240. data/spec/mongoid/relations/embedded/many_spec.rb +9 -41
  241. data/spec/mongoid/relations/embedded/one_spec.rb +2 -1
  242. data/spec/mongoid/relations/macros_spec.rb +395 -7
  243. data/spec/mongoid/relations/proxy_spec.rb +3 -1
  244. data/spec/mongoid/relations/referenced/in_spec.rb +41 -1
  245. data/spec/mongoid/relations/referenced/many_spec.rb +6 -29
  246. data/spec/mongoid/relations/referenced/many_to_many_spec.rb +6 -29
  247. data/spec/mongoid/relations/reflections_spec.rb +9 -9
  248. data/spec/mongoid/reloadable_spec.rb +51 -0
  249. data/spec/mongoid/scopable_spec.rb +0 -12
  250. data/spec/mongoid/serializable_spec.rb +0 -50
  251. data/spec/mongoid/validatable/presence_spec.rb +1 -1
  252. data/spec/mongoid/validatable/uniqueness_spec.rb +16 -9
  253. data/spec/mongoid/validatable_spec.rb +16 -0
  254. data/spec/spec_helper.rb +10 -10
  255. metadata +536 -479
  256. metadata.gz.sig +0 -0
  257. data/lib/mongoid/clients/thread_options.rb +0 -19
  258. data/lib/mongoid/errors/in_memory_collation_not_supported.rb +0 -20
  259. data/lib/mongoid/extensions/decimal128.rb +0 -39
  260. data/lib/mongoid/extensions/origin/regexp_raw.rb +0 -43
  261. data/lib/mongoid/matchable/regexp.rb +0 -27
  262. data/spec/app/models/post_genre.rb +0 -6
  263. data/spec/mongoid/extensions/decimal128_spec.rb +0 -44
  264. data/spec/mongoid/matchable/regexp_spec.rb +0 -59
@@ -2,16 +2,64 @@ require "spec_helper"
2
2
 
3
3
  describe Mongoid::Extensions::BigDecimal do
4
4
 
5
- let(:number) do
5
+ let(:big_decimal) do
6
6
  BigDecimal.new("123456.789")
7
7
  end
8
8
 
9
9
  describe ".demongoize" do
10
10
 
11
- context "when the the value is a string" do
11
+ context "when the value is an empty String" do
12
12
 
13
- it "returns a big decimal" do
14
- expect(BigDecimal.demongoize(number.to_s)).to eq(number)
13
+ let(:string) do
14
+ ""
15
+ end
16
+
17
+ it "returns nil" do
18
+ expect(BigDecimal.demongoize(string)).to be_nil
19
+ end
20
+ end
21
+
22
+ context "when the value is a numeric String" do
23
+
24
+ let(:string) do
25
+ "123456.789"
26
+ end
27
+
28
+ it "returns a BigDecimal" do
29
+ expect(BigDecimal.demongoize(string)).to eq(BigDecimal.new(string))
30
+ end
31
+ end
32
+
33
+ context "when the value is the numeric String zero" do
34
+
35
+ let(:string) do
36
+ "0.0"
37
+ end
38
+
39
+ it "returns a BigDecimal" do
40
+ expect(BigDecimal.demongoize(string)).to eq(BigDecimal.new(string))
41
+ end
42
+ end
43
+
44
+ context "when the value is the numeric String negative zero" do
45
+
46
+ let(:string) do
47
+ "-0.0"
48
+ end
49
+
50
+ it "returns a BigDecimal" do
51
+ expect(BigDecimal.demongoize(string)).to eq(BigDecimal.new(string))
52
+ end
53
+ end
54
+
55
+ context "when the value is a non-numeric String" do
56
+
57
+ let(:string) do
58
+ "1a2"
59
+ end
60
+
61
+ it "returns nil" do
62
+ expect(BigDecimal.demongoize(string)).to be_nil
15
63
  end
16
64
  end
17
65
 
@@ -22,18 +70,29 @@ describe Mongoid::Extensions::BigDecimal do
22
70
  end
23
71
  end
24
72
 
25
- context "when the value is a float" do
73
+ context "when the value is true" do
26
74
 
27
- let(:float) do
28
- 123456.789
75
+ let(:value) do
76
+ true
29
77
  end
30
78
 
31
- it "returns a float" do
32
- expect(BigDecimal.demongoize(float)).to eq(float)
79
+ it "returns nil" do
80
+ expect(BigDecimal.demongoize(value)).to be_nil
33
81
  end
34
82
  end
35
83
 
36
- context "when the value is an integer" do
84
+ context "when the value is false" do
85
+
86
+ let(:value) do
87
+ false
88
+ end
89
+
90
+ it "returns nil" do
91
+ expect(BigDecimal.demongoize(value)).to be_nil
92
+ end
93
+ end
94
+
95
+ context "when the value is an Integer" do
37
96
 
38
97
  let(:integer) do
39
98
  123456
@@ -44,7 +103,18 @@ describe Mongoid::Extensions::BigDecimal do
44
103
  end
45
104
  end
46
105
 
47
- context "when the value is NaN" do
106
+ context "when the value is a Float" do
107
+
108
+ let(:float) do
109
+ 123456.789
110
+ end
111
+
112
+ it "returns a float" do
113
+ expect(BigDecimal.demongoize(float)).to eq(float)
114
+ end
115
+ end
116
+
117
+ context "when the value is the String 'NaN'" do
48
118
 
49
119
  let(:nan) do
50
120
  "NaN"
@@ -54,22 +124,126 @@ describe Mongoid::Extensions::BigDecimal do
54
124
  BigDecimal.demongoize(nan)
55
125
  end
56
126
 
57
- it "returns a big decimal" do
127
+ it "returns a BigDecimal" do
58
128
  expect(demongoized).to be_a(BigDecimal)
59
129
  end
60
130
 
61
- it "is a NaN big decimal" do
131
+ it "is a NaN BigDecimal" do
62
132
  expect(demongoized).to be_nan
63
133
  end
64
134
  end
135
+
136
+ context "when the value is the String 'Infinity'" do
137
+
138
+ let(:infinity) do
139
+ "Infinity"
140
+ end
141
+
142
+ let(:demongoized) do
143
+ BigDecimal.demongoize(infinity)
144
+ end
145
+
146
+ it "returns a BigDecimal" do
147
+ expect(demongoized).to be_a(BigDecimal)
148
+ end
149
+
150
+ it "is a infinity BigDecimal" do
151
+ expect(demongoized.infinite?).to eq 1
152
+ end
153
+ end
154
+
155
+ context "when the value is the String '-Infinity'" do
156
+
157
+ let(:neg_infinity) do
158
+ "-Infinity"
159
+ end
160
+
161
+ let(:demongoized) do
162
+ BigDecimal.demongoize(neg_infinity)
163
+ end
164
+
165
+ it "returns a BigDecimal" do
166
+ expect(demongoized).to be_a(BigDecimal)
167
+ end
168
+
169
+ it "is a negative infinity BigDecimal" do
170
+ expect(demongoized.infinite?).to eq -1
171
+ end
172
+ end
65
173
  end
66
174
 
67
175
  describe ".mongoize" do
68
176
 
69
- context "when the value is a big decimal" do
177
+ context "when the value is a BigDecimal" do
70
178
 
71
179
  it "returns a string" do
72
- expect(BigDecimal.mongoize(number)).to eq(number.to_s)
180
+ expect(BigDecimal.mongoize(big_decimal)).to eq(big_decimal.to_s)
181
+ end
182
+ end
183
+
184
+ context "when the value is the BigDecimal zero" do
185
+
186
+ let(:big_decimal) do
187
+ BigDecimal.new("0.0")
188
+ end
189
+
190
+ it "returns a BigDecimal" do
191
+ expect(BigDecimal.mongoize(big_decimal)).to eq(big_decimal.to_s)
192
+ end
193
+ end
194
+
195
+ context "when the value is the BigDecimal negative zero" do
196
+
197
+ let(:big_decimal) do
198
+ BigDecimal.new("-0.0")
199
+ end
200
+
201
+ it "returns a BigDecimal" do
202
+ expect(BigDecimal.mongoize(big_decimal)).to eq(big_decimal.to_s)
203
+ end
204
+ end
205
+
206
+ context "when the value is an empty String" do
207
+
208
+ let(:string) do
209
+ ""
210
+ end
211
+
212
+ it "returns nil" do
213
+ expect(BigDecimal.mongoize(string)).to be_nil
214
+ end
215
+ end
216
+
217
+ context "when the value is an integer numeric String" do
218
+
219
+ let(:string) do
220
+ "123456"
221
+ end
222
+
223
+ it "returns the String" do
224
+ expect(BigDecimal.mongoize(string)).to eq string
225
+ end
226
+ end
227
+
228
+ context "when the value is a float numeric String" do
229
+
230
+ let(:string) do
231
+ "123456.789"
232
+ end
233
+
234
+ it "returns the String" do
235
+ expect(BigDecimal.mongoize(string)).to eq string
236
+ end
237
+ end
238
+
239
+ context "when the value is a non-numeric String" do
240
+
241
+ let(:string) do
242
+ "1a2"
243
+ end
244
+
245
+ it "returns nil" do
246
+ expect(BigDecimal.mongoize(string)).to be_nil
73
247
  end
74
248
  end
75
249
 
@@ -80,25 +254,153 @@ describe Mongoid::Extensions::BigDecimal do
80
254
  end
81
255
  end
82
256
 
83
- context "when the value is an integer" do
257
+ context "when the value is true" do
258
+
259
+ let(:value) do
260
+ true
261
+ end
262
+
263
+ it "returns nil" do
264
+ expect(BigDecimal.mongoize(value)).to be_nil
265
+ end
266
+ end
267
+
268
+ context "when the value is false" do
269
+
270
+ let(:value) do
271
+ false
272
+ end
273
+
274
+ it "returns nil" do
275
+ expect(BigDecimal.mongoize(value)).to be_nil
276
+ end
277
+ end
278
+
279
+ context "when the value is an Integer" do
84
280
 
85
281
  it "returns a string" do
86
282
  expect(BigDecimal.mongoize(123456)).to eq("123456")
87
283
  end
88
284
  end
89
285
 
90
- context "when the value is a float" do
286
+ context "when the value is a Float" do
91
287
 
92
288
  it "returns a string" do
93
289
  expect(BigDecimal.mongoize(123456.789)).to eq("123456.789")
94
290
  end
95
291
  end
292
+
293
+ context "when the value is String NaN" do
294
+
295
+ let(:nan) do
296
+ "NaN"
297
+ end
298
+
299
+ it "returns a String" do
300
+ expect(BigDecimal.mongoize(nan)).to eq("NaN")
301
+ end
302
+ end
303
+
304
+ context "when the value is String Infinity" do
305
+
306
+ let(:infinity) do
307
+ "Infinity"
308
+ end
309
+
310
+ it "returns a String" do
311
+ expect(BigDecimal.mongoize(infinity)).to eq("Infinity")
312
+ end
313
+ end
314
+
315
+ context "when the value is String negative Infinity" do
316
+
317
+ let(:neg_infinity) do
318
+ "-Infinity"
319
+ end
320
+
321
+ it "returns a String" do
322
+ expect(BigDecimal.mongoize(neg_infinity)).to eq("-Infinity")
323
+ end
324
+ end
325
+
326
+ context "when the value is BigDecimal NaN" do
327
+
328
+ let(:nan) do
329
+ BigDecimal.new("NaN")
330
+ end
331
+
332
+ it "returns a String" do
333
+ expect(BigDecimal.mongoize(nan)).to eq("NaN")
334
+ end
335
+ end
336
+
337
+ context "when the value is BigDecimal Infinity" do
338
+
339
+ let(:infinity) do
340
+ BigDecimal.new("Infinity")
341
+ end
342
+
343
+ it "returns a String" do
344
+ expect(BigDecimal.mongoize(infinity)).to eq("Infinity")
345
+ end
346
+ end
347
+
348
+ context "when the value is BigDecimal negative Infinity" do
349
+
350
+ let(:neg_infinity) do
351
+ BigDecimal.new("-Infinity")
352
+ end
353
+
354
+ it "returns a String" do
355
+ expect(BigDecimal.mongoize(neg_infinity)).to eq("-Infinity")
356
+ end
357
+ end
358
+
359
+ context "when the value is the constant Float::NAN" do
360
+
361
+ let(:nan) do
362
+ Float::NAN
363
+ end
364
+
365
+ it "returns a String" do
366
+ expect(BigDecimal.mongoize(nan)).to eq("NaN")
367
+ end
368
+ end
369
+
370
+ context "when the value is constant Float::INFINITY" do
371
+
372
+ let(:infinity) do
373
+ Float::INFINITY
374
+ end
375
+
376
+ it "returns a String" do
377
+ expect(BigDecimal.mongoize(infinity)).to eq("Infinity")
378
+ end
379
+ end
380
+
381
+ context "when the value is constant Float::INFINITY * -1" do
382
+
383
+ let(:neg_infinity) do
384
+ Float::INFINITY * -1
385
+ end
386
+
387
+ it "returns a String" do
388
+ expect(BigDecimal.mongoize(neg_infinity)).to eq("-Infinity")
389
+ end
390
+ end
96
391
  end
97
392
 
98
393
  describe "#mongoize" do
99
394
 
100
395
  it "returns a string" do
101
- expect(number.mongoize).to eq(number.to_s)
396
+ expect(big_decimal.mongoize).to eq(big_decimal.to_s)
397
+ end
398
+ end
399
+
400
+ describe "#numeric?" do
401
+
402
+ it "returns true" do
403
+ expect(big_decimal.numeric?).to eq(true)
102
404
  end
103
405
  end
104
406
  end
@@ -135,12 +135,8 @@ describe Mongoid::Extensions::Date do
135
135
 
136
136
  context "when the string is an invalid time" do
137
137
 
138
- let(:epoch) do
139
- Date.new(1970, 1, 1)
140
- end
141
-
142
- it "returns epoch" do
143
- expect(Date.mongoize("time")).to eq(epoch)
138
+ it "returns nil" do
139
+ expect(Date.mongoize("time")).to eq(nil)
144
140
  end
145
141
  end
146
142
  end
@@ -129,12 +129,8 @@ describe Mongoid::Extensions::DateTime do
129
129
 
130
130
  context "when the string is an invalid time" do
131
131
 
132
- let(:epoch) do
133
- Time.utc(1970, 1, 1, 0, 0, 0, 0)
134
- end
135
-
136
- it "returns epoch" do
137
- expect(DateTime.mongoize("time")).to eq(epoch)
132
+ it "returns nil" do
133
+ expect(DateTime.mongoize("time")).to eq(nil)
138
134
  end
139
135
  end
140
136
  end
@@ -23,7 +23,7 @@ describe Mongoid::Extensions::Float do
23
23
 
24
24
  describe ".demongoize" do
25
25
 
26
- context "when the the value is a float" do
26
+ context "when the value is a float" do
27
27
 
28
28
  it "returns a float" do
29
29
  expect(Float.demongoize(number)).to eq(number)
@@ -144,4 +144,11 @@ describe Mongoid::Extensions::Float do
144
144
  expect(number.mongoize).to eq(number)
145
145
  end
146
146
  end
147
+
148
+ describe "#numeric?" do
149
+
150
+ it "returns true" do
151
+ expect(number.numeric?).to eq(true)
152
+ end
153
+ end
147
154
  end