mongoid 5.4.0 → 6.4.8

Sign up to get free protection for your applications and to get access to all the features.
Files changed (301) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data/README.md +3 -3
  4. data/Rakefile +26 -0
  5. data/lib/config/locales/en.yml +40 -0
  6. data/lib/mongoid/atomic/modifiers.rb +2 -2
  7. data/lib/mongoid/atomic.rb +5 -5
  8. data/lib/mongoid/attributes/readonly.rb +22 -0
  9. data/lib/mongoid/attributes.rb +22 -21
  10. data/lib/mongoid/cacheable.rb +36 -0
  11. data/lib/mongoid/changeable.rb +36 -0
  12. data/lib/mongoid/clients/options.rb +55 -250
  13. data/lib/mongoid/clients/sessions.rb +113 -0
  14. data/lib/mongoid/clients/storage_options.rb +2 -69
  15. data/lib/mongoid/clients.rb +10 -63
  16. data/lib/mongoid/composable.rb +29 -2
  17. data/lib/mongoid/config.rb +1 -0
  18. data/lib/mongoid/contextual/aggregable/mongo.rb +1 -1
  19. data/lib/mongoid/contextual/atomic.rb +4 -4
  20. data/lib/mongoid/contextual/map_reduce.rb +7 -3
  21. data/lib/mongoid/contextual/memory.rb +9 -4
  22. data/lib/mongoid/contextual/mongo.rb +65 -30
  23. data/lib/mongoid/contextual/none.rb +12 -0
  24. data/lib/mongoid/copyable.rb +13 -6
  25. data/lib/mongoid/criteria/marshalable.rb +2 -2
  26. data/lib/mongoid/criteria/modifiable.rb +29 -3
  27. data/lib/mongoid/criteria/options.rb +25 -0
  28. data/lib/mongoid/criteria/queryable/aggregable.rb +120 -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/extensions.rb +28 -0
  46. data/lib/mongoid/criteria/queryable/forwardable.rb +65 -0
  47. data/lib/mongoid/criteria/queryable/key.rb +103 -0
  48. data/lib/mongoid/criteria/queryable/macroable.rb +27 -0
  49. data/lib/mongoid/criteria/queryable/mergeable.rb +273 -0
  50. data/lib/mongoid/criteria/queryable/optional.rb +429 -0
  51. data/lib/mongoid/criteria/queryable/options.rb +153 -0
  52. data/lib/mongoid/criteria/queryable/pipeline.rb +111 -0
  53. data/lib/mongoid/criteria/queryable/selectable.rb +689 -0
  54. data/lib/mongoid/criteria/queryable/selector.rb +212 -0
  55. data/lib/mongoid/criteria/queryable/smash.rb +104 -0
  56. data/lib/mongoid/criteria/queryable.rb +87 -0
  57. data/lib/mongoid/criteria.rb +6 -2
  58. data/lib/mongoid/document.rb +34 -41
  59. data/lib/mongoid/errors/ambiguous_relationship.rb +1 -1
  60. data/lib/mongoid/errors/in_memory_collation_not_supported.rb +1 -1
  61. data/lib/mongoid/errors/invalid_field.rb +2 -2
  62. data/lib/mongoid/errors/invalid_persistence_option.rb +29 -0
  63. data/lib/mongoid/errors/invalid_relation.rb +66 -0
  64. data/lib/mongoid/errors/invalid_session_use.rb +24 -0
  65. data/lib/mongoid/errors.rb +3 -0
  66. data/lib/mongoid/evolvable.rb +1 -1
  67. data/lib/mongoid/extensions/big_decimal.rb +17 -8
  68. data/lib/mongoid/extensions/date.rb +4 -1
  69. data/lib/mongoid/extensions/decimal128.rb +3 -3
  70. data/lib/mongoid/extensions/hash.rb +1 -0
  71. data/lib/mongoid/extensions/regexp.rb +1 -0
  72. data/lib/mongoid/extensions/string.rb +6 -3
  73. data/lib/mongoid/extensions/time.rb +4 -1
  74. data/lib/mongoid/extensions.rb +0 -4
  75. data/lib/mongoid/factory.rb +2 -1
  76. data/lib/mongoid/fields/validators/macro.rb +18 -0
  77. data/lib/mongoid/findable.rb +2 -2
  78. data/lib/mongoid/indexable.rb +16 -14
  79. data/lib/mongoid/interceptable.rb +9 -22
  80. data/lib/mongoid/matchable/all.rb +2 -2
  81. data/lib/mongoid/matchable/and.rb +3 -3
  82. data/lib/mongoid/matchable/default.rb +2 -2
  83. data/lib/mongoid/matchable/elem_match.rb +28 -0
  84. data/lib/mongoid/matchable/exists.rb +2 -2
  85. data/lib/mongoid/matchable/gt.rb +4 -2
  86. data/lib/mongoid/matchable/gte.rb +4 -2
  87. data/lib/mongoid/matchable/in.rb +2 -2
  88. data/lib/mongoid/matchable/lt.rb +4 -2
  89. data/lib/mongoid/matchable/lte.rb +4 -2
  90. data/lib/mongoid/matchable/ne.rb +2 -2
  91. data/lib/mongoid/matchable/nin.rb +2 -2
  92. data/lib/mongoid/matchable/nor.rb +37 -0
  93. data/lib/mongoid/matchable/or.rb +3 -3
  94. data/lib/mongoid/matchable/regexp.rb +3 -3
  95. data/lib/mongoid/matchable/size.rb +2 -2
  96. data/lib/mongoid/matchable.rb +16 -7
  97. data/lib/mongoid/persistable/creatable.rb +5 -3
  98. data/lib/mongoid/persistable/deletable.rb +5 -3
  99. data/lib/mongoid/persistable/destroyable.rb +1 -5
  100. data/lib/mongoid/persistable/settable.rb +5 -5
  101. data/lib/mongoid/persistable/updatable.rb +7 -14
  102. data/lib/mongoid/persistable/upsertable.rb +2 -1
  103. data/lib/mongoid/persistable.rb +4 -6
  104. data/lib/mongoid/persistence_context.rb +220 -0
  105. data/lib/mongoid/query_cache.rb +67 -23
  106. data/lib/mongoid/railtie.rb +17 -1
  107. data/lib/mongoid/railties/controller_runtime.rb +86 -0
  108. data/lib/mongoid/relations/accessors.rb +3 -0
  109. data/lib/mongoid/relations/auto_save.rb +12 -4
  110. data/lib/mongoid/relations/bindings/referenced/many_to_many.rb +4 -4
  111. data/lib/mongoid/relations/counter_cache.rb +15 -5
  112. data/lib/mongoid/relations/eager/base.rb +3 -3
  113. data/lib/mongoid/relations/eager/has_and_belongs_to_many.rb +2 -2
  114. data/lib/mongoid/relations/eager/has_many.rb +1 -1
  115. data/lib/mongoid/relations/eager.rb +6 -11
  116. data/lib/mongoid/relations/embedded/batchable.rb +20 -18
  117. data/lib/mongoid/relations/embedded/in.rb +13 -1
  118. data/lib/mongoid/relations/embedded/many.rb +51 -10
  119. data/lib/mongoid/relations/embedded/one.rb +14 -1
  120. data/lib/mongoid/relations/macros.rb +9 -1
  121. data/lib/mongoid/relations/many.rb +4 -0
  122. data/lib/mongoid/relations/metadata.rb +3 -3
  123. data/lib/mongoid/relations/options.rb +2 -2
  124. data/lib/mongoid/relations/proxy.rb +1 -31
  125. data/lib/mongoid/relations/referenced/in.rb +19 -10
  126. data/lib/mongoid/relations/referenced/many.rb +30 -26
  127. data/lib/mongoid/relations/referenced/many_to_many.rb +20 -13
  128. data/lib/mongoid/relations/referenced/one.rb +15 -1
  129. data/lib/mongoid/relations/synchronization.rb +12 -12
  130. data/lib/mongoid/relations/targets/enumerable.rb +24 -4
  131. data/lib/mongoid/relations/touchable.rb +7 -4
  132. data/lib/mongoid/reloadable.rb +2 -2
  133. data/lib/mongoid/scopable.rb +3 -3
  134. data/lib/mongoid/serializable.rb +1 -1
  135. data/lib/mongoid/stateful.rb +1 -0
  136. data/lib/mongoid/tasks/database.rb +3 -2
  137. data/lib/mongoid/threaded.rb +74 -0
  138. data/lib/mongoid/traversable.rb +1 -1
  139. data/lib/mongoid/validatable/uniqueness.rb +1 -2
  140. data/lib/mongoid/version.rb +1 -1
  141. data/lib/mongoid.rb +6 -6
  142. data/lib/rails/generators/mongoid/config/templates/mongoid.yml +18 -3
  143. data/spec/app/models/agent.rb +2 -0
  144. data/spec/app/models/album.rb +5 -1
  145. data/spec/app/models/array_field.rb +7 -0
  146. data/spec/app/models/artist.rb +21 -0
  147. data/spec/app/models/band.rb +3 -0
  148. data/spec/app/models/book.rb +2 -1
  149. data/spec/app/models/delegating_patient.rb +16 -0
  150. data/spec/app/models/dokument.rb +1 -0
  151. data/spec/app/models/ordered_post.rb +5 -0
  152. data/spec/app/models/oscar.rb +1 -2
  153. data/spec/app/models/page.rb +1 -1
  154. data/spec/app/models/person.rb +3 -3
  155. data/spec/app/models/princess.rb +2 -0
  156. data/spec/app/models/record.rb +1 -0
  157. data/spec/app/models/subscription.rb +1 -0
  158. data/spec/app/models/thing.rb +1 -1
  159. data/spec/config/mongoid.yml +15 -0
  160. data/spec/integration/document_spec.rb +22 -0
  161. data/spec/mongoid/atomic/modifiers_spec.rb +3 -3
  162. data/spec/mongoid/atomic_spec.rb +5 -5
  163. data/spec/mongoid/attributes/nested_spec.rb +18 -14
  164. data/spec/mongoid/attributes/readonly_spec.rb +87 -44
  165. data/spec/mongoid/attributes_spec.rb +90 -5
  166. data/spec/mongoid/cacheable_spec.rb +112 -0
  167. data/spec/mongoid/changeable_spec.rb +58 -0
  168. data/spec/mongoid/clients/factory_spec.rb +80 -28
  169. data/spec/mongoid/clients/options_spec.rb +396 -95
  170. data/spec/mongoid/clients/sessions_spec.rb +334 -0
  171. data/spec/mongoid/clients_spec.rb +243 -101
  172. data/spec/mongoid/composable_spec.rb +7 -0
  173. data/spec/mongoid/config_spec.rb +67 -11
  174. data/spec/mongoid/contextual/atomic_spec.rb +3 -3
  175. data/spec/mongoid/contextual/geo_near_spec.rb +1 -0
  176. data/spec/mongoid/contextual/mongo_spec.rb +275 -22
  177. data/spec/mongoid/contextual/none_spec.rb +15 -0
  178. data/spec/mongoid/copyable_spec.rb +13 -4
  179. data/spec/mongoid/criteria/modifiable_spec.rb +297 -16
  180. data/spec/mongoid/criteria/options_spec.rb +29 -0
  181. data/spec/mongoid/criteria/queryable/aggregable_spec.rb +370 -0
  182. data/spec/mongoid/criteria/queryable/extensions/array_spec.rb +523 -0
  183. data/spec/mongoid/criteria/queryable/extensions/big_decimal_spec.rb +59 -0
  184. data/spec/mongoid/criteria/queryable/extensions/bignum_spec.rb +58 -0
  185. data/spec/mongoid/criteria/queryable/extensions/boolean_spec.rb +213 -0
  186. data/spec/mongoid/criteria/queryable/extensions/date_spec.rb +330 -0
  187. data/spec/mongoid/criteria/queryable/extensions/date_time_spec.rb +405 -0
  188. data/spec/mongoid/criteria/queryable/extensions/fixnum_spec.rb +58 -0
  189. data/spec/mongoid/criteria/queryable/extensions/float_spec.rb +65 -0
  190. data/spec/mongoid/criteria/queryable/extensions/hash_spec.rb +327 -0
  191. data/spec/mongoid/criteria/queryable/extensions/integer_spec.rb +65 -0
  192. data/spec/mongoid/criteria/queryable/extensions/nil_class_spec.rb +77 -0
  193. data/spec/mongoid/criteria/queryable/extensions/object_spec.rb +108 -0
  194. data/spec/mongoid/criteria/queryable/extensions/range_spec.rb +309 -0
  195. data/spec/mongoid/{extensions/origin → criteria/queryable/extensions}/regexp_raw_spec.rb +2 -2
  196. data/spec/mongoid/criteria/queryable/extensions/regexp_spec.rb +90 -0
  197. data/spec/mongoid/criteria/queryable/extensions/set_spec.rb +39 -0
  198. data/spec/mongoid/criteria/queryable/extensions/string_spec.rb +302 -0
  199. data/spec/mongoid/criteria/queryable/extensions/symbol_spec.rb +167 -0
  200. data/spec/mongoid/criteria/queryable/extensions/time_spec.rb +376 -0
  201. data/spec/mongoid/criteria/queryable/extensions/time_with_zone_spec.rb +347 -0
  202. data/spec/mongoid/criteria/queryable/forwardable_spec.rb +87 -0
  203. data/spec/mongoid/criteria/queryable/key_spec.rb +52 -0
  204. data/spec/mongoid/criteria/queryable/mergeable_spec.rb +49 -0
  205. data/spec/mongoid/criteria/queryable/optional_spec.rb +1799 -0
  206. data/spec/mongoid/criteria/queryable/options_spec.rb +360 -0
  207. data/spec/mongoid/criteria/queryable/pipeline_spec.rb +200 -0
  208. data/spec/mongoid/criteria/queryable/queryable_spec.rb +137 -0
  209. data/spec/mongoid/criteria/queryable/selectable_spec.rb +4242 -0
  210. data/spec/mongoid/criteria/queryable/selector_spec.rb +844 -0
  211. data/spec/mongoid/criteria/queryable/smash_spec.rb +30 -0
  212. data/spec/mongoid/criteria/scopable_spec.rb +81 -0
  213. data/spec/mongoid/criteria_spec.rb +156 -22
  214. data/spec/mongoid/document_spec.rb +100 -90
  215. data/spec/mongoid/errors/invalid_relation_spec.rb +37 -0
  216. data/spec/mongoid/errors/mongoid_error_spec.rb +6 -3
  217. data/spec/mongoid/extensions/big_decimal_spec.rb +321 -19
  218. data/spec/mongoid/extensions/boolean_spec.rb +14 -0
  219. data/spec/mongoid/extensions/date_spec.rb +2 -6
  220. data/spec/mongoid/extensions/date_time_spec.rb +2 -6
  221. data/spec/mongoid/extensions/decimal128_spec.rb +1 -1
  222. data/spec/mongoid/extensions/float_spec.rb +8 -1
  223. data/spec/mongoid/extensions/hash_spec.rb +15 -0
  224. data/spec/mongoid/extensions/integer_spec.rb +8 -1
  225. data/spec/mongoid/extensions/object_spec.rb +11 -0
  226. data/spec/mongoid/extensions/regexp_spec.rb +23 -0
  227. data/spec/mongoid/extensions/string_spec.rb +53 -4
  228. data/spec/mongoid/extensions/time_spec.rb +2 -6
  229. data/spec/mongoid/extensions/time_with_zone_spec.rb +2 -6
  230. data/spec/mongoid/factory_spec.rb +11 -0
  231. data/spec/mongoid/fields_spec.rb +1 -1
  232. data/spec/mongoid/findable_spec.rb +47 -2
  233. data/spec/mongoid/indexable_spec.rb +15 -3
  234. data/spec/mongoid/interceptable_spec.rb +85 -19
  235. data/spec/mongoid/matchable/all_spec.rb +4 -4
  236. data/spec/mongoid/matchable/and_spec.rb +10 -10
  237. data/spec/mongoid/matchable/default_spec.rb +12 -12
  238. data/spec/mongoid/matchable/elem_match_spec.rb +86 -0
  239. data/spec/mongoid/matchable/exists_spec.rb +5 -5
  240. data/spec/mongoid/matchable/gt_spec.rb +18 -7
  241. data/spec/mongoid/matchable/gte_spec.rb +17 -7
  242. data/spec/mongoid/matchable/in_spec.rb +5 -5
  243. data/spec/mongoid/matchable/lt_spec.rb +18 -7
  244. data/spec/mongoid/matchable/lte_spec.rb +18 -7
  245. data/spec/mongoid/matchable/ne_spec.rb +5 -5
  246. data/spec/mongoid/matchable/nin_spec.rb +5 -5
  247. data/spec/mongoid/matchable/nor_spec.rb +209 -0
  248. data/spec/mongoid/matchable/or_spec.rb +7 -7
  249. data/spec/mongoid/matchable/regexp_spec.rb +5 -5
  250. data/spec/mongoid/matchable/size_spec.rb +3 -3
  251. data/spec/mongoid/matchable_spec.rb +199 -54
  252. data/spec/mongoid/persistable/creatable_spec.rb +7 -2
  253. data/spec/mongoid/persistable/deletable_spec.rb +35 -1
  254. data/spec/mongoid/persistable/destroyable_spec.rb +25 -2
  255. data/spec/mongoid/persistable/incrementable_spec.rb +6 -6
  256. data/spec/mongoid/persistable/savable_spec.rb +34 -29
  257. data/spec/mongoid/persistable/settable_spec.rb +77 -27
  258. data/spec/mongoid/persistable/updatable_spec.rb +182 -3
  259. data/spec/mongoid/persistable_spec.rb +16 -16
  260. data/spec/mongoid/persistence_context_spec.rb +694 -0
  261. data/spec/mongoid/positional_spec.rb +1 -1
  262. data/spec/mongoid/query_cache_spec.rb +170 -12
  263. data/spec/mongoid/relations/accessors_spec.rb +1 -1
  264. data/spec/mongoid/relations/auto_save_spec.rb +39 -6
  265. data/spec/mongoid/relations/bindings/referenced/many_to_many_spec.rb +4 -4
  266. data/spec/mongoid/relations/builders_spec.rb +37 -10
  267. data/spec/mongoid/relations/counter_cache_spec.rb +64 -3
  268. data/spec/mongoid/relations/eager/has_and_belongs_to_many_spec.rb +16 -0
  269. data/spec/mongoid/relations/eager_spec.rb +40 -0
  270. data/spec/mongoid/relations/embedded/many_spec.rb +305 -59
  271. data/spec/mongoid/relations/embedded/one_spec.rb +2 -1
  272. data/spec/mongoid/relations/macros_spec.rb +415 -7
  273. data/spec/mongoid/relations/metadata_spec.rb +15 -1
  274. data/spec/mongoid/relations/proxy_spec.rb +27 -1
  275. data/spec/mongoid/relations/referenced/in_spec.rb +41 -1
  276. data/spec/mongoid/relations/referenced/many_spec.rb +35 -25
  277. data/spec/mongoid/relations/referenced/many_to_many_spec.rb +14 -26
  278. data/spec/mongoid/relations/synchronization_spec.rb +48 -2
  279. data/spec/mongoid/relations/targets/enumerable_spec.rb +108 -0
  280. data/spec/mongoid/relations/touchable_spec.rb +40 -0
  281. data/spec/mongoid/reloadable_spec.rb +51 -0
  282. data/spec/mongoid/scopable_spec.rb +13 -0
  283. data/spec/mongoid/serializable_spec.rb +0 -50
  284. data/spec/mongoid/threaded_spec.rb +68 -0
  285. data/spec/mongoid/validatable/presence_spec.rb +1 -1
  286. data/spec/mongoid/validatable/uniqueness_spec.rb +18 -9
  287. data/spec/mongoid/validatable_spec.rb +16 -0
  288. data/spec/rails/controller_extension/controller_runtime_spec.rb +110 -0
  289. data/spec/spec_helper.rb +101 -8
  290. data/spec/support/cluster_config.rb +158 -0
  291. data/spec/support/constraints.rb +101 -0
  292. data/spec/support/macros.rb +20 -0
  293. data/spec/support/session_registry.rb +50 -0
  294. data/spec/support/spec_config.rb +42 -0
  295. data.tar.gz.sig +0 -0
  296. metadata +163 -61
  297. metadata.gz.sig +0 -0
  298. data/lib/mongoid/clients/thread_options.rb +0 -19
  299. data/lib/mongoid/extensions/origin/regexp_raw.rb +0 -43
  300. data/lib/mongoid/railties/document.rb +0 -12
  301. data/spec/mongoid/railties/document_spec.rb +0 -24
