mongo 2.0.6 → 2.1.0.beta

Sign up to get free protection for your applications and to get access to all the features.
Files changed (119) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data.tar.gz.sig +0 -0
  4. data/lib/mongo.rb +2 -0
  5. data/lib/mongo/bulk_write.rb +1 -0
  6. data/lib/mongo/bulk_write/bulk_writable.rb +87 -31
  7. data/lib/mongo/bulk_write/deletable.rb +8 -7
  8. data/lib/mongo/bulk_write/insertable.rb +4 -3
  9. data/lib/mongo/bulk_write/ordered_bulk_write.rb +6 -6
  10. data/lib/mongo/bulk_write/replacable.rb +4 -3
  11. data/lib/mongo/bulk_write/result.rb +138 -0
  12. data/lib/mongo/bulk_write/unordered_bulk_write.rb +5 -8
  13. data/lib/mongo/bulk_write/updatable.rb +8 -7
  14. data/lib/mongo/client.rb +36 -4
  15. data/lib/mongo/cluster.rb +39 -4
  16. data/lib/mongo/cluster/topology/replica_set.rb +20 -4
  17. data/lib/mongo/cluster/topology/sharded.rb +1 -1
  18. data/lib/mongo/collection.rb +282 -29
  19. data/lib/mongo/collection/view/aggregation.rb +32 -4
  20. data/lib/mongo/collection/view/iterable.rb +2 -1
  21. data/lib/mongo/collection/view/map_reduce.rb +3 -1
  22. data/lib/mongo/collection/view/readable.rb +89 -14
  23. data/lib/mongo/collection/view/writable.rb +11 -5
  24. data/lib/mongo/cursor.rb +11 -3
  25. data/lib/mongo/dbref.rb +113 -0
  26. data/lib/mongo/error.rb +6 -2
  27. data/lib/mongo/error/parser.rb +1 -1
  28. data/lib/mongo/event/description_changed.rb +1 -1
  29. data/lib/mongo/grid/file.rb +1 -1
  30. data/lib/mongo/grid/fs.rb +2 -5
  31. data/lib/mongo/monitoring.rb +199 -0
  32. data/lib/mongo/monitoring/command_log_subscriber.rb +88 -0
  33. data/lib/mongo/monitoring/event.rb +17 -0
  34. data/lib/mongo/monitoring/event/command_failed.rb +96 -0
  35. data/lib/mongo/monitoring/event/command_started.rb +88 -0
  36. data/lib/mongo/monitoring/event/command_succeeded.rb +96 -0
  37. data/lib/mongo/monitoring/publishable.rb +96 -0
  38. data/lib/mongo/operation.rb +1 -0
  39. data/lib/mongo/operation/executable.rb +1 -1
  40. data/lib/mongo/operation/parallel_scan.rb +76 -0
  41. data/lib/mongo/operation/parallel_scan/result.rb +72 -0
  42. data/lib/mongo/operation/specifiable.rb +18 -0
  43. data/lib/mongo/operation/write/bulk/bulk_delete.rb +1 -1
  44. data/lib/mongo/operation/write/bulk/bulk_insert.rb +1 -1
  45. data/lib/mongo/operation/write/bulk/bulk_mergable.rb +2 -2
  46. data/lib/mongo/operation/write/bulk/bulk_update.rb +1 -1
  47. data/lib/mongo/operation/write/bulk/bulk_update/result.rb +13 -1
  48. data/lib/mongo/protocol/delete.rb +8 -13
  49. data/lib/mongo/protocol/get_more.rb +13 -13
  50. data/lib/mongo/protocol/insert.rb +8 -13
  51. data/lib/mongo/protocol/kill_cursors.rb +7 -11
  52. data/lib/mongo/protocol/query.rb +58 -20
  53. data/lib/mongo/protocol/reply.rb +12 -0
  54. data/lib/mongo/protocol/update.rb +13 -14
  55. data/lib/mongo/server.rb +23 -2
  56. data/lib/mongo/server/connectable.rb +0 -22
  57. data/lib/mongo/server/connection.rb +29 -0
  58. data/lib/mongo/server/description.rb +23 -1
  59. data/lib/mongo/server/monitor.rb +17 -1
  60. data/lib/mongo/server/monitor/connection.rb +24 -0
  61. data/lib/mongo/socket/ssl.rb +28 -16
  62. data/lib/mongo/socket/tcp.rb +1 -1
  63. data/lib/mongo/socket/unix.rb +1 -1
  64. data/lib/mongo/uri.rb +12 -5
  65. data/lib/mongo/version.rb +1 -1
  66. data/spec/mongo/auth/cr_spec.rb +9 -1
  67. data/spec/mongo/auth/ldap_spec.rb +9 -1
  68. data/spec/mongo/auth/scram_spec.rb +9 -1
  69. data/spec/mongo/auth/x509_spec.rb +9 -1
  70. data/spec/mongo/{bulk/bulk_write_spec.rb → bulk_write_spec.rb} +15 -15
  71. data/spec/mongo/client_spec.rb +42 -0
  72. data/spec/mongo/cluster/topology/replica_set_spec.rb +16 -9
  73. data/spec/mongo/cluster/topology/sharded_spec.rb +11 -3
  74. data/spec/mongo/cluster/topology/single_spec.rb +12 -4
  75. data/spec/mongo/cluster_spec.rb +55 -10
  76. data/spec/mongo/collection/view/aggregation_spec.rb +123 -1
  77. data/spec/mongo/collection/view/explainable_spec.rb +1 -1
  78. data/spec/mongo/collection/view/map_reduce_spec.rb +1 -1
  79. data/spec/mongo/collection/view/readable_spec.rb +251 -6
  80. data/spec/mongo/collection/view/writable_spec.rb +4 -4
  81. data/spec/mongo/collection/view_spec.rb +233 -71
  82. data/spec/mongo/collection_spec.rb +905 -9
  83. data/spec/mongo/crud_spec.rb +2 -2
  84. data/spec/mongo/cursor_spec.rb +3 -3
  85. data/spec/mongo/dbref_spec.rb +149 -0
  86. data/spec/mongo/monitoring_spec.rb +168 -0
  87. data/spec/mongo/operation/map_reduce_spec.rb +1 -1
  88. data/spec/mongo/operation/write/bulk/bulk_delete_spec.rb +1 -1
  89. data/spec/mongo/operation/write/bulk/bulk_insert_spec.rb +2 -2
  90. data/spec/mongo/operation/write/bulk/bulk_update_spec.rb +1 -1
  91. data/spec/mongo/operation/write/delete_spec.rb +1 -1
  92. data/spec/mongo/operation/write/insert_spec.rb +2 -2
  93. data/spec/mongo/operation/write/update_spec.rb +1 -1
  94. data/spec/mongo/protocol/query_spec.rb +0 -29
  95. data/spec/mongo/server/connection_pool_spec.rb +18 -6
  96. data/spec/mongo/server/connection_spec.rb +12 -4
  97. data/spec/mongo/server/description_spec.rb +7 -3
  98. data/spec/mongo/server/monitor_spec.rb +30 -0
  99. data/spec/mongo/server_discovery_and_monitoring_spec.rb +11 -4
  100. data/spec/mongo/server_selection_spec.rb +14 -6
  101. data/spec/mongo/server_spec.rb +27 -8
  102. data/spec/mongo/socket/ssl_spec.rb +94 -8
  103. data/spec/mongo/uri_spec.rb +25 -9
  104. data/spec/spec_helper.rb +29 -20
  105. data/spec/support/authorization.rb +19 -4
  106. data/spec/support/certificates/client.pem +4 -4
  107. data/spec/support/crud/read.rb +9 -10
  108. data/spec/support/crud/write.rb +24 -20
  109. data/spec/support/sdam/rs/equal_electionids.yml +45 -0
  110. data/spec/support/sdam/rs/new_primary_new_electionid.yml +98 -0
  111. data/spec/support/sdam/rs/null_election_id.yml +144 -0
  112. data/spec/support/sdam/rs/primary_disconnect_electionid.yml +124 -0
  113. data/spec/support/sdam/sharded/mongos_disconnect.yml +104 -0
  114. data/spec/support/server_discovery_and_monitoring.rb +19 -2
  115. data/spec/support/shared/bulk_write.rb +26 -22
  116. data/spec/support/shared/server_selector.rb +2 -1
  117. metadata +31 -7
  118. metadata.gz.sig +0 -0
  119. data/lib/mongo/error/invalid_uri_option.rb +0 -38
