mongo 2.4.3 → 2.5.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 (235) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +3 -2
  3. data.tar.gz.sig +0 -0
  4. data/lib/mongo.rb +3 -2
  5. data/lib/mongo/auth/cr.rb +6 -4
  6. data/lib/mongo/auth/cr/conversation.rb +33 -17
  7. data/lib/mongo/auth/ldap.rb +4 -2
  8. data/lib/mongo/auth/ldap/conversation.rb +19 -9
  9. data/lib/mongo/auth/scram.rb +7 -4
  10. data/lib/mongo/auth/scram/conversation.rb +62 -24
  11. data/lib/mongo/auth/user.rb +10 -0
  12. data/lib/mongo/auth/user/view.rb +44 -22
  13. data/lib/mongo/auth/x509.rb +4 -2
  14. data/lib/mongo/auth/x509/conversation.rb +19 -9
  15. data/lib/mongo/bulk_write.rb +33 -27
  16. data/lib/mongo/bulk_write/combineable.rb +5 -0
  17. data/lib/mongo/bulk_write/transformable.rb +2 -0
  18. data/lib/mongo/bulk_write/validatable.rb +4 -0
  19. data/lib/mongo/client.rb +123 -12
  20. data/lib/mongo/cluster.rb +52 -11
  21. data/lib/mongo/cluster/app_metadata.rb +8 -2
  22. data/lib/mongo/cluster/cursor_reaper.rb +0 -1
  23. data/lib/mongo/cluster/topology.rb +1 -1
  24. data/lib/mongo/collection.rb +114 -27
  25. data/lib/mongo/collection/view.rb +8 -2
  26. data/lib/mongo/collection/view/aggregation.rb +11 -7
  27. data/lib/mongo/collection/view/builder/aggregation.rb +5 -1
  28. data/lib/mongo/collection/view/builder/find_command.rb +5 -3
  29. data/lib/mongo/collection/view/builder/map_reduce.rb +11 -3
  30. data/lib/mongo/collection/view/builder/op_query.rb +1 -1
  31. data/lib/mongo/collection/view/change_stream.rb +160 -0
  32. data/lib/mongo/collection/view/change_stream/retryable.rb +57 -0
  33. data/lib/mongo/collection/view/iterable.rb +11 -10
  34. data/lib/mongo/collection/view/map_reduce.rb +22 -18
  35. data/lib/mongo/collection/view/readable.rb +51 -37
  36. data/lib/mongo/collection/view/writable.rb +72 -40
  37. data/lib/mongo/cursor.rb +25 -4
  38. data/lib/mongo/cursor/builder/get_more_command.rb +4 -2
  39. data/lib/mongo/database.rb +22 -11
  40. data/lib/mongo/database/view.rb +16 -12
  41. data/lib/mongo/error.rb +5 -0
  42. data/lib/mongo/error/invalid_session.rb +36 -0
  43. data/lib/mongo/error/missing_resume_token.rb +39 -0
  44. data/lib/mongo/error/operation_failure.rb +17 -0
  45. data/lib/mongo/error/parser.rb +3 -2
  46. data/lib/mongo/error/unknown_payload_type.rb +41 -0
  47. data/lib/mongo/error/unsupported_array_filters.rb +51 -0
  48. data/lib/mongo/error/unsupported_message_type.rb +23 -0
  49. data/lib/mongo/grid/fs_bucket.rb +5 -4
  50. data/lib/mongo/grid/stream/read.rb +3 -2
  51. data/lib/mongo/grid/stream/write.rb +2 -2
  52. data/lib/mongo/index/view.rb +35 -25
  53. data/lib/mongo/monitoring/event/secure.rb +14 -0
  54. data/lib/mongo/operation.rb +16 -0
  55. data/lib/mongo/operation/commands.rb +1 -0
  56. data/lib/mongo/operation/commands/aggregate.rb +9 -5
  57. data/lib/mongo/operation/commands/aggregate/result.rb +1 -1
  58. data/lib/mongo/operation/commands/collections_info.rb +6 -6
  59. data/lib/mongo/operation/commands/command.rb +2 -1
  60. data/lib/mongo/operation/commands/create.rb +6 -2
  61. data/lib/mongo/operation/commands/drop.rb +6 -2
  62. data/lib/mongo/operation/commands/drop_database.rb +6 -2
  63. data/lib/mongo/operation/commands/explain.rb +27 -0
  64. data/lib/mongo/operation/commands/explain/result.rb +52 -0
  65. data/lib/mongo/operation/commands/indexes.rb +1 -1
  66. data/lib/mongo/operation/commands/list_collections.rb +1 -1
  67. data/lib/mongo/operation/commands/list_collections/result.rb +1 -1
  68. data/lib/mongo/operation/commands/list_indexes.rb +1 -1
  69. data/lib/mongo/operation/commands/list_indexes/result.rb +1 -1
  70. data/lib/mongo/operation/commands/map_reduce.rb +8 -4
  71. data/lib/mongo/operation/commands/map_reduce/result.rb +13 -1
  72. data/lib/mongo/operation/commands/user_query.rb +1 -1
  73. data/lib/mongo/operation/commands/users_info.rb +6 -2
  74. data/lib/mongo/operation/executable.rb +4 -1
  75. data/lib/mongo/operation/read_preference.rb +10 -5
  76. data/lib/mongo/operation/result.rb +26 -2
  77. data/lib/mongo/operation/specifiable.rb +13 -1
  78. data/lib/mongo/operation/uses_command_op_msg.rb +47 -0
  79. data/lib/mongo/operation/write/bulk/bulkable.rb +4 -1
  80. data/lib/mongo/operation/write/bulk/insert/result.rb +4 -4
  81. data/lib/mongo/operation/write/command/create_index.rb +6 -1
  82. data/lib/mongo/operation/write/command/delete.rb +28 -4
  83. data/lib/mongo/operation/write/command/drop_index.rb +6 -1
  84. data/lib/mongo/operation/write/command/insert.rb +22 -18
  85. data/lib/mongo/operation/write/command/update.rb +24 -9
  86. data/lib/mongo/operation/write/command/writable.rb +14 -1
  87. data/lib/mongo/operation/write/insert.rb +4 -1
  88. data/lib/mongo/operation/write/insert/result.rb +2 -2
  89. data/lib/mongo/operation/write/update.rb +7 -1
  90. data/lib/mongo/operation/write/write_command_enabled.rb +20 -3
  91. data/lib/mongo/protocol.rb +3 -0
  92. data/lib/mongo/protocol/bit_vector.rb +2 -2
  93. data/lib/mongo/protocol/compressed.rb +135 -0
  94. data/lib/mongo/protocol/delete.rb +8 -6
  95. data/lib/mongo/protocol/get_more.rb +8 -6
  96. data/lib/mongo/protocol/insert.rb +8 -6
  97. data/lib/mongo/protocol/kill_cursors.rb +8 -6
  98. data/lib/mongo/protocol/message.rb +31 -3
  99. data/lib/mongo/protocol/msg.rb +172 -0
  100. data/lib/mongo/protocol/query.rb +26 -6
  101. data/lib/mongo/protocol/registry.rb +76 -0
  102. data/lib/mongo/protocol/reply.rb +10 -5
  103. data/lib/mongo/protocol/serializers.rb +224 -0
  104. data/lib/mongo/protocol/update.rb +8 -6
  105. data/lib/mongo/retryable.rb +4 -2
  106. data/lib/mongo/server.rb +6 -3
  107. data/lib/mongo/server/connectable.rb +1 -1
  108. data/lib/mongo/server/connection.rb +30 -8
  109. data/lib/mongo/server/description.rb +25 -1
  110. data/lib/mongo/server/description/features.rb +4 -1
  111. data/lib/mongo/server/monitor.rb +5 -0
  112. data/lib/mongo/server/monitor/connection.rb +50 -2
  113. data/lib/mongo/server_selector/nearest.rb +10 -4
  114. data/lib/mongo/server_selector/primary.rb +20 -0
  115. data/lib/mongo/server_selector/primary_preferred.rb +10 -4
  116. data/lib/mongo/server_selector/secondary.rb +10 -4
  117. data/lib/mongo/server_selector/secondary_preferred.rb +24 -4
  118. data/lib/mongo/session.rb +180 -0
  119. data/lib/mongo/session/server_session.rb +73 -0
  120. data/lib/mongo/session/session_pool.rb +161 -0
  121. data/lib/mongo/uri.rb +11 -0
  122. data/lib/mongo/version.rb +1 -1
  123. data/mongo.gemspec +2 -1
  124. data/spec/mongo/auth/cr_spec.rb +12 -0
  125. data/spec/mongo/auth/ldap_spec.rb +2 -0
  126. data/spec/mongo/auth/scram/conversation_spec.rb +6 -6
  127. data/spec/mongo/auth/scram_spec.rb +25 -1
  128. data/spec/mongo/auth/user/view_spec.rb +268 -76
  129. data/spec/mongo/auth/x509_spec.rb +2 -0
  130. data/spec/mongo/bulk_write_spec.rb +435 -5
  131. data/spec/mongo/client_spec.rb +356 -39
  132. data/spec/mongo/cluster/app_metadata_spec.rb +2 -2
  133. data/spec/mongo/cluster_spec.rb +176 -0
  134. data/spec/mongo/collection/view/aggregation_spec.rb +33 -12
  135. data/spec/mongo/collection/view/builder/find_command_spec.rb +46 -6
  136. data/spec/mongo/collection/view/change_stream_spec.rb +814 -0
  137. data/spec/mongo/collection/view/map_reduce_spec.rb +94 -17
  138. data/spec/mongo/collection/view/readable_spec.rb +3 -12
  139. data/spec/mongo/collection_spec.rb +1048 -42
  140. data/spec/mongo/cursor/builder/get_more_command_spec.rb +19 -0
  141. data/spec/mongo/cursor_spec.rb +2 -2
  142. data/spec/mongo/database_spec.rb +50 -1
  143. data/spec/mongo/grid/fs_bucket_spec.rb +225 -137
  144. data/spec/mongo/grid/stream/read_spec.rb +2 -2
  145. data/spec/mongo/index/view_spec.rb +146 -8
  146. data/spec/mongo/monitoring/event/secure_spec.rb +42 -0
  147. data/spec/mongo/operation/read/query_spec.rb +2 -1
  148. data/spec/mongo/operation/specifiable_spec.rb +2 -2
  149. data/spec/mongo/operation/write/command/delete_spec.rb +96 -13
  150. data/spec/mongo/operation/write/command/insert_spec.rb +111 -12
  151. data/spec/mongo/operation/write/command/update_spec.rb +93 -10
  152. data/spec/mongo/operation/write/delete_spec.rb +1 -1
  153. data/spec/mongo/operation/write/insert_spec.rb +1 -1
  154. data/spec/mongo/operation/write/update_spec.rb +1 -1
  155. data/spec/mongo/protocol/compressed_spec.rb +66 -0
  156. data/spec/mongo/protocol/delete_spec.rb +14 -0
  157. data/spec/mongo/protocol/get_more_spec.rb +14 -0
  158. data/spec/mongo/protocol/insert_spec.rb +14 -0
  159. data/spec/mongo/protocol/kill_cursors_spec.rb +14 -0
  160. data/spec/mongo/protocol/msg_spec.rb +499 -0
  161. data/spec/mongo/protocol/query_spec.rb +45 -0
  162. data/spec/mongo/protocol/registry_spec.rb +31 -0
  163. data/spec/mongo/protocol/reply_spec.rb +14 -0
  164. data/spec/mongo/protocol/update_spec.rb +14 -0
  165. data/spec/mongo/retryable_spec.rb +6 -2
  166. data/spec/mongo/sdam_spec.rb +4 -0
  167. data/spec/mongo/server/connection_spec.rb +4 -2
  168. data/spec/mongo/server/description_spec.rb +28 -1
  169. data/spec/mongo/session/server_session_spec.rb +16 -0
  170. data/spec/mongo/session/session_pool_spec.rb +194 -0
  171. data/spec/mongo/uri_spec.rb +31 -2
  172. data/spec/spec_helper.rb +104 -0
  173. data/spec/support/authorization.rb +6 -1
  174. data/spec/support/crud.rb +3 -1
  175. data/spec/support/crud/write.rb +6 -1
  176. data/spec/support/crud_tests/write/findOneAndUpdate-arrayFilters.yml +69 -0
  177. data/spec/support/crud_tests/write/updateMany-arrayFilters.yml +63 -0
  178. data/spec/support/crud_tests/write/updateOne-arrayFilters.yml +109 -0
  179. data/spec/support/sdam/rs/discover_arbiters.yml +1 -1
  180. data/spec/support/sdam/rs/discover_passives.yml +2 -2
  181. data/spec/support/sdam/rs/discover_primary.yml +1 -1
  182. data/spec/support/sdam/rs/discover_secondary.yml +1 -1
  183. data/spec/support/sdam/rs/discovery.yml +4 -4
  184. data/spec/support/sdam/rs/equal_electionids.yml +1 -0
  185. data/spec/support/sdam/rs/ghost_discovered.yml +1 -1
  186. data/spec/support/sdam/rs/hosts_differ_from_seeds.yml +1 -1
  187. data/spec/support/sdam/rs/ls_timeout.yml +88 -0
  188. data/spec/support/sdam/rs/member_reconfig.yml +2 -2
  189. data/spec/support/sdam/rs/member_standalone.yml +2 -2
  190. data/spec/support/sdam/rs/new_primary.yml +2 -2
  191. data/spec/support/sdam/rs/new_primary_new_electionid.yml +3 -0
  192. data/spec/support/sdam/rs/new_primary_new_setversion.yml +3 -0
  193. data/spec/support/sdam/rs/new_primary_wrong_set_name.yml +2 -2
  194. data/spec/support/sdam/rs/non_rs_member.yml +1 -1
  195. data/spec/support/sdam/rs/normalize_case.yml +1 -1
  196. data/spec/support/sdam/rs/null_election_id.yml +4 -0
  197. data/spec/support/sdam/rs/primary_becomes_standalone.yml +2 -2
  198. data/spec/support/sdam/rs/primary_changes_set_name.yml +2 -2
  199. data/spec/support/sdam/rs/primary_disconnect.yml +2 -2
  200. data/spec/support/sdam/rs/primary_disconnect_electionid.yml +5 -0
  201. data/spec/support/sdam/rs/primary_disconnect_setversion.yml +5 -0
  202. data/spec/support/sdam/rs/primary_hint_from_secondary_with_mismatched_me.yml +58 -0
  203. data/spec/support/sdam/rs/primary_reports_new_member.yml +4 -4
  204. data/spec/support/sdam/rs/primary_to_no_primary_mismatched_me.yml +2 -2
  205. data/spec/support/sdam/rs/primary_wrong_set_name.yml +1 -1
  206. data/spec/support/sdam/rs/response_from_removed.yml +2 -2
  207. data/spec/support/sdam/rs/rsother_discovered.yml +1 -1
  208. data/spec/support/sdam/rs/sec_not_auth.yml +1 -1
  209. data/spec/support/sdam/rs/secondary_wrong_set_name.yml +1 -1
  210. data/spec/support/sdam/rs/secondary_wrong_set_name_with_primary.yml +2 -2
  211. data/spec/support/sdam/rs/setversion_without_electionid.yml +2 -0
  212. data/spec/support/sdam/rs/stepdown_change_set_name.yml +2 -2
  213. data/spec/support/sdam/rs/unexpected_mongos.yml +1 -1
  214. data/spec/support/sdam/rs/use_setversion_without_electionid.yml +3 -0
  215. data/spec/support/sdam/rs/wrong_set_name.yml +1 -1
  216. data/spec/support/sdam/sharded/ls_timeout_mongos.yml +97 -0
  217. data/spec/support/sdam/sharded/mongos_disconnect.yml +3 -3
  218. data/spec/support/sdam/sharded/multiple_mongoses.yml +1 -1
  219. data/spec/support/sdam/sharded/non_mongos_removed.yml +1 -1
  220. data/spec/support/sdam/sharded/normalize_uri_case.yml +1 -1
  221. data/spec/support/sdam/single/direct_connection_external_ip.yml +1 -1
  222. data/spec/support/sdam/single/direct_connection_mongos.yml +1 -1
  223. data/spec/support/sdam/single/direct_connection_rsarbiter.yml +1 -1
  224. data/spec/support/sdam/single/direct_connection_rsprimary.yml +1 -1
  225. data/spec/support/sdam/single/direct_connection_rssecondary.yml +1 -1
  226. data/spec/support/sdam/single/direct_connection_slave.yml +1 -1
  227. data/spec/support/sdam/single/direct_connection_standalone.yml +1 -1
  228. data/spec/support/sdam/single/ls_timeout_standalone.yml +35 -0
  229. data/spec/support/sdam/single/not_ok_response.yml +1 -1
  230. data/spec/support/sdam/single/standalone_removed.yml +1 -1
  231. data/spec/support/sdam/single/unavailable_seed.yml +1 -1
  232. data/spec/support/server_discovery_and_monitoring.rb +4 -0
  233. data/spec/support/shared/session.rb +236 -0
  234. metadata +53 -15
  235. metadata.gz.sig +0 -0