@@ -9,6 +9,12 @@ describe Mongoid::Config do
9
9
  end
10
10
  end
11
11
 
12
+ after do
13
+ Mongoid.configure do |config|
14
+ config.load_configuration(CONFIG)
15
+ end
16
+ end
17
+
12
18
  describe "#configured?" do
13
19
 
14
20
  after do
@@ -64,7 +70,7 @@ describe Mongoid::Config do
64
70
 
65
71
  before do
66
72
  if defined?(Rails)
67
- RailsTemp = Rails
73
+ RailsTemp = Rails unless defined?(RailsTemp)
68
74
  Object.send(:remove_const, :Rails)
69
75
  end
70
76
 
@@ -82,10 +88,62 @@ describe Mongoid::Config do
82
88
  end
83
89
  end
84
90
 
91
+ context 'when the belongs_to_required_by_default option is not set in the config' do
92
+
93
+ before do
94
+ Mongoid::Config.reset
95
+ Mongoid.configure do |config|
96
+ config.load_configuration(clients: CONFIG[:clients])
97
+ end
98
+ end
99
+
100
+ it 'sets the Mongoid.belongs_to_required_by_default value to true' do
101
+ expect(Mongoid.belongs_to_required_by_default).to be(true)
102
+ end
103
+ end
104
+
105
+ context 'when the belongs_to_required_by_default option is set in the config' do
106
+
107
+ before do
108
+ Mongoid.configure do |config|
109
+ config.load_configuration(conf)
110
+ end
111
+ end
112
+
113
+ context 'when the value is set to true' do
114
+
115
+ let(:conf) do
116
+ CONFIG.merge(options: { belongs_to_required_by_default: true })
117
+ end
118
+
119
+ it 'sets the Mongoid.belongs_to_required_by_default value to true' do
120
+ expect(Mongoid.belongs_to_required_by_default).to be(true)
121
+ end
122
+ end
123
+
124
+ context 'when the value is set to false' do
125
+
126
+ let(:conf) do
127
+ CONFIG.merge(options: { belongs_to_required_by_default: false })
128
+ end
129
+
130
+ before do
131
+ Mongoid::Config.reset
132
+ Mongoid.configure do |config|
133
+ config.load_configuration(conf)
134
+ end
135
+ end
136
+
137
+ it 'sets the Mongoid.belongs_to_required_by_default value to false' do
138
+ expect(Mongoid.belongs_to_required_by_default).to be(false)
139
+ end
140
+ end
141
+ end
142
+
85
143
  context 'when the app_name is set in the config' do