@@ -19,7 +19,6 @@ module Mongo
19
19
  #
20
20
  # @since 2.0.0
21
21
  module Connectable
22
- include Loggable
23
22
 
24
23
  # The default time in seconds to timeout a connection attempt.
25
24
  #
@@ -47,27 +46,6 @@ module Mongo
47
46
  !!@socket && @socket.alive?
48
47
  end
49
48
 
50
- # Dispatch the provided messages to the connection. If the last message
51
- # requires a response a reply will be returned.
52
- #
53
- # @example Dispatch the messages.
54
- # connection.dispatch([ insert, command ])
55
- #
56
- # @note This method is named dispatch since 'send' is a core Ruby method on
57
- # all objects.
58
- #
59
- # @param [ Array<Message> ] messages The messages to dispatch.
60
- #
61
- # @return [ Protocol::Reply ] The reply if needed.
62
- #
63
- # @since 2.0.0
64
- def dispatch(messages)
65
- log_debug(messages) do |msgs|
66
- write(msgs)
67
- msgs.last.replyable? ? read : nil
68
- end
69
- end
70
-
71
49
  # Get the connection timeout.
72
50
  #
73
51
  # @example Get the connection timeout.
@@ -20,6 +20,7 @@ module Mongo
20
20
  # @since 2.0.0