@@ -18,6 +18,8 @@ describe Mongo::Auth::X509 do
18
18
  double('cluster').tap do |cl|
19
19
  allow(cl).to receive(:topology).and_return(topology)
20
20
  allow(cl).to receive(:app_metadata).and_return(app_metadata)
21
+ allow(cl).to receive(:cluster_time).and_return(nil)
22
+ allow(cl).to receive(:update_cluster_time)
21
23
  end
22
24
  end
23
25
 
@@ -27,8 +27,11 @@ describe Mongo::BulkWrite do
27
27
  { locale: 'en_US', strength: 2 }
28
28
  end
29
29
 
30
- describe '#execute' do
30
+ let(:array_filters) do
31
+ [{ 'i.y' => 3}]
32
+ end
31
33
 
34
+ describe '#execute' do
32
35
  shared_examples_for 'an executable bulk write' do
33
36
 
34
37
  context 'when providing a bad operation' do
@@ -74,6 +77,23 @@ describe Mongo::BulkWrite do
74
77
  it 'sets the document index on the error' do
75
78
  expect(error.result[Mongo::Error::WRITE_ERRORS].first['index']).to eq(2)
76
79
  end
80
+
81
+ context 'when a session is provided' do
82
+
83
+ let(:extra_options) do
84
+ { session: session }
85
+ end
86
+
87
+ let(:client) do
88
+ authorized_client
89
+ end
90
+
91
+ let(:failed_operation) do
92
+ bulk_write.execute
93
+ end
94
+
95
+ it_behaves_like 'a failed operation using a session'
96
+ end
77
97
  end
