mongoid 5.4.1 → 6.1.1

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 (260) hide show
  1. checksums.yaml +5 -5
  2. data/README.md +3 -3
  3. data/lib/config/locales/en.yml +19 -0
  4. data/lib/mongoid.rb +4 -4
  5. data/lib/mongoid/atomic.rb +2 -2
  6. data/lib/mongoid/atomic/modifiers.rb +8 -12
  7. data/lib/mongoid/attributes.rb +22 -21
  8. data/lib/mongoid/attributes/readonly.rb +22 -0
  9. data/lib/mongoid/cacheable.rb +36 -0
  10. data/lib/mongoid/changeable.rb +36 -0
  11. data/lib/mongoid/clients.rb +8 -63
  12. data/lib/mongoid/clients/options.rb +55 -250
  13. data/lib/mongoid/clients/storage_options.rb +1 -69
  14. data/lib/mongoid/composable.rb +29 -3
  15. data/lib/mongoid/config.rb +1 -0
  16. data/lib/mongoid/contextual/atomic.rb +5 -8
  17. data/lib/mongoid/contextual/map_reduce.rb +0 -4
  18. data/lib/mongoid/contextual/memory.rb +2 -2
  19. data/lib/mongoid/contextual/mongo.rb +40 -22
  20. data/lib/mongoid/contextual/none.rb +12 -0
  21. data/lib/mongoid/copyable.rb +13 -6
  22. data/lib/mongoid/criteria.rb +5 -2
  23. data/lib/mongoid/criteria/marshalable.rb +2 -2
  24. data/lib/mongoid/criteria/modifiable.rb +17 -1
  25. data/lib/mongoid/criteria/options.rb +25 -0
  26. data/lib/mongoid/criteria/queryable.rb +87 -0
  27. data/lib/mongoid/criteria/queryable/aggregable.rb +120 -0
  28. data/lib/mongoid/criteria/queryable/extensions.rb +28 -0
  29. data/lib/mongoid/criteria/queryable/extensions/array.rb +185 -0
  30. data/lib/mongoid/criteria/queryable/extensions/big_decimal.rb +37 -0
  31. data/lib/mongoid/criteria/queryable/extensions/boolean.rb +34 -0
  32. data/lib/mongoid/criteria/queryable/extensions/date.rb +63 -0
  33. data/lib/mongoid/criteria/queryable/extensions/date_time.rb +53 -0
  34. data/lib/mongoid/criteria/queryable/extensions/hash.rb +200 -0
  35. data/lib/mongoid/criteria/queryable/extensions/nil_class.rb +86 -0
  36. data/lib/mongoid/criteria/queryable/extensions/numeric.rb +90 -0
  37. data/lib/mongoid/criteria/queryable/extensions/object.rb +206 -0
  38. data/lib/mongoid/criteria/queryable/extensions/range.rb +70 -0
  39. data/lib/mongoid/criteria/queryable/extensions/regexp.rb +79 -0
  40. data/lib/mongoid/criteria/queryable/extensions/set.rb +34 -0
  41. data/lib/mongoid/criteria/queryable/extensions/string.rb +137 -0
  42. data/lib/mongoid/criteria/queryable/extensions/symbol.rb +79 -0
  43. data/lib/mongoid/criteria/queryable/extensions/time.rb +60 -0
  44. data/lib/mongoid/criteria/queryable/extensions/time_with_zone.rb +54 -0
  45. data/lib/mongoid/criteria/queryable/forwardable.rb +65 -0
  46. data/lib/mongoid/criteria/queryable/key.rb +103 -0
  47. data/lib/mongoid/criteria/queryable/macroable.rb +27 -0
  48. data/lib/mongoid/criteria/queryable/mergeable.rb +271 -0
  49. data/lib/mongoid/criteria/queryable/optional.rb +429 -0
  50. data/lib/mongoid/criteria/queryable/options.rb +153 -0
  51. data/lib/mongoid/criteria/queryable/pipeline.rb +111 -0
  52. data/lib/mongoid/criteria/queryable/selectable.rb +662 -0
  53. data/lib/mongoid/criteria/queryable/selector.rb +212 -0
  54. data/lib/mongoid/criteria/queryable/smash.rb +104 -0
  55. data/lib/mongoid/document.rb +30 -37
  56. data/lib/mongoid/errors.rb +2 -0
  57. data/lib/mongoid/errors/ambiguous_relationship.rb +1 -1
  58. data/lib/mongoid/errors/in_memory_collation_not_supported.rb +1 -1
  59. data/lib/mongoid/errors/invalid_field.rb +2 -2
  60. data/lib/mongoid/errors/invalid_persistence_option.rb +29 -0
  61. data/lib/mongoid/errors/invalid_relation.rb +66 -0
  62. data/lib/mongoid/evolvable.rb +1 -1
  63. data/lib/mongoid/extensions.rb +0 -4
  64. data/lib/mongoid/extensions/big_decimal.rb +17 -8
  65. data/lib/mongoid/extensions/date.rb +4 -1
  66. data/lib/mongoid/extensions/decimal128.rb +3 -3
  67. data/lib/mongoid/extensions/hash.rb +1 -0
  68. data/lib/mongoid/extensions/string.rb +4 -3
  69. data/lib/mongoid/extensions/time.rb +4 -1
  70. data/lib/mongoid/fields/validators/macro.rb +18 -0
  71. data/lib/mongoid/findable.rb +2 -2
  72. data/lib/mongoid/indexable.rb +15 -13
  73. data/lib/mongoid/interceptable.rb +5 -22
  74. data/lib/mongoid/matchable.rb +13 -7
  75. data/lib/mongoid/matchable/all.rb +2 -2
  76. data/lib/mongoid/matchable/and.rb +3 -3
  77. data/lib/mongoid/matchable/default.rb +2 -2
  78. data/lib/mongoid/matchable/elem_match.rb +28 -0
  79. data/lib/mongoid/matchable/exists.rb +2 -2
  80. data/lib/mongoid/matchable/gt.rb +4 -2
  81. data/lib/mongoid/matchable/gte.rb +4 -2
  82. data/lib/mongoid/matchable/in.rb +2 -2
  83. data/lib/mongoid/matchable/lt.rb +4 -2
  84. data/lib/mongoid/matchable/lte.rb +4 -2
  85. data/lib/mongoid/matchable/ne.rb +2 -2
  86. data/lib/mongoid/matchable/nin.rb +2 -2
  87. data/lib/mongoid/matchable/or.rb +3 -3
  88. data/lib/mongoid/matchable/regexp.rb +3 -3
  89. data/lib/mongoid/matchable/size.rb +2 -2
  90. data/lib/mongoid/persistable.rb +3 -5
  91. data/lib/mongoid/persistable/creatable.rb +2 -2
  92. data/lib/mongoid/persistable/deletable.rb +1 -1
  93. data/lib/mongoid/persistable/settable.rb +1 -1
  94. data/lib/mongoid/persistable/updatable.rb +5 -12
  95. data/lib/mongoid/persistable/upsertable.rb +1 -1
  96. data/lib/mongoid/persistence_context.rb +215 -0
  97. data/lib/mongoid/query_cache.rb +3 -6
  98. data/lib/mongoid/relations/accessors.rb +3 -0
  99. data/lib/mongoid/relations/auto_save.rb +12 -4
  100. data/lib/mongoid/relations/bindings/referenced/many_to_many.rb +4 -4
  101. data/lib/mongoid/relations/counter_cache.rb +15 -5
  102. data/lib/mongoid/relations/eager.rb +6 -11
  103. data/lib/mongoid/relations/eager/base.rb +3 -3
  104. data/lib/mongoid/relations/eager/has_and_belongs_to_many.rb +2 -2
  105. data/lib/mongoid/relations/eager/has_many.rb +1 -1
  106. data/lib/mongoid/relations/embedded/batchable.rb +12 -36
  107. data/lib/mongoid/relations/embedded/in.rb +13 -1
  108. data/lib/mongoid/relations/embedded/many.rb +28 -10
  109. data/lib/mongoid/relations/embedded/one.rb +14 -1
  110. data/lib/mongoid/relations/macros.rb +9 -1
  111. data/lib/mongoid/relations/metadata.rb +3 -3
  112. data/lib/mongoid/relations/options.rb +2 -2
  113. data/lib/mongoid/relations/proxy.rb +1 -31
  114. data/lib/mongoid/relations/referenced/in.rb +19 -10
  115. data/lib/mongoid/relations/referenced/many.rb +23 -17
  116. data/lib/mongoid/relations/referenced/many_to_many.rb +20 -13
  117. data/lib/mongoid/relations/referenced/one.rb +15 -1
  118. data/lib/mongoid/relations/synchronization.rb +11 -11
  119. data/lib/mongoid/relations/touchable.rb +6 -3
  120. data/lib/mongoid/reloadable.rb +1 -1
  121. data/lib/mongoid/serializable.rb +1 -1
  122. data/lib/mongoid/traversable.rb +1 -1
  123. data/lib/mongoid/validatable/uniqueness.rb +1 -2
  124. data/lib/mongoid/version.rb +1 -1
  125. data/lib/rails/generators/mongoid/config/templates/mongoid.yml +14 -3
  126. data/spec/app/models/album.rb +5 -1
  127. data/spec/app/models/artist.rb +21 -0
  128. data/spec/app/models/book.rb +2 -1
  129. data/spec/app/models/dokument.rb +1 -0
  130. data/spec/app/models/ordered_post.rb +5 -0
  131. data/spec/app/models/oscar.rb +1 -2
  132. data/spec/app/models/page.rb +1 -1
  133. data/spec/app/models/person.rb +3 -3
  134. data/spec/app/models/princess.rb +2 -0
  135. data/spec/app/models/record.rb +1 -0
  136. data/spec/app/models/subscription.rb +1 -0
  137. data/spec/app/models/thing.rb +1 -1
  138. data/spec/config/mongoid.yml +15 -0
  139. data/spec/mongoid/atomic/modifiers_spec.rb +17 -17
  140. data/spec/mongoid/atomic_spec.rb +17 -17
  141. data/spec/mongoid/attributes/nested_spec.rb +14 -14
  142. data/spec/mongoid/attributes/readonly_spec.rb +87 -44
  143. data/spec/mongoid/attributes_spec.rb +90 -5
  144. data/spec/mongoid/cacheable_spec.rb +112 -0
  145. data/spec/mongoid/changeable_spec.rb +58 -0
  146. data/spec/mongoid/clients/factory_spec.rb +31 -3
  147. data/spec/mongoid/clients/options_spec.rb +382 -96
  148. data/spec/mongoid/clients_spec.rb +243 -101
  149. data/spec/mongoid/composable_spec.rb +7 -0
  150. data/spec/mongoid/config_spec.rb +67 -11
  151. data/spec/mongoid/contextual/atomic_spec.rb +3 -3
  152. data/spec/mongoid/contextual/mongo_spec.rb +165 -20
  153. data/spec/mongoid/contextual/none_spec.rb +15 -0
  154. data/spec/mongoid/copyable_spec.rb +13 -4
  155. data/spec/mongoid/criteria/modifiable_spec.rb +239 -7
  156. data/spec/mongoid/criteria/options_spec.rb +29 -0
  157. data/spec/mongoid/criteria/queryable/aggregable_spec.rb +370 -0
  158. data/spec/mongoid/criteria/queryable/extensions/array_spec.rb +523 -0
  159. data/spec/mongoid/criteria/queryable/extensions/big_decimal_spec.rb +59 -0
  160. data/spec/mongoid/criteria/queryable/extensions/bignum_spec.rb +58 -0
  161. data/spec/mongoid/criteria/queryable/extensions/boolean_spec.rb +213 -0
  162. data/spec/mongoid/criteria/queryable/extensions/date_spec.rb +330 -0
  163. data/spec/mongoid/criteria/queryable/extensions/date_time_spec.rb +405 -0
  164. data/spec/mongoid/criteria/queryable/extensions/fixnum_spec.rb +58 -0
  165. data/spec/mongoid/criteria/queryable/extensions/float_spec.rb +65 -0
  166. data/spec/mongoid/criteria/queryable/extensions/hash_spec.rb +327 -0
  167. data/spec/mongoid/criteria/queryable/extensions/integer_spec.rb +65 -0
  168. data/spec/mongoid/criteria/queryable/extensions/nil_class_spec.rb +77 -0
  169. data/spec/mongoid/criteria/queryable/extensions/object_spec.rb +108 -0
  170. data/spec/mongoid/criteria/queryable/extensions/range_spec.rb +309 -0
  171. data/spec/mongoid/{extensions/origin → criteria/queryable/extensions}/regexp_raw_spec.rb +2 -2
  172. data/spec/mongoid/criteria/queryable/extensions/regexp_spec.rb +90 -0
  173. data/spec/mongoid/criteria/queryable/extensions/set_spec.rb +39 -0
  174. data/spec/mongoid/criteria/queryable/extensions/string_spec.rb +302 -0
  175. data/spec/mongoid/criteria/queryable/extensions/symbol_spec.rb +167 -0
  176. data/spec/mongoid/criteria/queryable/extensions/time_spec.rb +376 -0
  177. data/spec/mongoid/criteria/queryable/extensions/time_with_zone_spec.rb +347 -0
  178. data/spec/mongoid/criteria/queryable/forwardable_spec.rb +87 -0
  179. data/spec/mongoid/criteria/queryable/key_spec.rb +52 -0
  180. data/spec/mongoid/criteria/queryable/mergeable_spec.rb +49 -0
  181. data/spec/mongoid/criteria/queryable/optional_spec.rb +1799 -0
  182. data/spec/mongoid/criteria/queryable/options_spec.rb +360 -0
  183. data/spec/mongoid/criteria/queryable/pipeline_spec.rb +200 -0
  184. data/spec/mongoid/criteria/queryable/queryable_spec.rb +137 -0
  185. data/spec/mongoid/criteria/queryable/selectable_spec.rb +4174 -0
  186. data/spec/mongoid/criteria/queryable/selector_spec.rb +844 -0
  187. data/spec/mongoid/criteria/queryable/smash_spec.rb +30 -0
  188. data/spec/mongoid/criteria_spec.rb +152 -21
  189. data/spec/mongoid/document_spec.rb +37 -88
  190. data/spec/mongoid/errors/invalid_relation_spec.rb +37 -0
  191. data/spec/mongoid/errors/mongoid_error_spec.rb +6 -3
  192. data/spec/mongoid/extensions/big_decimal_spec.rb +320 -18
  193. data/spec/mongoid/extensions/boolean_spec.rb +14 -0
  194. data/spec/mongoid/extensions/date_spec.rb +2 -6
  195. data/spec/mongoid/extensions/date_time_spec.rb +2 -6
  196. data/spec/mongoid/extensions/decimal128_spec.rb +1 -1
  197. data/spec/mongoid/extensions/float_spec.rb +8 -1
  198. data/spec/mongoid/extensions/hash_spec.rb +15 -0
  199. data/spec/mongoid/extensions/integer_spec.rb +8 -1
  200. data/spec/mongoid/extensions/object_spec.rb +11 -0
  201. data/spec/mongoid/extensions/string_spec.rb +21 -0
  202. data/spec/mongoid/extensions/time_spec.rb +2 -6
  203. data/spec/mongoid/extensions/time_with_zone_spec.rb +2 -6
  204. data/spec/mongoid/findable_spec.rb +46 -1
  205. data/spec/mongoid/indexable_spec.rb +15 -3
  206. data/spec/mongoid/interceptable_spec.rb +68 -10
  207. data/spec/mongoid/matchable/all_spec.rb +4 -4
  208. data/spec/mongoid/matchable/and_spec.rb +10 -10
  209. data/spec/mongoid/matchable/default_spec.rb +12 -12
  210. data/spec/mongoid/matchable/elem_match_spec.rb +86 -0
  211. data/spec/mongoid/matchable/exists_spec.rb +5 -5
  212. data/spec/mongoid/matchable/gt_spec.rb +18 -7
  213. data/spec/mongoid/matchable/gte_spec.rb +17 -7
  214. data/spec/mongoid/matchable/in_spec.rb +5 -5
  215. data/spec/mongoid/matchable/lt_spec.rb +18 -7
  216. data/spec/mongoid/matchable/lte_spec.rb +18 -7
  217. data/spec/mongoid/matchable/ne_spec.rb +5 -5
  218. data/spec/mongoid/matchable/nin_spec.rb +5 -5
  219. data/spec/mongoid/matchable/or_spec.rb +7 -7
  220. data/spec/mongoid/matchable/regexp_spec.rb +5 -5
  221. data/spec/mongoid/matchable/size_spec.rb +3 -3
  222. data/spec/mongoid/matchable_spec.rb +173 -53
  223. data/spec/mongoid/persistable/creatable_spec.rb +7 -2
  224. data/spec/mongoid/persistable/deletable_spec.rb +16 -1
  225. data/spec/mongoid/persistable/destroyable_spec.rb +6 -2
  226. data/spec/mongoid/persistable/savable_spec.rb +35 -30
  227. data/spec/mongoid/persistable/settable_spec.rb +45 -29
  228. data/spec/mongoid/persistable/updatable_spec.rb +184 -5
  229. data/spec/mongoid/persistence_context_spec.rb +680 -0
  230. data/spec/mongoid/positional_spec.rb +10 -10
  231. data/spec/mongoid/query_cache_spec.rb +89 -0
  232. data/spec/mongoid/relations/accessors_spec.rb +1 -1
  233. data/spec/mongoid/relations/auto_save_spec.rb +39 -6
  234. data/spec/mongoid/relations/bindings/referenced/many_to_many_spec.rb +4 -4
  235. data/spec/mongoid/relations/builders_spec.rb +37 -10
  236. data/spec/mongoid/relations/counter_cache_spec.rb +64 -3
  237. data/spec/mongoid/relations/eager/has_and_belongs_to_many_spec.rb +16 -0
  238. data/spec/mongoid/relations/eager_spec.rb +40 -0
  239. data/spec/mongoid/relations/embedded/many_spec.rb +63 -47
  240. data/spec/mongoid/relations/embedded/one_spec.rb +2 -1
  241. data/spec/mongoid/relations/macros_spec.rb +395 -7
  242. data/spec/mongoid/relations/metadata_spec.rb +15 -1
  243. data/spec/mongoid/relations/proxy_spec.rb +27 -1
  244. data/spec/mongoid/relations/referenced/in_spec.rb +41 -1
  245. data/spec/mongoid/relations/referenced/many_spec.rb +13 -25
  246. data/spec/mongoid/relations/referenced/many_to_many_spec.rb +14 -26
  247. data/spec/mongoid/relations/synchronization_spec.rb +48 -2
  248. data/spec/mongoid/relations/touchable_spec.rb +40 -0
  249. data/spec/mongoid/reloadable_spec.rb +51 -0
  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 +18 -9
  253. data/spec/mongoid/validatable_spec.rb +16 -0
  254. data/spec/spec_helper.rb +20 -11
  255. metadata +524 -469
  256. checksums.yaml.gz.sig +0 -0
  257. data.tar.gz.sig +0 -0
  258. data/lib/mongoid/clients/thread_options.rb +0 -19
  259. data/lib/mongoid/extensions/origin/regexp_raw.rb +0 -43
  260. metadata.gz.sig +0 -0