86
144
 
87
145
  let(:conf) do
88
- CONFIG.merge(options: {app_name: 'admin-reporting'})
146
+ CONFIG.merge(options: { app_name: 'admin-reporting' })
89
147
  end
90
148
 
91
149
  before do
@@ -137,6 +195,10 @@ describe Mongoid::Config do
137
195
  described_class.load!(file, :test)
138
196
  end
139
197
 
198
+ after do
199
+ client.close
200
+ end
201
+
140
202
  it "clears the previous clients" do
141
203
  expect(Mongoid::Clients.clients[:test]).to be_nil
142
204
  end
@@ -148,12 +210,6 @@ describe Mongoid::Config do
148
210
  described_class.load!(file, :test)
149
211
  end
150
212
 
151
- after do
152
- Mongoid.configure do |config|
153
- config.load_configuration(CONFIG)
154
- end
155
- end
156
-
157
213
  it "sets the Mongoid logger level" do
158
214
  expect(Mongoid.logger.level).to eq(Logger::WARN)
159
215
  end
@@ -176,7 +232,7 @@ describe Mongoid::Config do
176
232
 
177
233
  after do
178
234
  if defined?(Rails)
179
- RailsTemp = Rails
235
+ RailsTemp = Rails unless defined?(RailsTemp)
180
236
  Object.send(:remove_const, :Rails)