78
98
 
79
99
  context 'when provided a single insert one' do
@@ -96,6 +116,23 @@ describe Mongo::BulkWrite do
96
116
  expect(authorized_collection.find.first['_id']).to eq(0)
97
117
  end
98
118
 
119
+ context 'when a session is provided' do
120
+
121
+ let(:operation) do
122
+ result
123
+ end
124
+
125
+ let(:extra_options) do
126
+ { session: session }
127
+ end
128
+
129
+ let(:client) do
130
+ authorized_client
131
+ end
132
+
133
+ it_behaves_like 'an operation using a session'
134
+ end
135
+
99
136
  context 'when there is a write concern error' do
100
137
 
101
138
  context 'when the server version is < 2.6' do
@@ -114,6 +151,23 @@ describe Mongo::BulkWrite do
114
151
  bulk_write_invalid_write_concern.execute
115
152
  }.to raise_error(Mongo::Error::OperationFailure)
116
153
  end
154
+
155
+ context 'when a session is provided' do
156
+
157
+ let(:extra_options) do
158
+ { session: session }
159
+ end
160
+
161
+ let(:client) do
162
+ collection_invalid_write_concern.client
163
+ end
164
+
165
+ let(:failed_operation) do
166
+ bulk_write_invalid_write_concern.execute
167
+ end
168
+
169
+ it_behaves_like 'a failed operation using a session'
170
+ end
117
171
  end