@@ -0,0 +1,523 @@
1
+ require "spec_helper"
2
+
3
+ describe Array do
4
+ describe ".evolve" do
5
+
6
+ context "when provided an Array" do
7
+
8
+ let(:array) do
9
+ [ 1, 2, 3 ]
10
+ end
11
+
12
+ it "returns an array" do
13
+ expect(described_class.evolve(array)).to eq([ 1, 2, 3 ])
14
+ end
15
+
16
+ it "doesn't mutate its argument" do
17
+ expect{ described_class.evolve(array.freeze) }.not_to raise_error
18
+ end
19
+ end
20
+
21
+ context "when provided nil" do
22
+
23
+ it "returns nil" do
24
+ expect(described_class.evolve(nil)).to be_nil
25
+ end
26
+ end
27
+
28
+ context "when provided another object" do
29
+
30
+ it "returns the object" do
31
+ expect(described_class.evolve("testing")).to eq("testing")
32
+ end
33
+ end
34
+ end
35
+
36
+ describe "#__add__" do
37
+
38
+ context "when the other object is a non-enumerable" do
39
+
40
+ context "when all values are unique" do
41
+
42
+ it "returns an array of both" do
43
+ expect([ 5, 6 ].__add__(7)).to eq([ 5, 6, 7 ])
44
+ end
45
+ end
46
+
47
+ context "when values are not unique" do
48
+
49
+ it "returns a unique array of both" do
50
+ expect([ 5, 6 ].__add__(6)).to eq([ 5, 6 ])
51
+ end
52
+ end
53
+ end
54
+
55
+ context "when the other object is an array" do
56
+
57
+ context "when all values are unique" do
58
+
59
+ it "returns an array of both" do
60
+ expect([ 4, 5 ].__add__([ 6, 7 ])).to eq([ 4, 5, 6, 7 ])
61
+ end
62
+ end
63
+
64
+ context "when values are not unique" do
65
+
66
+ it "returns a unique array of both" do
67
+ expect([ 4, 5 ].__add__([ 5, 6, 7 ])).to eq([ 4, 5, 6, 7 ])
68
+ end
69
+ end
70
+ end
71
+
72
+ context "when the other object is a hash" do
73
+
74
+ context "when all values are unique" do
75
+
76
+ it "returns a hash of both" do
77
+ expect([ 4, 5 ].__add__({ "$in" => [ 6, 7 ] })).to eq(
78
+ { "$in" => [ 4, 5, 6, 7 ] }
79
+ )
80
+ end
81
+ end
82
+
83
+ context "when values are not unique" do
84
+
85
+ it "returns a unique array of both" do
86
+ expect([ 4, 5 ].__add__({ "$in" => [ 5, 6, 7 ] })).to eq(
87
+ { "$in" => [ 4, 5, 6, 7 ] }
88
+ )
89
+ end
90
+ end
91
+ end
92
+ end
93
+
94
+ describe "#__array__" do
95
+
96
+ it "returns self" do
97
+ expect([ 1, 2, 3 ].__array__).to eq([ 1, 2, 3 ])
98
+ end
99
+ end
100
+
101
+ describe "__deep_copy__" do
102
+
103
+ let(:inner) do
104
+ [ 3, 4 ]
105
+ end
106
+
107
+ let(:array) do
108
+ [ 1, 2, inner ]
109
+ end
110
+
111
+ let(:copy) do
112
+ array.__deep_copy__
113
+ end
114
+
115
+ it "returns an equal array" do
116
+ expect(copy).to eq(array)
117
+ end
118
+
119
+ it "returns a copy" do
120
+ expect(copy).to_not equal(array)
121
+ end
122
+
123
+ it "deep copies the elements" do
124
+ expect(copy[2]).to_not equal(inner)
125
+ end
126
+ end
127
+
128
+ describe "#__evolve_date__" do
129
+
130
+ context "when the array is composed of dates" do
131
+
132
+ let(:date) do
133
+ Date.new(2010, 1, 1)
134
+ end
135
+
136
+ let(:evolved) do
137
+ [ date ].__evolve_date__
138
+ end
139
+
140
+ let(:expected) do
141
+ Time.utc(2010, 1, 1, 0, 0, 0, 0)
142
+ end
143
+
144
+ it "returns the array with evolved times" do
145
+ expect(evolved).to eq([ expected ])
146
+ end
147
+ end
148
+
149
+ context "when the array is composed of strings" do
150
+
151
+ let(:date) do
152
+ Date.parse("1st Jan 2010")
153
+ end
154
+
155
+ let(:evolved) do
156
+ [ date.to_s ].__evolve_date__
157
+ end
158
+
159
+ it "returns the strings as a times" do
160
+ expect(evolved).to eq([ Time.new(2010, 1, 1, 0, 0, 0, 0).utc ])
161
+ end
162
+ end
163
+
164
+ context "when the array is composed of integers" do
165
+
166
+ let(:time) do
167
+ Time.utc(2010, 1, 1, 0, 0, 0, 0)
168
+ end
169
+
170
+ let(:integer) do
171
+ time.to_i
172
+ end
173
+
174
+ let(:evolved) do
175
+ [ integer ].__evolve_date__
176
+ end
177
+
178
+ let(:expected) do
179
+ Time.at(integer)
180
+ end
181
+
182
+ it "returns the integers as times" do
183
+ expect(evolved).to eq([ time ])
184
+ end
185
+ end
186
+
187
+ context "when the array is composed of floats" do
188
+
189
+ let(:time) do
190
+ Time.utc(2010, 1, 1, 0, 0, 0, 0)
191
+ end
192
+
193
+ let(:float) do
194
+ time.to_f
195
+ end
196
+
197
+ let(:evolved) do
198
+ [ float ].__evolve_date__
199
+ end
200
+
201
+ let(:expected) do
202
+ Time.at(float)
203
+ end
204
+
205
+ it "returns the floats as times" do
206
+ expect(evolved).to eq([ time ])
207
+ end
208
+ end
209
+ end
210
+
211
+ describe "__evolve_time__" do
212
+
213
+ context "when the array is composed of times" do
214
+
215
+ let(:date) do
216
+ Time.new(2010, 1, 1, 12, 0, 0)
217
+ end
218
+
219
+ let(:evolved) do
220
+ [ date ].__evolve_time__
221
+ end
222
+
223
+ let(:expected) do
224
+ Time.new(2010, 1, 1, 12, 0, 0).utc
225
+ end
226
+
227
+ it "returns the array with evolved times" do
228
+ expect(evolved).to eq([ expected ])
229
+ end
230
+
231
+ it "returns utc times" do
232
+ expect(evolved.first.utc_offset).to eq(0)
233
+ end
234
+ end
235
+
236
+ context "when the array is composed of strings" do
237
+
238
+ let(:date) do
239
+ Time.parse("1st Jan 2010 12:00:00+01:00")
240
+ end
241
+
242
+ let(:evolved) do
243
+ [ date.to_s ].__evolve_time__
244
+ end
245
+
246
+ it "returns the strings as a times" do
247
+ expect(evolved).to eq([ date.to_time ])
248
+ end
249
+
250
+ it "returns the times in utc" do
251
+ expect(evolved.first.utc_offset).to eq(0)
252
+ end
253
+ end
254
+
255
+ context "when the array is composed of integers" do
256
+
257
+ let(:integer) do
258
+ 1331890719
259
+ end
260
+
261
+ let(:evolved) do
262
+ [ integer ].__evolve_time__
263
+ end
264
+
265
+ let(:expected) do
266
+ Time.at(integer).utc
267
+ end
268
+
269
+ it "returns the integers as times" do
270
+ expect(evolved).to eq([ expected ])
271
+ end
272
+
273
+ it "returns the times in utc" do
274
+ expect(evolved.first.utc_offset).to eq(0)
275
+ end
276
+ end
277
+
278
+ context "when the array is composed of floats" do
279
+
280
+ let(:float) do
281
+ 1331890719.413
282
+ end
283
+
284
+ let(:evolved) do
285
+ [ float ].__evolve_time__
286
+ end
287
+
288
+ let(:expected) do
289
+ Time.at(float).utc
290
+ end
291
+
292
+ it "returns the floats as times" do
293
+ expect(evolved).to eq([ expected ])
294
+ end
295
+
296
+ it "returns the times in utc" do
297
+ expect(evolved.first.utc_offset).to eq(0)
298
+ end
299
+ end
300
+ end
301
+
302
+ describe "#__expand_complex__" do
303
+
304
+ let(:array) do
305
+ [{ :test.in => [ "value" ] }]
306
+ end
307
+
308
+ it "expands all keys inside the array" do
309
+ expect(array.__expand_complex__).to eq([{ "test" => { "$in" => [ "value" ]}}])
310
+ end
311
+ end
312
+
313
+ describe "#__intersect__" do
314
+
315
+ context "when the other object is a non-enumerable" do
316
+
317
+ context "when the values intersect" do
318
+
319
+ it "returns an intersected array" do
320
+ expect([ 5, 6, 7 ].__intersect__(6)).to eq([ 6 ])
321
+ end
322
+ end
323
+
324
+ context "when the values do not intersect" do
325
+
326
+ it "returns an empty array" do
327
+ expect([ 5, 6, 7 ].__intersect__(8)).to be_empty
328
+ end
329
+ end
330
+ end
331
+
332
+ context "when the other object is an array" do
333
+
334
+ context "when the values intersect" do
335
+
336
+ it "returns an intersected array" do
337
+ expect([ 4, 5, 6 ].__intersect__([ 6, 7 ])).to eq([ 6 ])
338
+ end
339
+ end
340
+
341
+ context "when values do not intersect" do
342
+
343
+ it "returns an empty array" do
344
+ expect([ 4, 5 ].__intersect__([ 6, 7 ])).to be_empty
345
+ end
346
+ end
347
+ end
348
+
349
+ context "when the other object is a hash" do
350
+
351
+ context "when the values intersect" do
352
+
353
+ it "returns a hash of both" do
354
+ expect([ 4, 5 ].__intersect__({ "$in" => [ 5, 6 ] })).to eq(
355
+ { "$in" => [ 5 ] }
356
+ )
357
+ end
358
+ end
359
+
360
+ context "when values do not intersect" do
361
+
362
+ it "returns an empty array" do
363
+ expect([ 4, 5 ].__intersect__({ "$in" => [ 6, 7 ] })).to eq(
364
+ { "$in" => [] }
365
+ )
366
+ end
367
+ end
368
+ end
369
+ end
370
+
371
+ describe "#__sort_option__" do
372
+
373
+ context "when the array is one dimensional" do
374
+
375
+ it "returns a hash of sort options" do
376
+ expect([ :field, 1 ].__sort_option__).to eq({ field: 1 })
377
+ end
378
+ end
379
+
380
+ context "when the array is multi dimensional" do
381
+
382
+ it "returns a hash of sort options" do
383
+ expect([[ :field, 1 ]].__sort_option__).to eq({ field: 1 })
384
+ end
385
+ end
386
+ end
387
+
388
+ describe "#__sort_pair__" do
389
+
390
+ context "when the direction is a symbol" do
391
+
392
+ it "converts the symbol to an integer" do
393
+ expect([ :field, :asc ].__sort_pair__).to eq({ field: 1 })
394
+ end
395
+ end
396
+
397
+ context "when the direction is an integer" do
398
+
399
+ it "returns the array as a hash" do
400
+ expect([ :field, 1 ].__sort_pair__).to eq({ field: 1 })
401
+ end
402
+ end
403
+ end
404
+
405
+ describe "#__union__" do
406
+
407
+ context "when the other object is a non-enumerable" do
408
+
409
+ it "returns an unioned array" do
410
+ expect([ 5, 6, 7 ].__union__(6)).to eq([ 5, 6, 7 ])
411
+ end
412
+ end
413
+
414
+ context "when the other object is an array" do
415
+
416
+ it "returns an unioned array" do
417
+ expect([ 4, 5, 6 ].__union__([ 6, 7 ])).to eq([ 4, 5, 6, 7 ])
418
+ end
419
+ end
420
+
421
+ context "when the other object is a hash" do
422
+
423
+ it "returns a hash with a unioned array" do
424
+ expect([ 4, 5 ].__union__({ "$in" => [ 5, 6 ] })).to eq(
425
+ { "$in" => [ 4, 5, 6 ] }
426
+ )
427
+ end
428
+ end
429
+ end
430
+
431
+ describe "#__sort_option__" do
432
+
433
+ context "when the array is multi-dimensional" do
434
+
435
+ context "when the arrays have integer values" do
436
+
437
+ let(:selection) do
438
+ [[ :field_one, 1 ],[ :field_two, -1 ]]
439
+ end
440
+
441
+ it "adds the sorting criteria" do
442
+ expect(selection.__sort_option__).to eq(
443
+ { field_one: 1, field_two: -1 }
444
+ )
445
+ end
446
+ end
447
+
448
+ context "when the arrays have symbol values" do
449
+
450
+ let(:selection) do
451
+ [[ :field_one, :asc ],[ :field_two, :desc ]]
452
+ end
453
+
454
+ it "adds the sorting criteria" do
455
+ expect(selection.__sort_option__).to eq(
456
+ { field_one: 1, field_two: -1 }
457
+ )
458
+ end
459
+ end
460
+
461
+ context "when the arrays have string values" do
462
+
463
+ let(:selection) do
464
+ [[ :field_one, "asc" ],[ :field_two, "desc" ]]
465
+ end
466
+
467
+ it "adds the sorting criteria" do
468
+ expect(selection.__sort_option__).to eq(
469
+ { field_one: 1, field_two: -1 }
470
+ )
471
+ end
472
+ end
473
+ end
474
+
475
+ context "when the array is one-dimensional" do
476
+
477
+ context "when the arrays have integer values" do
478
+
479
+ let(:selection) do
480
+ [ :field_one, 1 ]
481
+ end
482
+
483
+ it "adds the sorting criteria" do
484
+ expect(selection.__sort_option__).to eq(
485
+ { field_one: 1 }
486
+ )
487
+ end
488
+ end
489
+ end
490
+
491
+ context "when the array is selectable keys" do
492
+
493
+ let(:selection) do
494
+ [ :field_one.asc, :field_two.desc ]
495
+ end
496
+
497
+ it "adds the sorting criteria" do
498
+ expect(selection.__sort_option__).to eq(
499
+ { field_one: 1, field_two: -1 }
500
+ )
501
+ end
502
+ end
503
+ end
504
+
505
+ describe "#update_values" do
506
+
507
+ let(:array) do
508
+ [ 1, 2, 3 ]
509
+ end
510
+
511
+ let(:updated) do
512
+ array.update_values(&:to_s)
513
+ end
514
+
515
+ it "replaces each of the values with the result of the block" do
516
+ expect(updated).to eq([ "1", "2", "3" ])
517
+ end
518
+
519
+ it "returns the same instance of the array" do
520
+ expect(updated).to equal(array)
521
+ end
522
+ end
523
+ end