181
237
  end
182
238
  end
@@ -282,7 +338,7 @@ describe Mongoid::Config do
282
338
  context "when a default is provided" do
283
339
 
284
340
  before do
285
- described_class.load!(file)
341
+ described_class.load!(file, :test_with_max_staleness)
286
342
  end
287
343
 
288
344
  let(:default) do
@@ -301,7 +357,7 @@ describe Mongoid::Config do
301
357
 
302
358
  it "sets the read option" do
303
359
  expect(options["read"]).to eq({ "mode" => :primary_preferred,
304
- "tag_sets" => [{ "use" => "web" }]})
360
+ "max_staleness" => 100 })
305
361
  end
306
362
  end
307
363
  end
@@ -496,7 +496,7 @@ describe Mongoid::Contextual::Atomic do
496
496
  end
497
497
  end
498
498
 
499
- describe "#push_each" do
499
+ describe "#push_all" do
500
500
 
501
501
  context 'when the criteria does not have a collation' do
502
502
 
@@ -517,7 +517,7 @@ describe Mongoid::Contextual::Atomic do
517
517
  end
518
518
 
519
519
  before do
520
- context.push_each(members: [ "Alan", "Fletch" ])
520
+ context.push_all(members: [ "Alan", "Fletch" ])
521
521
  end