118
172
  end
119
173
  end
@@ -168,6 +222,23 @@ describe Mongo::BulkWrite do
168
222
  bulk_write_invalid_write_concern.execute
169
223
  }.to raise_error(Mongo::Error::OperationFailure)
170
224
  end
225
+
226
+ context 'when a session is provided' do
227
+
228
+ let(:extra_options) do
229
+ { session: session }
230
+ end
231
+
232
+ let(:client) do
233
+ collection_invalid_write_concern.client
234
+ end
235
+
236
+ let(:failed_operation) do
237
+ bulk_write_invalid_write_concern.execute
238
+ end
239
+
240
+ it_behaves_like 'a failed operation using a session'
241
+ end
171
242
  end
172
243
  end
173
244
  end
@@ -191,6 +262,23 @@ describe Mongo::BulkWrite do
191
262
  expect(authorized_collection.find(_id: 0).count).to eq(0)
192
263
  end
193
264
 
265
+ context 'when a session is provided' do
266
+
267
+ let(:operation) do
268
+ result
269
+ end
270
+
271
+ let(:client) do
272
+ authorized_client
273
+ end
274
+
275
+ let(:extra_options) do
276
+ { session: session }
277
+ end
278
+
279
+ it_behaves_like 'an operation using a session'
280
+ end
281
+
194
282
  context 'when there is a write concern error' do