21
21
  class Connection
22
22
  include Connectable
23
+ include Monitoring::Publishable
23
24
  extend Forwardable
24
25
 
25
26
  # @return [ Mongo::Auth::CR, Mongo::Auth::X509, Mongo::Auth:LDAP, Mongo::Auth::SCRAM ]
@@ -88,17 +89,45 @@ module Mongo
88
89
  true
89
90
  end
90
91
 
92
+ # Dispatch the provided messages to the connection. If the last message
93
+ # requires a response a reply will be returned.
94
+ #
95
+ # @example Dispatch the messages.
96
+ # connection.dispatch([ insert, command ])
97
+ #
98
+ # @note This method is named dispatch since 'send' is a core Ruby method on
99
+ # all objects.
100
+ #
101
+ # @param [ Array<Message> ] messages The messages to dispatch.
102
+ # @param [ Integer ] operation_id The operation id to link messages.
103
+ #
104
+ # @return [ Protocol::Reply ] The reply if needed.
105
+ #
106
+ # @since 2.0.0
107
+ def dispatch(messages, operation_id = nil)
108
+ publish_command(messages, operation_id || Monitoring.next_operation_id) do |msgs|
109
+ write(msgs)
110
+ msgs.last.replyable? ? read : nil
111
+ end
112
+ end
113
+
91
114
  # Initialize a new socket connection from the client to the server.
92
115
  #
116
+ # @api private
117
+ #
93
118
  # @example Create the connection.
94
119
  # Connection.new(server)
95
120
  #
121
+ # @note Connection must never be directly instantiated outside of a
122
+ # Server.
123
+ #
96
124
  # @param [ Mongo::Server ] server The server the connection is for.
97
125
  # @param [ Hash ] options The connection options.
98
126
  #
99
127
  # @since 2.0.0
100
128
  def initialize(server, options = {})
101
129
  @address = server.address
130
+ @monitoring = server.monitoring
102
131
  @options = options.freeze
103
132
  @server = server
104
133
  @ssl_options = options.reject { |k, v| !k.to_s.start_with?('ssl') }
@@ -124,10 +124,20 @@ module Mongo
124
124
  # @since 2.0.0
125
125
  TAGS = 'tags'.freeze
126
126
 
127
+ # Constant for reading electionID info from config.
128
+ #
129
+ # @since 2.1.0
130
+ ELECTION_ID = 'electionId'.freeze
131
+
132
+ # Constant for reading localTime info from config.
133
+ #
134
+ # @since 2.1.0
135
+ LOCAL_TIME = 'localTime'.freeze
136
+
127
137
  # Fields to exclude when comparing two descriptions.