522
522
 
523
523
  it "pushes the values to existing arrays" do
@@ -548,7 +548,7 @@ describe Mongoid::Contextual::Atomic do
548
548
  end
549
549
 
550
550
  before do
551
- context.push_each(members: [ "Alan", "Fletch" ])
551
+ context.push_all(members: [ "Alan", "Fletch" ])
552
552
  end
553
553
 
554
554
  it "pushes the values to existing arrays" do
@@ -1,6 +1,7 @@
1
1
  require "spec_helper"
2
2
 
3
3
  describe Mongoid::Contextual::GeoNear do
4
+ max_server_version '4.0'
4
5
 
5
6
  describe "#average_distance" do
6
7
 
@@ -228,36 +228,36 @@ describe Mongoid::Contextual::Mongo do
228
228
  it "returns the number of documents deleted" do
229
229
  expect(deleted).to eq(1)
230
230
  end
231
- end
232
231
 
233
- context 'when the criteria has a collation', if: collation_supported? do
232
+ context 'when the criteria has a collation', if: collation_supported? do
234
233
 
235
- let(:criteria) do
236
- Band.where(name: "DEPECHE MODE").collation(locale: 'en_US', strength: 2)
237
- end
234
+ let(:criteria) do
235
+ Band.where(name: "DEPECHE MODE").collation(locale: 'en_US', strength: 2)
236
+ end
238
237
 