195
283
 
196
284
  context 'when the server version is < 2.6' do
@@ -209,6 +297,23 @@ describe Mongo::BulkWrite do
209
297
  bulk_write_invalid_write_concern.execute
210
298
  }.to raise_error(Mongo::Error::OperationFailure)
211
299
  end
300
+
301
+ context 'when a session is provided' do
302
+
303
+ let(:extra_options) do
304
+ { session: session }
305
+ end
306
+
307
+ let(:client) do
308
+ collection_invalid_write_concern.client
309
+ end
310
+
311
+ let(:failed_operation) do
312
+ bulk_write_invalid_write_concern.execute
313
+ end
314
+
315
+ it_behaves_like 'a failed operation using a session'
316
+ end
212
317
  end
213
318
 
214
319
  context 'when the write has a collation specified' do
@@ -283,6 +388,111 @@ describe Mongo::BulkWrite do
283
388
  end
284
389
  end
285
390
 
391
+ context 'when bulk executing update_one' do
392
+
393
+ context 'when the write has specified arrayFilters' do
394
+
395
+ before do
396
+ authorized_collection.insert_one(_id: 1, x: [{ y: 1 }, { y: 2 }, { y: 3 }])
397
+ end
398
+
399
+ let(:requests) do
400
+ [{
401
+ update_one: {
402
+ filter: { _id: 1 },
403
+ update: { '$set' => { 'x.$[i].y' => 5 } },
404
+ array_filters: array_filters,
405
+ }
406
+ }]
407
+ end
408
+
409
+ context 'when the server selected supports arrayFilters', if: array_filters_enabled? do
410
+
411
+ let!(:result) do
412
+ bulk_write.execute
413
+ end
414
+
415
+ it 'applies the arrayFilters' do
416
+ expect(result.matched_count).to eq(1)
417
+ expect(result.modified_count).to eq(1)
418
+ expect(authorized_collection.find(_id: 1).first['x'].last['y']).to eq(5)
419
+ end
420
+ end
421
+
422
+ context 'when the server selected does not support arrayFilters', unless: array_filters_enabled? do
423
+
424
+ it 'raises an exception' do
425
+ expect {
426
+ bulk_write.execute
427
+ }.to raise_exception(Mongo::Error::UnsupportedArrayFilters)
428
+ end
429
+ end
430
+ end
431
+ end
432
+
433
+ context 'when bulk executing update_many' do
434
+
435
+ context 'when the write has specified arrayFilters' do
436
+
437
+ before do
438
+ authorized_collection.insert_many([{
439
+ _id: 1, x: [
440
+ { y: 1 },
441
+ { y: 2 },
442
+ { y: 3 }
443
+ ]
444
+ },
445
+ {
446
+ _id: 2,
447
+ x: [
448
+ { y: 3 },
449
+ { y: 2 },
450
+ { y: 1 }
451
+ ]
452
+ }])
453
+ end
454
+
455
+ let(:selector) do
456
+ { '$or' => [{ _id: 1 }, { _id: 2 }]}
457
+ end
458
+
459
+ let(:requests) do
460
+ [{
461
+ update_many: {
462
+ filter: { '$or' => [{ _id: 1 }, { _id: 2 }]},
463
+ update: { '$set' => { 'x.$[i].y' => 5 } },
464
+ array_filters: array_filters,
465
+ }
466
+ }]
467
+ end
468
+
469
+ context 'when the server selected supports arrayFilters', if: array_filters_enabled? do
470
+
471
+ let!(:result) do
472
+ bulk_write.execute
473
+ end
474
+
475
+ it 'applies the arrayFilters' do
476
+ expect(result.matched_count).to eq(2)
477
+ expect(result.modified_count).to eq(2)
478
+
479
+ docs = authorized_collection.find(selector, sort: { _id: 1 }).to_a
480
+ expect(docs[0]['x']).to eq ([{ 'y' => 1 }, { 'y' => 2 }, { 'y' => 5}])
481
+ expect(docs[1]['x']).to eq ([{ 'y' => 5 }, { 'y' => 2 }, { 'y' => 1}])
482
+ end
483
+ end
484
+
485
+ context 'when the server selected does not support arrayFilters', unless: array_filters_enabled? do
486
+
487
+ it 'raises an exception' do
488
+ expect {
489
+ bulk_write.execute
490
+ }.to raise_exception(Mongo::Error::UnsupportedArrayFilters)
491
+ end
492
+ end
493
+ end
494
+ end
495
+
286
496
  context 'when multiple documents match delete selector' do