128
138
  #
129
139
  # @since 2.0.6
130
- EXCLUDE_FOR_COMPARISON = [ 'localTime' ]
140
+ EXCLUDE_FOR_COMPARISON = [ LOCAL_TIME, ELECTION_ID ]
131
141
 
132
142
  # @return [ Address ] address The server's address.
133
143
  attr_reader :address
@@ -304,6 +314,18 @@ module Mongo
304
314
  config[TAGS] || {}
305
315
  end
306
316
 
317
+ # Get the electionId from the config.
318
+ #
319
+ # @example Get the electionId.
320
+ # description.election_id
321
+ #
322
+ # @return [ BSON::ObjectId ] The election id.
323
+ #
324
+ # @since 2.1.0
325
+ def election_id
326
+ config[ELECTION_ID]
327
+ end
328
+
307
329
  # Is the server a mongos?
308
330
  #
309
331
  # @example Is the server a mongos?
@@ -91,9 +91,13 @@ module Mongo
91
91
 
92
92
  # Create the new server monitor.
93
93
  #
94
+ # @api private
95
+ #
94
96
  # @example Create the server monitor.
95
97
  # Mongo::Server::Monitor.new(address, listeners)
96
98
  #
99
+ # @note Monitor must never be directly instantiated outside of a Server.
100
+ #
97
101
  # @param [ Address ] address The address to monitor.
98
102
  # @param [ Event::Listeners ] listeners The event listeners.
99
103
  # @param [ Hash ] options The options.
@@ -112,7 +116,7 @@ module Mongo
112
116
  # server.
113
117
  #
114
118
  # @example Run the monitor.
115
- # monito.run
119
+ # monitor.run
116
120
  #
117
121
  # @return [ Thread ] The thread the monitor runs on.
118
122
  #
@@ -139,6 +143,18 @@ module Mongo
139
143
  @thread.kill && @thread.stop?
140
144
  end
141
145
 
146
+ # Restarts the server monitor unless the current thread is alive.
147
+ #
148
+ # @example Restart the monitor.
149
+ # monitor.restart!
150
+ #
151
+ # @return [ Thread ] The thread the monitor runs on.
152
+ #
153
+ # @since 2.1.0
154
+ def restart!
155
+ @thread.alive? ? @thread : run!
156
+ end
157
+
142
158
  private
143
159
 
144
160
  def average_round_trip_time(start)
@@ -60,11 +60,35 @@ module Mongo
60
60
  true
61
61
  end
62
62
 
63
+ # Dispatch the provided messages to the connection. If the last message
64
+ # requires a response a reply will be returned.
65
+ #
66
+ # @example Dispatch the messages.
67
+ # connection.dispatch([ insert, command ])
68
+ #
69
+ # @note This method is named dispatch since 'send' is a core Ruby method on
70
+ # all objects.
71
+ #
72
+ # @param [ Array<Message> ] messages The messages to dispatch.
73
+ #
74
+ # @return [ Protocol::Reply ] The reply if needed.
75
+ #
76
+ # @since 2.0.0
77
+ def dispatch(messages)
78
+ write(messages)
79
+ messages.last.replyable? ? read : nil
80
+ end
81
+
63
82
  # Initialize a new socket connection from the client to the server.
64
83
  #
84
+ # @api private
85
+ #
65
86
  # @example Create the connection.
66
87
  # Connection.new(address)
67
88
  #
89
+ # @note Connection must never be directly instantiated outside of a
90
+ # Monitor.
91
+ #
68
92
  # @param [ Mongo::Address ] address The address the connection is for.
69
93
  # @param [ Hash ] options The connection options.
70
94
  #
@@ -54,10 +54,10 @@ module Mongo
54
54
  # @since 2.0.0
55
55
  def connect!
56
56
  Timeout.timeout(timeout, Error::SocketTimeoutError) do
57
- @tcp_socket.connect(::Socket.pack_sockaddr_in(port, host))
57
+ handle_errors { @tcp_socket.connect(::Socket.pack_sockaddr_in(port, host)) }
58
58
  @socket = OpenSSL::SSL::SSLSocket.new(@tcp_socket, context)
