mongo 2.4.3 → 2.5.0.beta

Sign up to get free protection for your applications and to get access to all the features.
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'