287
497
 
288
498
  before do
@@ -329,6 +539,23 @@ describe Mongo::BulkWrite do
329
539
  expect(authorized_collection.find(_id: { '$in'=> [ 0, 1, 2 ]}).count).to eq(0)
330
540
  end
331
541
 
542
+ context 'when a session is provided' do
543
+
544
+ let(:operation) do
545
+ result
546
+ end
547
+
548
+ let(:client) do
549
+ authorized_client
550
+ end
551
+
552
+ let(:extra_options) do
553
+ { session: session }
554
+ end
555
+
556
+ it_behaves_like 'an operation using a session'
557
+ end
558
+
332
559
  context 'when there is a write concern error' do
333
560
 
334
561
  context 'when the server version is < 2.6' do
@@ -347,6 +574,23 @@ describe Mongo::BulkWrite do
347
574
  bulk_write_invalid_write_concern.execute
348
575
  }.to raise_error(Mongo::Error::OperationFailure)
349
576
  end
577
+
578
+ context 'when a session is provided' do
579
+
580
+ let(:extra_options) do
581
+ { session: session }
582
+ end
583
+
584
+ let(:client) do
585
+ collection_invalid_write_concern.client
586
+ end
587
+
588
+ let(:failed_operation) do
589
+ bulk_write_invalid_write_concern.execute
590
+ end
591
+
592
+ it_behaves_like 'a failed operation using a session'
593
+ end
350
594
  end