59
59
  @socket.sync_close = true
60
- @socket.connect
60
+ handle_errors { @socket.connect }
61
61
  verify_certificate!(@socket)
62
62
  self
63
63
  end
@@ -100,22 +100,34 @@ module Mongo
100
100
 
101
101
  def create_context(options)
102
102
  context = OpenSSL::SSL::SSLContext.new
103
- if options[:ssl_cert]
104
- context.cert = OpenSSL::X509::Certificate.new(File.open(options[:ssl_cert]))
105
- end
106
- if options[:ssl_key]
107
- if options[:ssl_key_pass_phrase]
108
- context.key = OpenSSL::PKey::RSA.new(File.open(options[:ssl_key]),
109
- options[:ssl_key_pass_phrase])
110
- else
111
- context.key = OpenSSL::PKey::RSA.new(File.open(options[:ssl_key]))
112
- end
103
+ set_cert(context, options) if options[:ssl_cert]
104
+ set_key(context, options) if options[:ssl_key]
105
+ set_cert_verification(context, options) unless options[:ssl_verify] == false
106
+ context
107
+ end
108
+
109
+ def set_cert(context, options)
110
+ context.cert = OpenSSL::X509::Certificate.new(File.open(options[:ssl_cert]))
111
+ end
112
+
113
+ def set_key(context, options)
114
+ if options[:ssl_key_pass_phrase]
115
+ context.key = OpenSSL::PKey::RSA.new(File.open(options[:ssl_key]),
116
+ options[:ssl_key_pass_phrase])
117
+ else
118
+ context.key = OpenSSL::PKey::RSA.new(File.open(options[:ssl_key]))
113
119
  end
114
- if options[:ssl_verify] || options[:ssl_ca_cert]
115
- context.ca_file = options[:ssl_ca_cert]
116
- context.verify_mode = OpenSSL::SSL::VERIFY_PEER
120
+ end
121
+
122
+ def set_cert_verification(context, options)
123
+ context.verify_mode = OpenSSL::SSL::VERIFY_PEER
124
+ cert_store = OpenSSL::X509::Store.new
125
+ if options[:ssl_ca_cert]
126
+ cert_store.add_file(options[:ssl_ca_cert])
127
+ else
128
+ cert_store.set_default_paths
117
129
  end
118
- context
130
+ context.cert_store = cert_store
119
131
  end
120
132
 
121
133
  def verify_certificate!(socket)
@@ -43,7 +43,7 @@ module Mongo
43
43
  def connect!
44
44
  Timeout.timeout(timeout, Error::SocketTimeoutError) do
45
45
  socket.setsockopt(IPPROTO_TCP, TCP_NODELAY, 1)
46
- socket.connect(::Socket.pack_sockaddr_in(port, host))
46
+ handle_errors { socket.connect(::Socket.pack_sockaddr_in(port, host)) }
47
47
  self
48
48
  end
49
49
  end
@@ -39,7 +39,7 @@ module Mongo
39
39
  # @since 2.0.0
40
40
  def connect!
41
41
  Timeout.timeout(timeout, Error::SocketTimeoutError) do
42
- socket.connect(path)
42
+ handle_errors { socket.connect(path) }
43
43
  self
44
44
  end
45
45
  end
@@ -27,6 +27,7 @@ module Mongo
27
27
  #
28
28
  # @since 2.0.0
29
29
  class URI
30
+ include Loggable
30
31
 
31
32
  # Scheme Regex: non-capturing, matches scheme.
32
33
  #
@@ -69,7 +70,7 @@ module Mongo
69
70
  # @since 2.0.0