239
- let(:context) do
240
- described_class.new(criteria)
241
- end
238
+ let(:context) do
239
+ described_class.new(criteria)
240
+ end
242
241
 
243
- let!(:deleted) do
244
- context.send(method)
245
- end
242
+ let!(:deleted) do
243
+ context.send(method)
244
+ end
246
245
 
247
- it "deletes the matching documents" do
248
- expect(Band.find(new_order.id)).to eq(new_order)
249
- end
246
+ it "deletes the matching documents" do
247
+ expect(Band.find(new_order.id)).to eq(new_order)
248
+ end
250
249
 
251
- it "deletes the correct number of documents" do
252
- expect(Band.count).to eq(1)
253
- end
250
+ it "deletes the correct number of documents" do
251
+ expect(Band.count).to eq(1)
252
+ end
254
253
 
255
- it "returns the number of documents deleted" do
256
- expect(deleted).to eq(1)
254
+ it "returns the number of documents deleted" do
255
+ expect(deleted).to eq(1)
256
+ end
257
257
  end
258
258
  end
259
259
 
260
- context "when the selector is not constraining" do
260
+ context "when the selector is not contraining" do
261
261
 
262
262
  let(:criteria) do
263
263
  Band.all
@@ -275,6 +275,23 @@ describe Mongoid::Contextual::Mongo do
275
275
  expect(Band.count).to eq(0)
276
276
  end
277
277
  end
278
+
279
+ context 'when the write concern is unacknowledged' do
280
+
281
+ let(:criteria) do
282
+ Band.all
283
+ end
284
+
285
+ let!(:deleted) do
286
+ criteria.with(write: { w: 0 }) do |crit|
287
+ crit.send(method)
288
+ end
289
+ end
290
+
291
+ it 'returns 0' do
292
+ expect(deleted).to eq(0)
293
+ end
294
+ end
278
295
  end
279
296
  end
280
297
 
@@ -363,6 +380,27 @@ describe Mongoid::Contextual::Mongo do
363
380
  end
364
381
  end
365
382
  end
383
+
384
+ context 'when the write concern is unacknowledged' do
385
+
386
+ before do
387
+ 2.times { Band.create }
388
+ end
389
+
390
+ let(:criteria) do
391
+ Band.all
392
+ end
393
+
394
+ let!(:deleted) do
395
+ criteria.with(write: { w: 0 }) do |crit|
396
+ crit.send(method)
397
+ end
398
+ end
399
+
400
+ it 'returns 0' do
401
+ expect(deleted).to eq(0)
402
+ end
403
+ end
366
404
  end
367
405
 
368
406
  describe "#distinct" do
@@ -413,7 +451,7 @@ describe Mongoid::Contextual::Mongo do
413
451
  end
414
452
 
415
453
  it "returns the distinct field values" do
416
- expect(context.distinct(:years)).to eq([ 30, 25 ])
454
+ expect(context.distinct(:years).sort).to eq([ 25, 30 ])
417
455
  end
418
456
  end
419
457
 
@@ -1124,6 +1162,92 @@ describe Mongoid::Contextual::Mongo do
1124
1162
  end
1125
1163
  end
1126
1164
 