351
595
  end
352
596
 
@@ -446,6 +690,23 @@ describe Mongo::BulkWrite do
446
690
  expect(authorized_collection.find(_id: 0).count).to eq(0)
447
691
  end
448
692
 
693
+ context 'when a session is provided' do
694
+
695
+ let(:operation) do
696
+ result
697
+ end
698
+
699
+ let(:client) do
700
+ authorized_client
701
+ end
702
+
703
+ let(:extra_options) do
704
+ { session: session }
705
+ end
706
+
707
+ it_behaves_like 'an operation using a session'
708
+ end
709
+
449
710
  context 'when there is a write concern error' do
450
711
 
451
712
  context 'when the server version is < 2.6' do
@@ -464,6 +725,23 @@ describe Mongo::BulkWrite do
464
725
  bulk_write_invalid_write_concern.execute
465
726
  }.to raise_error(Mongo::Error::OperationFailure)
466
727
  end
728
+
729
+ context 'when a session is provided' do
730
+
731
+ let(:extra_options) do
732
+ { session: session }
733
+ end
734
+
735
+ let(:client) do
736
+ collection_invalid_write_concern.client
737
+ end
738
+
739
+ let(:failed_operation) do
740
+ bulk_write_invalid_write_concern.execute
741
+ end
742
+
743
+ it_behaves_like 'a failed operation using a session'
744
+ end
467
745
  end
468
746
  end
469
747
 
@@ -566,6 +844,23 @@ describe Mongo::BulkWrite do
566
844
  expect(authorized_collection.find(_id: { '$in'=> [ 0, 1, 2 ]}).count).to eq(0)
567
845
  end
568
846
 
847
+ context 'when a session is provided' do
848
+
849
+ let(:operation) do
850
+ result
851
+ end
852
+
853
+ let(:client) do
854
+ authorized_client
855
+ end
856
+
857
+ let(:extra_options) do
858
+ { session: session }
859
+ end
860
+
861
+ it_behaves_like 'an operation using a session'
862
+ end
863
+
569
864
  context 'when there is a write concern error' do
570
865
 
571
866
  context 'when the server version is < 2.6' do
@@ -584,6 +879,23 @@ describe Mongo::BulkWrite do
584
879
  bulk_write_invalid_write_concern.execute
585
880
  }.to raise_error(Mongo::Error::OperationFailure)
586
881
  end
882
+
883
+ context 'when a session is provided' do
884
+
885
+ let(:operation) do
886
+ result
887
+ end
888
+
889
+ let(:client) do
890
+ authorized_client
891
+ end
892
+
893
+ let(:extra_options) do
894
+ { session: session }
895
+ end
896
+
897
+ it_behaves_like 'an operation using a session'
898
+ end
587
899
  end
588
900
  end
589
901
 
@@ -690,6 +1002,23 @@ describe Mongo::BulkWrite do
690
1002
  expect(authorized_collection.find(_id: 0).first[:name]).to eq('test')
691
1003
  end
692
1004
 
1005
+ context 'when a session is provided' do
1006
+
1007
+ let(:operation) do
1008
+ result
1009
+ end
1010
+
1011
+ let(:client) do
1012
+ authorized_client
1013
+ end
1014
+
1015
+ let(:extra_options) do
1016
+ { session: session }
1017
+ end
1018
+
1019
+ it_behaves_like 'an operation using a session'
1020
+ end
1021
+
693
1022
  context 'when there is a write concern error' do
694
1023
 
695
1024
  context 'when the server version is < 2.6' do
@@ -708,6 +1037,23 @@ describe Mongo::BulkWrite do
708
1037
  bulk_write_invalid_write_concern.execute
709
1038
  }.to raise_error(Mongo::Error::OperationFailure)
710
1039
  end
1040
+
1041
+ context 'when a session is provided' do
1042
+
1043
+ let(:extra_options) do
1044
+ { session: session }
1045
+ end
1046
+
1047
+ let(:client) do
1048
+ collection_invalid_write_concern.client
1049
+ end
1050
+
1051
+ let(:failed_operation) do
1052
+ bulk_write_invalid_write_concern.execute
1053
+ end
1054
+
1055
+ it_behaves_like 'a failed operation using a session'
1056
+ end
711
1057
  end