70
71
  DATABASE = %r{(?:/([^/\.\ "*<>:\|\?]*))?}.freeze
71
72
 
72
- # Option Regex: notably only matches the ampersand separator and does
73
+ # Option Regex: only matches the ampersand separator and does
73
74
  # not allow for semicolon to be used to separate options.
74
75
  #
75
76
  # @since 2.0.0
@@ -123,7 +124,8 @@ module Mongo
123
124
  #
124
125
  # @since 2.0.0
125
126
  def initialize(string)
126
- @match = string.match(URI)
127
+ @string = string
128
+ @match = @string.match(URI)
127
129
  raise Error::InvalidURI.new(string) unless @match
128
130
  end
129
131
 
@@ -210,8 +212,13 @@ module Mongo
210
212
  parsed_options.split('&').reduce({}) do |options, option|
211
213
  key, value = option.split('=')
212
214
  strategy = OPTION_MAP[key]
213
- raise Error::InvalidURIOption.new(key) if strategy.nil?
214
- add_option(strategy, value, options)
215
+ if strategy.nil?
216
+ log_warn([
217
+ "Unsupported URI option '#{key}' on URI '#{@string}'. It will be ignored."
218
+ ])
219
+ else
220
+ add_option(strategy, value, options)
221
+ end
215
222
  options
216
223
  end
217
224
  end
@@ -243,7 +250,7 @@ module Mongo
243
250
 
244
251
  # Write Options
245
252
  option 'w', :w, :group => :write
246
- option 'j', :j, :group => :write
253
+ option 'journal', :j, :group => :write
247
254
  option 'fsync', :fsync, :group => :write
248
255
  option 'wtimeoutMS', :timeout, :group => :write
249
256
 
@@ -17,5 +17,5 @@ module Mongo
17
17
  # The current version of the driver.
18
18
  #
19
19
  # @since 2.0.0
20
- VERSION = '2.0.6'.freeze
20
+ VERSION = '2.1.0.beta'.freeze
21
21
  end
@@ -6,8 +6,16 @@ describe Mongo::Auth::CR do
6
6
  Mongo::Address.new(DEFAULT_ADDRESS)
7
7
  end
8
8
 
9
+ let(:monitoring) do
10
+ Mongo::Monitoring.new
11
+ end
12
+
13
+ let(:listeners) do
14
+ Mongo::Event::Listeners.new
15
+ end
16
+
9
17
  let(:server) do
10
- Mongo::Server.new(address, double('cluster'), Mongo::Event::Listeners.new, TEST_OPTIONS)
18
+ Mongo::Server.new(address, double('cluster'), monitoring, listeners, TEST_OPTIONS)
11
19
  end
12
20
 
13
21
  let(:connection) do
@@ -6,8 +6,16 @@ describe Mongo::Auth::LDAP do
6
6
  Mongo::Address.new(DEFAULT_ADDRESS)
7
7
  end
8
8
 
9
+ let(:monitoring) do
10
+ Mongo::Monitoring.new
11
+ end
12
+
13
+ let(:listeners) do
14
+ Mongo::Event::Listeners.new
15
+ end
16
+
9
17
  let(:server) do
10
- Mongo::Server.new(address, double('cluster'), Mongo::Event::Listeners.new, TEST_OPTIONS)
18
+ Mongo::Server.new(address, double('cluster'), monitoring, listeners, TEST_OPTIONS)
11
19
  end
12
20
 
13
21
  let(:connection) do
@@ -6,8 +6,16 @@ describe Mongo::Auth::SCRAM do
6
6
  Mongo::Address.new(DEFAULT_ADDRESS)
7
7
  end
8
8
 
9
+ let(:monitoring) do
10
+ Mongo::Monitoring.new
11
+ end
12
+
13
+ let(:listeners) do
14
+ Mongo::Event::Listeners.new
15
+ end
16
+
9
17
  let(:server) do
10
- Mongo::Server.new(address, double('cluster'), Mongo::Event::Listeners.new, TEST_OPTIONS)
18
+ Mongo::Server.new(address, double('cluster'), monitoring, listeners, TEST_OPTIONS)
11
19
  end
12
20
 
13
21
  let(:connection) do
@@ -6,8 +6,16 @@ describe Mongo::Auth::X509 do
6
6
  Mongo::Address.new(DEFAULT_ADDRESS)
7
7
  end
8
8
 
9
+ let(:monitoring) do
10
+ Mongo::Monitoring.new
11
+ end
12
+
13
+ let(:listeners) do
14
+ Mongo::Event::Listeners.new
15
+ end
16
+
9
17
  let(:server) do
10
- Mongo::Server.new(address, double('cluster'), Mongo::Event::Listeners.new, TEST_OPTIONS)
18
+ Mongo::Server.new(address, double('cluster'), monitoring, listeners, TEST_OPTIONS)
11
19
  end
12
20
 
13
21
  let(:connection) do
@@ -3,11 +3,11 @@ require 'spec_helper'
3
3
  describe Mongo::BulkWrite do
4
4
 
5
5
  before do
6
- authorized_collection.find.delete_many
6
+ authorized_collection.delete_many
7
7
  end
8
8
 
9
9
  after do
10
- authorized_collection.find.delete_many
10
+ authorized_collection.delete_many
11
11
  end
12
12
 
13
13
  let(:bulk) do
@@ -59,13 +59,13 @@ describe Mongo::BulkWrite do
59
59
  let(:options) do
60
60
  { ordered: true }
61
61
  end
62
-
62
+
63
63
  it_behaves_like 'a bulk write object'
64
-
64
+
65
65
  context 'when the batch requires splitting' do
66
-
66
+
67
67
  context 'when the operations are the same type' do
68
-
68
+
69
69
  let(:error) do
70
70
  begin
71
71
  bulk.execute
@@ -73,7 +73,7 @@ describe Mongo::BulkWrite do
73
73
  ex
74
74
  end
75
75
  end
76
-
76
+
77
77
  let(:operations) do
78
78
  [].tap do |ops|
79
79
  3000.times do |i|
@@ -83,13 +83,13 @@ describe Mongo::BulkWrite do
83
83
  ops << { insert_one: { _id: 3001 } }
84
84
  end
85
85
  end
86
-
86
+
87
87
  it 'raises a BulkWriteError' do
88
88
  expect(error).to be_a(Mongo::Error::BulkWriteError)
89
89
  end
90
90
 
91
91
  it 'halts execution after first error and reports correct index' do
92
- expect(error.result[:write_errors].first['index']).to eq(3000)
92
+ expect(error.result[Mongo::Error::WRITE_ERRORS].first['index']).to eq(3000)
93
93
  expect(authorized_collection.find.count).to eq(3000)
94
94
  end
95
95
  end
@@ -120,7 +120,7 @@ describe Mongo::BulkWrite do
120
120
  end
121
121
 
122
122
  it 'halts execution after first error and reports correct index' do
123
- expect(error.result[:write_errors].first['index']).to eq(2001)
123
+ expect(error.result[Mongo::Error::WRITE_ERRORS].first['index']).to eq(2001)
124
124
  expect(authorized_collection.find.count).to eq(1999)
125
125
  end
126
126
  end
@@ -134,7 +134,7 @@ describe Mongo::BulkWrite do
134
134
  ex
135
135
  end
136
136
  end
137
-
137
+
138
138
  let(:operations) do
139
139
  [].tap do |ops|
140
140
  6.times do |i|
@@ -144,11 +144,11 @@ describe Mongo::BulkWrite do
144
144
  ops << { insert_one: { _id: 100 } }
145
145
  end
146
146
  end
147
-
147
+
148
148
  it 'raises a BulkWriteError error' do
149
149
  expect(error).to be_a(Mongo::Error::BulkWriteError)
150
150
  end
151
-
151
+
152
152
  it 'splits messages into multiple messages' do
153
153
  error
154
154
  expect(authorized_collection.find.count).to eq(6)
@@ -192,7 +192,7 @@ describe Mongo::BulkWrite do
192
192
  end
193
193
 
194
194
  it 'does not halt execution after first error' do
195
- expect(error.result[:write_errors].first['index']).to eq(3000)
195
+ expect(error.result[Mongo::Error::WRITE_ERRORS].first['index']).to eq(3000)
196
196
  expect(authorized_collection.find.count).to eq(3001)
197
197
  end
198
198
  end
@@ -223,7 +223,7 @@ describe Mongo::BulkWrite do
223
223
  end
224
224
 
225
225
  it 'does not halt execution after first error' do
226
- expect(error.result[:write_errors].first['index']).to eq(2001)
226
+ expect(error.result[Mongo::Error::WRITE_ERRORS].first['index']).to eq(2001)
227
227
  expect(authorized_collection.find.count).to eq(2000)
228
228
  end
229
229
  end