1165
+ context 'when the criteria has no sort' do
1166
+
1167
+ let(:criteria) do
1168
+ Band.all
1169
+ end
1170
+
1171
+ let(:context) do
1172
+ described_class.new(criteria)
1173
+ end
1174
+
1175
+
1176
+ it 'applies a sort on _id' do
1177
+ expect(context.send(method)).to eq(depeche_mode)
1178
+ end
1179
+
1180
+ context 'when calling #last' do
1181
+
1182
+ it 'returns the last document, sorted by _id' do
1183
+ expect(context.send(method)).to eq(depeche_mode)
1184
+ expect(context.last).to eq(new_order)
1185
+ end
1186
+ end
1187
+
1188
+ context 'with option { sort: :none }' do
1189
+
1190
+ let(:opts) do
1191
+ { id_sort: :none }
1192
+ end
1193
+
1194
+ it 'does not apply the sort on _id' do
1195
+ expect(context.send(method, opts)).to eq(depeche_mode)
1196
+ end
1197
+
1198
+ context 'when calling #last' do
1199
+
1200
+ it 'does not apply a sort on _id' do
1201
+ expect(context.send(method, opts)).to eq(depeche_mode)
1202
+ expect(context.last(opts)).to eq(depeche_mode)
1203
+ end
1204
+ end
1205
+ end
1206
+ end
1207
+
1208
+ context 'when the criteria has a sort' do
1209
+
1210
+ let(:criteria) do
1211
+ Band.desc(:name)
1212
+ end
1213
+
1214
+ let(:context) do
1215
+ described_class.new(criteria)
1216
+ end
1217
+
1218
+
1219
+ it 'applies the criteria sort' do
1220
+ expect(context.send(method)).to eq(new_order)
1221
+ end
1222
+
1223
+ context 'when calling #last' do
1224
+
1225
+ it 'applies the criteria sort' do
1226
+ expect(context.send(method)).to eq(new_order)
1227
+ expect(context.last).to eq(depeche_mode)
1228
+ end
1229
+ end
1230
+
1231
+ context 'with option { sort: :none }' do
1232
+
1233
+ let(:opts) do
1234
+ { id_sort: :none }
1235
+ end
1236
+
1237
+ it 'applies the criteria sort' do
1238
+ expect(context.send(method, opts)).to eq(new_order)
1239
+ end
1240
+
1241
+ context 'when calling #last' do
1242
+
1243
+ it 'applies the criteria sort' do
1244
+ expect(context.send(method, opts)).to eq(new_order)
1245
+ expect(context.last(opts)).to eq(depeche_mode)
1246
+ end
1247
+ end
1248
+ end
1249
+ end
1250
+
1127
1251
  context "when using .sort" do
1128
1252
 
1129
1253
  let(:criteria) do
@@ -1674,6 +1798,65 @@ describe Mongoid::Contextual::Mongo do
1674
1798
  end
1675
1799
  end
1676
1800
 
1801
+ context "when the output specifies a different db" do
1802
+
1803
+ let(:criteria) do
1804
+ Band.limit(1)
1805
+ end
1806
+
1807
+ let(:context) do
1808
+ described_class.new(criteria)
1809
+ end
1810
+
1811
+ after do
1812
+ Band.with(database: 'another-db') do |b|
1813
+ b.all.delete
1814
+ end
1815
+ end
1816
+
1817
+ context 'when db is a string' do
1818
+
1819
+ let(:results) do
1820
+ context.map_reduce(map, reduce).out(merge: :mr_output, db: 'another-db')
1821
+ end
1822
+
1823
+ it "returns the correct number of documents" do
1824
+ expect(results.count).to eq(1)
1825
+ end
1826
+
1827
+ it "contains the entire results" do
1828
+ expect(results).to eq([
1829
+ { "_id" => "Depeche Mode", "value" => { "likes" => 200 }}
1830
+ ])
1831
+ end
1832
+
1833
+ it 'writes to the specified db' do
1834
+ expect(Band.mongo_client.with(database: 'another-db')[:mr_output].find.count).to eq(1)
1835
+ end
1836
+ end
1837
+
1838
+ context 'when db is a symbol' do
1839
+
1840
+ let(:results) do
1841
+ context.map_reduce(map, reduce).out(merge: :mr_output, 'db' => 'another-db')
1842
+ end
1843
+
1844
+ it "returns the correct number of documents" do
1845
+ expect(results.count).to eq(1)
1846
+ end
1847
+
1848
+ it "contains the entire results" do
1849
+ expect(results).to eq([
1850
+ { "_id" => "Depeche Mode", "value" => { "likes" => 200 }}
1851
+ ])
1852
+ end
1853
+
1854
+ it 'writes to the specified db' do
1855
+ expect(Band.mongo_client.with(database: 'another-db')[:mr_output].find.count).to eq(1)
1856
+ end
1857
+ end
1858
+ end
1859
+
1677
1860
  context "when providing no output" do
1678
1861
 
1679
1862
  let(:criteria) do
@@ -1949,6 +2132,41 @@ describe Mongoid::Contextual::Mongo do
1949
2132
  expect(context.update).to be false
1950
2133
  end
1951
2134
  end