712
1058
  end
713
1059
 
@@ -860,6 +1206,23 @@ describe Mongo::BulkWrite do
860
1206
  expect(result.matched_count).to eq(1)
861
1207
  end
862
1208
 
1209
+ context 'when a session is provided' do
1210
+
1211
+ let(:operation) do
1212
+ result
1213
+ end
1214
+
1215
+ let(:client) do
1216
+ authorized_client
1217
+ end
1218
+
1219
+ let(:extra_options) do
1220
+ { session: session }
1221
+ end
1222
+
1223
+ it_behaves_like 'an operation using a session'
1224
+ end
1225
+
863
1226
  context 'when documents match but are not modified' do
864
1227
 
865
1228
  before do
@@ -923,6 +1286,23 @@ describe Mongo::BulkWrite do
923
1286
  bulk_write_invalid_write_concern.execute
924
1287
  }.to raise_error(Mongo::Error::OperationFailure)
925
1288
  end
1289
+
1290
+ context 'when a session is provided' do
1291
+
1292
+ let(:extra_options) do
1293
+ { session: session }
1294
+ end
1295
+
1296
+ let(:client) do
1297
+ collection_invalid_write_concern.client
1298
+ end
1299
+
1300
+ let(:failed_operation) do
1301
+ bulk_write_invalid_write_concern.execute
1302
+ end
1303
+
1304
+ it_behaves_like 'a failed operation using a session'
1305
+ end
926
1306
  end
927
1307
  end
928
1308
  end
@@ -1701,6 +2081,23 @@ describe Mongo::BulkWrite do
1701
2081
  it 'combines the inserted ids' do
1702
2082
  expect(result.inserted_ids.size).to eq(1001)
1703
2083
  end
2084
+
2085
+ context 'when a session is provided' do
2086
+
2087
+ let(:operation) do
2088
+ result
2089
+ end
2090
+
2091
+ let(:client) do
2092
+ authorized_client
2093
+ end
2094
+
2095
+ let(:extra_options) do
2096
+ { session: session }
2097
+ end
2098
+
2099
+ it_behaves_like 'an operation using a session'
2100
+ end
1704
2101
  end
1705
2102
  end
1706
2103
 
@@ -1719,17 +2116,42 @@ describe Mongo::BulkWrite do
1719
2116
  it 'inserts the documents' do
1720
2117
  expect(result.inserted_count).to eq(5)
1721
2118
  end
2119
+
2120
+ context 'when a session is provided' do
2121
+
2122
+ let(:operation) do
2123
+ result
2124
+ end
2125
+
2126
+ let(:client) do
2127
+ authorized_client
2128
+ end
2129
+
2130
+ let(:extra_options) do
2131
+ { session: session }
2132
+ end
2133
+
2134
+ it_behaves_like 'an operation using a session'
2135
+ end
1722
2136
  end
1723
2137
  end
1724
2138
 
1725
2139
  context 'when the bulk write is unordered' do
1726
2140
 
1727
2141
  let(:bulk_write) do
1728
- described_class.new(authorized_collection, requests, ordered: false)
2142
+ described_class.new(authorized_collection, requests, options)
2143
+ end
2144
+
2145
+ let(:options) do
2146
+ { ordered: false }.merge(extra_options)
2147
+ end
2148
+
2149
+ let(:extra_options) do
2150
+ {}
1729
2151
  end
1730
2152
 
1731
2153
  let(:bulk_write_invalid_write_concern) do
1732
- described_class.new(collection_invalid_write_concern, requests, ordered: false)
2154
+ described_class.new(collection_invalid_write_concern, requests, options)
1733
2155
  end
1734
2156
 
1735
2157
  it_behaves_like 'an executable bulk write'
@@ -1738,11 +2160,19 @@ describe Mongo::BulkWrite do
1738
2160
  context 'when the bulk write is ordered' do
1739
2161
 
1740
2162
  let(:bulk_write) do
1741
- described_class.new(authorized_collection, requests, ordered: true)
2163
+ described_class.new(authorized_collection, requests, options)
2164
+ end
2165
+
2166
+ let(:options) do
2167
+ { ordered: true }.merge(extra_options)
2168
+ end
2169
+
2170
+ let(:extra_options) do
2171
+ {}
1742
2172
  end
1743
2173
 
1744
2174
  let(:bulk_write_invalid_write_concern) do
1745
- described_class.new(collection_invalid_write_concern, requests, ordered: true)
2175
+ described_class.new(collection_invalid_write_concern, requests, options)
1746
2176
  end
1747
2177
 
1748
2178
  it_behaves_like 'an executable bulk write'