2135
+
2136
+ context 'when provided array filters', if: array_filters_supported? do
2137
+
2138
+ before do
2139
+ Band.delete_all
2140
+ b = Band.new(name: 'Depeche Mode')
2141
+ b.labels << Label.new(name: 'Warner')
2142
+ b.labels << Label.new(name: 'Sony')
2143
+ b.labels << Label.new(name: 'Cbs')
2144
+ b.save
2145
+
2146
+ b = Band.new(name: 'FKA Twigs')
2147
+ b.labels << Label.new(name: 'Warner')
2148
+ b.labels << Label.new(name: 'Cbs')
2149
+ b.save
2150
+ end
2151
+
2152
+
2153
+ let(:criteria) do
2154
+ Band.where(name: 'Depeche Mode')
2155
+ end
2156
+
2157
+ let!(:update) do
2158
+ context.update({ '$set' => { 'labels.$[i].name' => 'Sony' } },
2159
+ array_filters: [{ 'i.name' => 'Cbs' }])
2160
+ end
2161
+
2162
+ it 'applies the array filters' do
2163
+ expect(Band.where(name: 'Depeche Mode').first.labels.collect(&:name)).to match_array(['Warner', 'Sony', 'Sony'])
2164
+ end
2165
+
2166
+ it 'does not affect other documents' do
2167
+ expect(Band.where(name: 'FKA Twigs').first.labels.collect(&:name)).to match_array(['Warner', 'Cbs'])
2168
+ end
2169
+ end
1952
2170
  end
1953
2171
 
1954
2172
  describe "#update_all" do
@@ -2086,6 +2304,41 @@ describe Mongoid::Contextual::Mongo do
2086
2304
  expect(context.update_all).to be false
2087
2305
  end
2088
2306
  end
2307
+
2308
+ context 'when provided array filters', if: array_filters_supported? do
2309
+
2310
+ before do
2311
+ Band.delete_all
2312
+ b = Band.new(name: 'Depeche Mode')
2313
+ b.labels << Label.new(name: 'Warner')
2314
+ b.labels << Label.new(name: 'Sony')
2315
+ b.labels << Label.new(name: 'Cbs')
2316
+ b.save
2317
+
2318
+ b = Band.new(name: 'FKA Twigs')
2319
+ b.labels << Label.new(name: 'Warner')
2320
+ b.labels << Label.new(name: 'Cbs')
2321
+ b.save
2322
+ end
2323
+
2324
+
2325
+ let(:criteria) do
2326
+ Band.all
2327
+ end
2328
+
2329
+ let!(:update) do
2330
+ context.update_all({ '$set' => { 'labels.$[i].name' => 'Sony' } },
2331
+ array_filters: [{ 'i.name' => 'Cbs' }])
2332
+ end
2333
+
2334
+ it 'applies the array filters' do
2335
+ expect(Band.where(name: 'Depeche Mode').first.labels.collect(&:name)).to match_array(['Warner', 'Sony', 'Sony'])
2336
+ end
2337
+
2338
+ it 'updates all documents' do
2339
+ expect(Band.where(name: 'FKA Twigs').first.labels.collect(&:name)).to match_array(['Warner', 'Sony'])
2340
+ end
2341
+ end
2089
2342
  end
2090
2343
 
2091
2344
  describe '#pipeline' do
@@ -2110,7 +2363,7 @@ describe Mongoid::Contextual::Mongo do
2110
2363
  end
2111
2364
 
2112
2365
  it 'creates a pipeline with the selector as one of the $match criteria' do
2113
- expect(pipeline_match).to include({ :'$text' => { :'$search' => "New Order" } })
2366
+ expect(pipeline_match).to include({ '$text' => { '$search' => "New Order" } })
2114
2367
  end
2115
2368
 
2116
2369
  it 'creates a pipeline with the $exists operator as one of the $match criteria' do
@@ -65,6 +65,21 @@ describe Mongoid::Contextual::None do
65
65
  end
66
66
  end
67
67
 
68
+ describe "#distinct" do
69
+
70
+ let!(:band) do
71
+ Band.create(name: "Depeche Mode")
72
+ end
73
+
74
+ let(:context) do
75
+ described_class.new(Band.where(name: "Depeche Mode"))
76
+ end
77
+
78
+ it "returns an empty array" do
79
+ expect(context.distinct(:id)).to eq([])
80
+ end
81
+ end
82
+
68
83
  describe "#pluck" do
69
84
 
70
85
  let!(:band) do
@@ -54,22 +54,31 @@ describe Mongoid::Copyable do
54
54
  end
55
55
  end
56
56
 
57
- context "when a document has old renamed fields" do
57
+ context "when a document has fields from a legacy schema" do
58
58
 
59
59
  let!(:actor) do
60
60
  Actor.create(name: "test")
61
61
  end
62
62
 
63
63
  before do
64
- Actor.collection.find(_id: actor.id).update_one("$set" => { "this_is_not_a_field" => 1 })
64
+ legacy_fields = { "this_is_not_a_field" => 1, "this_legacy_field_is_nil" => nil }
65
+ Actor.collection.find(_id: actor.id).update_one("$set" => legacy_fields)
65
66
  end
66
67
 
67
68
  let(:cloned) do
68
69
  actor.reload.send(method)
69
70
  end
70
71
 
71
- it "copies the document without error" do
72
- expect(cloned.this_is_not_a_field).to eq(1)
72
+ it "sets the legacy attribute" do
73
+ expect(cloned.attributes['this_is_not_a_field']).to eq(1)
74
+ end
75
+
76
+ it "contains legacy attributes that are nil" do
77
+ expect(cloned.attributes.key?('this_legacy_field_is_nil')).to eq(true)
78
+ end
79
+
80
+ it "copies the known attributes" do
81
+ expect(cloned.name).to eq('test')
73
82
  end
74
83
  end
75
84