mongo 2.1.0.beta → 2.1.0.rc0

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 (253) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data.tar.gz.sig +0 -0
  4. data/Rakefile +2 -2
  5. data/lib/mongo.rb +2 -3
  6. data/lib/mongo/address.rb +7 -5
  7. data/lib/mongo/address/unix.rb +2 -2
  8. data/lib/mongo/auth/ldap/conversation.rb +6 -2
  9. data/lib/mongo/auth/scram/conversation.rb +8 -2
  10. data/lib/mongo/auth/user/view.rb +21 -0
  11. data/lib/mongo/bulk_write.rb +155 -23
  12. data/lib/mongo/bulk_write/combineable.rb +51 -0
  13. data/lib/mongo/bulk_write/ordered_combiner.rb +55 -0
  14. data/lib/mongo/bulk_write/result.rb +61 -8
  15. data/lib/mongo/bulk_write/result_combiner.rb +117 -0
  16. data/lib/mongo/bulk_write/transformable.rb +117 -0
  17. data/lib/mongo/bulk_write/unordered_combiner.rb +52 -0
  18. data/lib/mongo/bulk_write/validatable.rb +62 -0
  19. data/lib/mongo/client.rb +7 -3
  20. data/lib/mongo/cluster.rb +3 -3
  21. data/lib/mongo/cluster/topology/replica_set.rb +8 -6
  22. data/lib/mongo/cluster/topology/unknown.rb +5 -2
  23. data/lib/mongo/collection.rb +75 -4
  24. data/lib/mongo/collection/view.rb +1 -2
  25. data/lib/mongo/collection/view/aggregation.rb +13 -8
  26. data/lib/mongo/collection/view/immutable.rb +6 -6
  27. data/lib/mongo/collection/view/iterable.rb +13 -4
  28. data/lib/mongo/collection/view/map_reduce.rb +22 -17
  29. data/lib/mongo/collection/view/readable.rb +121 -70
  30. data/lib/mongo/cursor.rb +5 -1
  31. data/lib/mongo/database.rb +3 -3
  32. data/lib/mongo/database/view.rb +1 -1
  33. data/lib/mongo/error.rb +7 -0
  34. data/lib/mongo/{bulk_write/unordered_bulk_write.rb → error/closed_stream.rb} +12 -21
  35. data/lib/mongo/{bulk_write/ordered_bulk_write.rb → error/extra_file_chunk.rb} +13 -27
  36. data/lib/mongo/error/file_not_found.rb +37 -0
  37. data/lib/mongo/error/invalid_file.rb +2 -2
  38. data/lib/mongo/error/invalid_file_revision.rb +37 -0
  39. data/lib/mongo/error/invalid_uri.rb +5 -4
  40. data/lib/mongo/error/missing_file_chunk.rb +38 -0
  41. data/lib/mongo/error/operation_failure.rb +1 -1
  42. data/lib/mongo/error/unchangeable_collection_option.rb +38 -0
  43. data/lib/mongo/error/unexpected_chunk_length.rb +39 -0
  44. data/lib/mongo/grid.rb +2 -1
  45. data/lib/mongo/grid/file.rb +12 -9
  46. data/lib/mongo/grid/file/chunk.rb +6 -6
  47. data/lib/mongo/grid/file/{metadata.rb → info.rb} +41 -39
  48. data/lib/mongo/grid/fs_bucket.rb +441 -0
  49. data/lib/mongo/grid/stream.rb +64 -0
  50. data/lib/mongo/grid/stream/read.rb +208 -0
  51. data/lib/mongo/grid/stream/write.rb +187 -0
  52. data/lib/mongo/index/view.rb +1 -1
  53. data/lib/mongo/loggable.rb +34 -57
  54. data/lib/mongo/logger.rb +16 -78
  55. data/lib/mongo/monitoring.rb +1 -5
  56. data/lib/mongo/monitoring/command_log_subscriber.rb +35 -17
  57. data/lib/mongo/monitoring/event/command_succeeded.rb +20 -1
  58. data/lib/mongo/monitoring/publishable.rb +22 -12
  59. data/lib/mongo/operation.rb +3 -6
  60. data/lib/mongo/operation/commands.rb +24 -0
  61. data/lib/mongo/operation/{aggregate.rb → commands/aggregate.rb} +3 -41
  62. data/lib/mongo/operation/{aggregate → commands/aggregate}/result.rb +0 -0
  63. data/lib/mongo/operation/commands/collections_info.rb +66 -0
  64. data/lib/mongo/operation/{command.rb → commands/command.rb} +2 -18
  65. data/lib/mongo/operation/commands/indexes.rb +70 -0
  66. data/lib/mongo/operation/commands/list_collections.rb +54 -0
  67. data/lib/mongo/operation/commands/list_collections/result.rb +112 -0
  68. data/lib/mongo/operation/commands/list_indexes.rb +56 -0
  69. data/lib/mongo/operation/commands/list_indexes/result.rb +115 -0
  70. data/lib/mongo/operation/{map_reduce.rb → commands/map_reduce.rb} +3 -41
  71. data/lib/mongo/operation/{map_reduce → commands/map_reduce}/result.rb +0 -0
  72. data/lib/mongo/operation/{parallel_scan.rb → commands/parallel_scan.rb} +3 -23
  73. data/lib/mongo/operation/{parallel_scan → commands/parallel_scan}/result.rb +0 -0
  74. data/lib/mongo/operation/commands/user_query.rb +69 -0
  75. data/lib/mongo/operation/commands/users_info.rb +53 -0
  76. data/lib/mongo/operation/commands/users_info/result.rb +36 -0
  77. data/lib/mongo/operation/executable.rb +4 -68
  78. data/lib/mongo/operation/kill_cursors.rb +3 -3
  79. data/lib/mongo/operation/read.rb +0 -4
  80. data/lib/mongo/operation/read/get_more.rb +2 -22
  81. data/lib/mongo/operation/read/query.rb +2 -21
  82. data/lib/mongo/operation/{read_preferrable.rb → read_preference.rb} +3 -2
  83. data/lib/mongo/operation/specifiable.rb +24 -0
  84. data/lib/mongo/operation/write.rb +2 -0
  85. data/lib/mongo/operation/write/bulk.rb +6 -3
  86. data/lib/mongo/operation/write/bulk/bulkable.rb +82 -0
  87. data/lib/mongo/operation/write/bulk/delete.rb +71 -0
  88. data/lib/mongo/operation/write/bulk/delete/result.rb +74 -0
  89. data/lib/mongo/operation/write/bulk/insert.rb +96 -0
  90. data/lib/mongo/operation/write/bulk/insert/result.rb +129 -0
  91. data/lib/mongo/operation/write/bulk/legacy_mergable.rb +87 -0
  92. data/lib/mongo/operation/write/bulk/mergable.rb +71 -0
  93. data/lib/mongo/operation/write/bulk/update.rb +81 -0
  94. data/lib/mongo/operation/write/bulk/update/result.rb +174 -0
  95. data/lib/mongo/operation/write/command/create_index.rb +0 -1
  96. data/lib/mongo/operation/write/command/create_user.rb +0 -1
  97. data/lib/mongo/operation/write/command/delete.rb +0 -1
  98. data/lib/mongo/operation/write/command/drop_index.rb +0 -1
  99. data/lib/mongo/operation/write/command/insert.rb +0 -1
  100. data/lib/mongo/operation/write/command/remove_user.rb +0 -1
  101. data/lib/mongo/operation/write/command/update.rb +0 -1
  102. data/lib/mongo/operation/write/command/update_user.rb +0 -1
  103. data/lib/mongo/operation/write/command/writable.rb +13 -18
  104. data/lib/mongo/operation/write/create_index.rb +4 -27
  105. data/lib/mongo/operation/write/create_user.rb +4 -30
  106. data/lib/mongo/operation/write/delete.rb +5 -28
  107. data/lib/mongo/operation/write/drop_index.rb +3 -3
  108. data/lib/mongo/operation/write/gle.rb +48 -0
  109. data/lib/mongo/operation/write/idable.rb +5 -0
  110. data/lib/mongo/operation/write/insert.rb +2 -24
  111. data/lib/mongo/operation/write/remove_user.rb +4 -27
  112. data/lib/mongo/operation/write/update.rb +4 -32
  113. data/lib/mongo/operation/write/update_user.rb +4 -30
  114. data/lib/mongo/operation/write/write_command_enabled.rb +53 -0
  115. data/lib/mongo/options/mapper.rb +4 -2
  116. data/lib/mongo/protocol/delete.rb +68 -3
  117. data/lib/mongo/protocol/get_more.rb +54 -2
  118. data/lib/mongo/protocol/insert.rb +59 -1
  119. data/lib/mongo/protocol/kill_cursors.rb +53 -4
  120. data/lib/mongo/protocol/message.rb +12 -12
  121. data/lib/mongo/protocol/query.rb +139 -65
  122. data/lib/mongo/protocol/reply.rb +69 -1
  123. data/lib/mongo/protocol/update.rb +70 -1
  124. data/lib/mongo/server/connection.rb +11 -3
  125. data/lib/mongo/server/description.rb +29 -0
  126. data/lib/mongo/server/description/features.rb +2 -1
  127. data/lib/mongo/server/monitor.rb +2 -2
  128. data/lib/mongo/server_selector.rb +14 -10
  129. data/lib/mongo/server_selector/selectable.rb +24 -22
  130. data/lib/mongo/socket.rb +6 -3
  131. data/lib/mongo/socket/tcp.rb +2 -2
  132. data/lib/mongo/socket/unix.rb +5 -8
  133. data/lib/mongo/uri.rb +243 -139
  134. data/lib/mongo/version.rb +1 -1
  135. data/spec/mongo/address/unix_spec.rb +1 -1
  136. data/spec/mongo/address_spec.rb +25 -0
  137. data/spec/mongo/auth/ldap/conversation_spec.rb +43 -0
  138. data/spec/mongo/auth/user/view_spec.rb +26 -1
  139. data/spec/mongo/bulk_write/ordered_combiner_spec.rb +271 -0
  140. data/spec/mongo/bulk_write/unordered_combiner_spec.rb +239 -0
  141. data/spec/mongo/bulk_write_spec.rb +332 -166
  142. data/spec/mongo/client_spec.rb +25 -0
  143. data/spec/mongo/cluster/topology/replica_set_spec.rb +2 -0
  144. data/spec/mongo/collection/view/aggregation_spec.rb +65 -0
  145. data/spec/mongo/collection/view/immutable_spec.rb +103 -0
  146. data/spec/mongo/collection/view/map_reduce_spec.rb +98 -3
  147. data/spec/mongo/collection/view/readable_spec.rb +17 -30
  148. data/spec/mongo/collection/view_spec.rb +233 -7
  149. data/spec/mongo/collection_spec.rb +360 -18
  150. data/spec/mongo/command_monitoring_spec.rb +51 -0
  151. data/spec/mongo/connection_string_spec.rb +137 -0
  152. data/spec/mongo/database_spec.rb +27 -11
  153. data/spec/mongo/grid/file/chunk_spec.rb +5 -5
  154. data/spec/mongo/grid/file/{metadata_spec.rb → info_spec.rb} +29 -17
  155. data/spec/mongo/grid/file_spec.rb +8 -8
  156. data/spec/mongo/grid/fs_bucket_spec.rb +1020 -0
  157. data/spec/mongo/grid/stream/read_spec.rb +275 -0
  158. data/spec/mongo/grid/stream/write_spec.rb +440 -0
  159. data/spec/mongo/grid/stream_spec.rb +48 -0
  160. data/spec/mongo/gridfs_spec.rb +50 -0
  161. data/spec/mongo/logger_spec.rb +0 -40
  162. data/spec/mongo/monitoring/command_log_subscriber_spec.rb +76 -0
  163. data/spec/mongo/operation/{aggregate_spec.rb → commands/aggregate_spec.rb} +0 -42
  164. data/spec/mongo/operation/{read → commands}/collections_info_spec.rb +1 -1
  165. data/spec/mongo/operation/{command_spec.rb → commands/command_spec.rb} +0 -0
  166. data/spec/mongo/operation/{read → commands}/indexes_spec.rb +1 -1
  167. data/spec/mongo/operation/{map_reduce_spec.rb → commands/map_reduce_spec.rb} +0 -18
  168. data/spec/mongo/operation/kill_cursors_spec.rb +1 -1
  169. data/spec/mongo/operation/{read_preferrable_spec.rb → read_preference_spec.rb} +11 -11
  170. data/spec/mongo/operation/write/bulk/{bulk_delete_spec.rb → delete_spec.rb} +1 -12
  171. data/spec/mongo/operation/write/bulk/{bulk_insert_spec.rb → insert_spec.rb} +1 -12
  172. data/spec/mongo/operation/write/bulk/{bulk_update_spec.rb → update_spec.rb} +1 -12
  173. data/spec/mongo/operation/write/insert_spec.rb +0 -11
  174. data/spec/mongo/protocol/kill_cursors_spec.rb +5 -3
  175. data/spec/mongo/server/description_spec.rb +42 -0
  176. data/spec/mongo/server/monitor_spec.rb +21 -0
  177. data/spec/mongo/server_discovery_and_monitoring_spec.rb +1 -0
  178. data/spec/mongo/server_selection_spec.rb +3 -3
  179. data/spec/mongo/server_selector/nearest_spec.rb +34 -27
  180. data/spec/mongo/server_selector/primary_preferred_spec.rb +31 -30
  181. data/spec/mongo/server_selector/primary_spec.rb +14 -13
  182. data/spec/mongo/server_selector/secondary_preferred_spec.rb +27 -26
  183. data/spec/mongo/server_selector/secondary_spec.rb +23 -22
  184. data/spec/mongo/server_selector_spec.rb +87 -24
  185. data/spec/mongo/socket/unix_spec.rb +52 -0
  186. data/spec/mongo/uri_spec.rb +251 -39
  187. data/spec/spec_helper.rb +11 -4
  188. data/spec/support/authorization.rb +4 -5
  189. data/spec/support/command_monitoring.rb +365 -0
  190. data/spec/support/command_monitoring/bulkWrite.yml +73 -0
  191. data/spec/support/command_monitoring/command.yml +42 -0
  192. data/spec/support/command_monitoring/deleteMany.yml +55 -0
  193. data/spec/support/command_monitoring/deleteOne.yml +55 -0
  194. data/spec/support/command_monitoring/find.yml +219 -0
  195. data/spec/support/command_monitoring/insertMany.yml +81 -0
  196. data/spec/support/command_monitoring/insertOne.yml +51 -0
  197. data/spec/support/command_monitoring/updateMany.yml +67 -0
  198. data/spec/support/command_monitoring/updateOne.yml +95 -0
  199. data/spec/support/connection_string.rb +228 -0
  200. data/spec/support/connection_string_tests/invalid-uris.yml +193 -0
  201. data/spec/support/connection_string_tests/valid-auth.yml +256 -0
  202. data/spec/support/connection_string_tests/valid-host_identifiers.yml +121 -0
  203. data/spec/support/connection_string_tests/valid-options.yml +30 -0
  204. data/spec/support/connection_string_tests/valid-unix_socket-absolute.yml +197 -0
  205. data/spec/support/connection_string_tests/valid-unix_socket-relative.yml +213 -0
  206. data/spec/support/connection_string_tests/valid-warnings.yml +55 -0
  207. data/spec/support/crud.rb +3 -1
  208. data/spec/support/crud/read.rb +14 -10
  209. data/spec/support/crud/write.rb +36 -9
  210. data/spec/support/gridfs.rb +637 -0
  211. data/spec/support/gridfs_tests/delete.yml +157 -0
  212. data/spec/support/gridfs_tests/download.yml +210 -0
  213. data/spec/support/gridfs_tests/download_by_name.yml +113 -0
  214. data/spec/support/gridfs_tests/upload.yml +158 -0
  215. data/spec/support/sdam/rs/equal_electionids.yml +1 -2
  216. data/spec/support/sdam/rs/new_primary_new_electionid.yml +0 -3
  217. data/spec/support/sdam/rs/primary_mismatched_me.yml +37 -0
  218. data/spec/support/sdam/rs/primary_to_no_primary_mismatched_me.yml +75 -0
  219. data/spec/support/sdam/rs/secondary_mismatched_me.yml +37 -0
  220. data/spec/support/sdam/single/direct_connection_rsarbiter.yml +1 -1
  221. data/spec/support/sdam/single/direct_connection_rsprimary.yml +1 -1
  222. data/spec/support/sdam/single/direct_connection_rssecondary.yml +1 -1
  223. data/spec/support/sdam/single/direct_connection_slave.yml +1 -1
  224. data/spec/support/sdam/single/direct_connection_standalone.yml +1 -1
  225. data/spec/support/sdam/single/not_ok_response.yml +0 -1
  226. data/spec/support/server_discovery_and_monitoring.rb +3 -1
  227. data/spec/support/server_selection.rb +3 -1
  228. data/spec/support/shared/bulk_write.rb +192 -0
  229. data/spec/support/shared/server_selector.rb +21 -12
  230. metadata +147 -57
  231. metadata.gz.sig +0 -0
  232. data/lib/mongo/bulk_write/bulk_writable.rb +0 -252
  233. data/lib/mongo/bulk_write/deletable.rb +0 -57
  234. data/lib/mongo/bulk_write/insertable.rb +0 -49
  235. data/lib/mongo/bulk_write/replacable.rb +0 -58
  236. data/lib/mongo/bulk_write/updatable.rb +0 -69
  237. data/lib/mongo/grid/fs.rb +0 -146
  238. data/lib/mongo/operation/list_collections/result.rb +0 -114
  239. data/lib/mongo/operation/list_indexes/result.rb +0 -118
  240. data/lib/mongo/operation/read/collections_info.rb +0 -68
  241. data/lib/mongo/operation/read/indexes.rb +0 -69
  242. data/lib/mongo/operation/read/list_collections.rb +0 -76
  243. data/lib/mongo/operation/read/list_indexes.rb +0 -78
  244. data/lib/mongo/operation/write/bulk/bulk_delete.rb +0 -145
  245. data/lib/mongo/operation/write/bulk/bulk_delete/result.rb +0 -75
  246. data/lib/mongo/operation/write/bulk/bulk_insert.rb +0 -132
  247. data/lib/mongo/operation/write/bulk/bulk_insert/result.rb +0 -130
  248. data/lib/mongo/operation/write/bulk/bulk_mergable.rb +0 -67
  249. data/lib/mongo/operation/write/bulk/bulk_update.rb +0 -154
  250. data/lib/mongo/operation/write/bulk/bulk_update/result.rb +0 -174
  251. data/lib/mongo/operation/write/bulk/legacy_bulk_mergable.rb +0 -83
  252. data/spec/mongo/grid/fs_spec.rb +0 -160
  253. data/spec/mongo/loggable_spec.rb +0 -63
data/lib/mongo/version.rb CHANGED
@@ -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.1.0.beta'.freeze
20
+ VERSION = '2.1.0.rc0'.freeze
21
21
  end
@@ -27,7 +27,7 @@ describe Mongo::Address::Unix do
27
27
  describe '#socket' do
28
28
 
29
29
  let(:address) do
30
- '/path/to/socket.sock'
30
+ '/tmp/mongodb-27017.sock'
31
31
  end
32
32
 
33
33
  let(:socket) do
@@ -203,4 +203,29 @@ describe Mongo::Address do
203
203
  end
204
204
  end
205
205
  end
206
+
207
+ describe "#socket" do
208
+
209
+ context 'when providing a DNS entry that resolves to both IPv6 and IPv4' do
210
+
211
+ let(:address) do
212
+ described_class.new(DEFAULT_ADDRESS)
213
+ end
214
+
215
+ let(:host) do
216
+ DEFAULT_ADDRESS.split(':').first
217
+ end
218
+
219
+ before do
220
+ allow(::Socket).to receive(:getaddrinfo).and_return(
221
+ [ ["AF_INET6", 0, '::1', '::1', ::Socket::AF_INET6, 1, 6],
222
+ ["AF_INET", 0, host, host, ::Socket::AF_INET, 1, 6]]
223
+ )
224
+ end
225
+
226
+ it "attempts to use IPv6 and fallbacks to IPv4" do
227
+ expect(address.socket(0.0)).not_to be_nil
228
+ end
229
+ end
230
+ end
206
231
  end
@@ -0,0 +1,43 @@
1
+ require 'spec_helper'
2
+
3
+ describe Mongo::Auth::LDAP::Conversation do
4
+
5
+ let(:user) do
6
+ Mongo::Auth::User.new(
7
+ database: Mongo::Database::ADMIN,
8
+ user: 'user',
9
+ password: 'pencil'
10
+ )
11
+ end
12
+
13
+ let(:conversation) do
14
+ described_class.new(user)
15
+ end
16
+
17
+ describe '#start' do
18
+
19
+ let(:query) do
20
+ conversation.start
21
+ end
22
+
23
+ let(:selector) do
24
+ query.selector
25
+ end
26
+
27
+ it 'sets the sasl start flag' do
28
+ expect(selector[:saslStart]).to eq(1)
29
+ end
30
+
31
+ it 'sets the auto authorize flag' do
32
+ expect(selector[:autoAuthorize]).to eq(1)
33
+ end
34
+
35
+ it 'sets the mechanism' do
36
+ expect(selector[:mechanism]).to eq('PLAIN')
37
+ end
38
+
39
+ it 'sets the payload' do
40
+ expect(selector[:payload].data).to eq("\x00user\x00pencil")
41
+ end
42
+ end
43
+ end
@@ -112,7 +112,32 @@ describe Mongo::Auth::User::View do
112
112
  end
113
113
  end
114
114
 
115
- describe '#update' do
115
+ describe '#info' do
116
+
117
+ context 'when a user exists in the database' do
118
+
119
+ before do
120
+ view.create(
121
+ 'emily',
122
+ password: 'password'
123
+ )
124
+ end
125
+
126
+ after do
127
+ view.remove('emily')
128
+ end
129
+
130
+ it 'returns information for that user' do
131
+ expect(view.info('emily')).to_not be_empty
132
+ end
133
+ end
134
+
135
+ context 'when a user does not exist in the database' do
136
+
137
+ it 'returns nil' do
138
+ expect(view.info('emily')).to be_empty
139
+ end
140
+ end
116
141
 
117
142
  end
118
143
  end
@@ -0,0 +1,271 @@
1
+ require 'spec_helper'
2
+
3
+ describe Mongo::BulkWrite::OrderedCombiner do
4
+
5
+ describe '#combine' do
6
+
7
+ let(:combiner) do
8
+ described_class.new(requests)
9
+ end
10
+
11
+ context 'when provided a series of delete one' do
12
+
13
+ context 'when the documents are valid' do
14
+
15
+ let(:requests) do
16
+ [
17
+ { delete_one: { filter: { _id: 0 }}},
18
+ { delete_one: { filter: { _id: 1 }}}
19
+ ]
20
+ end
21
+
22
+ it 'returns a single delete one' do
23
+ expect(combiner.combine).to eq(
24
+ [
25
+ {
26
+ delete_one: [
27
+ { q: { _id: 0 }, limit: 1 },
28
+ { q: { _id: 1 }, limit: 1 }
29
+ ]
30
+ }
31
+ ]
32
+ )
33
+ end
34
+ end
35
+
36
+ context 'when a document is not valid' do
37
+
38
+ let(:requests) do
39
+ [
40
+ { delete_one: { filter: { _id: 0 }}},
41
+ { delete_one: 'whoami' }
42
+ ]
43
+ end
44
+
45
+ it 'raises an exception' do
46
+ expect {
47
+ combiner.combine
48
+ }.to raise_error(Mongo::Error::InvalidBulkOperation)
49
+ end
50
+ end
51
+ end
52
+
53
+ context 'when provided a series of delete many' do
54
+
55
+ context 'when the documents are valid' do
56
+
57
+ let(:requests) do
58
+ [
59
+ { delete_many: { filter: { _id: 0 }}},
60
+ { delete_many: { filter: { _id: 1 }}}
61
+ ]
62
+ end
63
+
64
+ it 'returns a single delete many' do
65
+ expect(combiner.combine).to eq(
66
+ [
67
+ {
68
+ delete_many: [
69
+ { q: { _id: 0 }, limit: 0 },
70
+ { q: { _id: 1 }, limit: 0 }
71
+ ]
72
+ }
73
+ ]
74
+ )
75
+ end
76
+ end
77
+
78
+ context 'when a document is not valid' do
79
+
80
+ let(:requests) do
81
+ [
82
+ { delete_many: { filter: { _id: 0 }}},
83
+ { delete_many: 'whoami' }
84
+ ]
85
+ end
86
+
87
+ it 'raises an exception' do
88
+ expect {
89
+ combiner.combine
90
+ }.to raise_error(Mongo::Error::InvalidBulkOperation)
91
+ end
92
+ end
93
+ end
94
+
95
+ context 'when provided a series of insert one' do
96
+
97
+ context 'when the documents are valid' do
98
+
99
+ let(:requests) do
100
+ [{ insert_one: { _id: 0 }}, { insert_one: { _id: 1 }}]
101
+ end
102
+
103
+ it 'returns a single insert one' do
104
+ expect(combiner.combine).to eq(
105
+ [{ insert_one: [{ _id: 0 }, { _id: 1 }]}]
106
+ )
107
+ end
108
+ end
109
+
110
+ context 'when a document is not valid' do
111
+
112
+ let(:requests) do
113
+ [{ insert_one: { _id: 0 }}, { insert_one: 'whoami' }]
114
+ end
115
+
116
+ it 'raises an exception' do
117
+ expect {
118
+ combiner.combine
119
+ }.to raise_error(Mongo::Error::InvalidBulkOperation)
120
+ end
121
+ end
122
+ end
123
+
124
+ context 'when provided a series of replace one' do
125
+
126
+ context 'when the documents are valid' do
127
+
128
+ let(:requests) do
129
+ [
130
+ { replace_one: { filter: { _id: 0 }, replacement: { name: 'test' }}},
131
+ { replace_one: { filter: { _id: 1 }, replacement: { name: 'test' }}}
132
+ ]
133
+ end
134
+
135
+ it 'returns a single replace one' do
136
+ expect(combiner.combine).to eq(
137
+ [
138
+ {
139
+ replace_one: [
140
+ { q: { _id: 0 }, u: { name: 'test' }, multi: false, upsert: false },
141
+ { q: { _id: 1 }, u: { name: 'test' }, multi: false, upsert: false }
142
+ ]
143
+ }
144
+ ]
145
+ )
146
+ end
147
+ end
148
+
149
+ context 'when a document is not valid' do
150
+
151
+ let(:requests) do
152
+ [
153
+ { replace_one: { filter: { _id: 0 }, replacement: { name: 'test' }}},
154
+ { replace_one: 'whoami' }
155
+ ]
156
+ end
157
+
158
+ it 'raises an exception' do
159
+ expect {
160
+ combiner.combine
161
+ }.to raise_error(Mongo::Error::InvalidBulkOperation)
162
+ end
163
+ end
164
+ end
165
+
166
+ context 'when provided a series of update one' do
167
+
168
+ context 'when the documents are valid' do
169
+
170
+ let(:requests) do
171
+ [
172
+ { update_one: { filter: { _id: 0 }, update: { '$set' => { name: 'test' }}}},
173
+ { update_one: { filter: { _id: 1 }, update: { '$set' => { name: 'test' }}}}
174
+ ]
175
+ end
176
+
177
+ it 'returns a single update one' do
178
+ expect(combiner.combine).to eq(
179
+ [
180
+ {
181
+ update_one: [
182
+ { q: { _id: 0 }, u: { '$set' => { name: 'test' }}, multi: false, upsert: false },
183
+ { q: { _id: 1 }, u: { '$set' => { name: 'test' }}, multi: false, upsert: false }
184
+ ]
185
+ }
186
+ ]
187
+ )
188
+ end
189
+ end
190
+
191
+ context 'when a document is not valid' do
192
+
193
+ let(:requests) do
194
+ [
195
+ { update_one: { filter: { _id: 0 }, update: { '$set' => { name: 'test' }}}},
196
+ { update_one: 'whoami' }
197
+ ]
198
+ end
199
+
200
+ it 'raises an exception' do
201
+ expect {
202
+ combiner.combine
203
+ }.to raise_error(Mongo::Error::InvalidBulkOperation)
204
+ end
205
+ end
206
+ end
207
+
208
+ context 'when provided a series of update many ops' do
209
+
210
+ context 'when the documents are valid' do
211
+
212
+ let(:requests) do
213
+ [
214
+ { update_many: { filter: { _id: 0 }, update: { '$set' => { name: 'test' }}}},
215
+ { update_many: { filter: { _id: 1 }, update: { '$set' => { name: 'test' }}}}
216
+ ]
217
+ end
218
+
219
+ it 'returns a single update many' do
220
+ expect(combiner.combine).to eq(
221
+ [
222
+ {
223
+ update_many: [
224
+ { q: { _id: 0 }, u: { '$set' => { name: 'test' }}, multi: true, upsert: false },
225
+ { q: { _id: 1 }, u: { '$set' => { name: 'test' }}, multi: true, upsert: false }
226
+ ]
227
+ }
228
+ ]
229
+ )
230
+ end
231
+ end
232
+
233
+ context 'when a document is not valid' do
234
+
235
+ let(:requests) do
236
+ [
237
+ { update_many: { filter: { _id: 0 }, update: { '$set' => { name: 'test' }}}},
238
+ { update_many: 'whoami' }
239
+ ]
240
+ end
241
+
242
+ it 'raises an exception' do
243
+ expect {
244
+ combiner.combine
245
+ }.to raise_error(Mongo::Error::InvalidBulkOperation)
246
+ end
247
+ end
248
+ end
249
+
250
+ context 'when provided a mix of operations' do
251
+
252
+ let(:requests) do
253
+ [
254
+ { insert_one: { _id: 0 }},
255
+ { delete_one: { filter: { _id: 0 }}},
256
+ { insert_one: { _id: 1 }}
257
+ ]
258
+ end
259
+
260
+ it 'returns an ordered grouping' do
261
+ expect(combiner.combine).to eq(
262
+ [
263
+ { insert_one: [{ _id: 0 }]},
264
+ { delete_one: [{ q: { _id: 0 }, limit: 1 }]},
265
+ { insert_one: [{ _id: 1 }]}
266
+ ]
267
+ )
268
+ end
269
+ end
270
+ end
271
+ end
@@ -0,0 +1,239 @@
1
+ require 'spec_helper'
2
+
3
+ describe Mongo::BulkWrite::UnorderedCombiner do
4
+
5
+ describe '#combine' do
6
+
7
+ let(:combiner) do
8
+ described_class.new(requests)
9
+ end
10
+
11
+ context 'when provided a series of delete one' do
12
+
13
+ context 'when the documents are valid' do
14
+
15
+ let(:requests) do
16
+ [
17
+ { delete_one: { filter: { _id: 0 }}},
18
+ { delete_one: { filter: { _id: 1 }}}
19
+ ]
20
+ end
21
+
22
+ it 'returns a single delete one' do
23
+ expect(combiner.combine).to eq(
24
+ [
25
+ {
26
+ delete_one: [
27
+ { q: { _id: 0 }, limit: 1 },
28
+ { q: { _id: 1 }, limit: 1 }
29
+ ]
30
+ }
31
+ ]
32
+ )
33
+ end
34
+ end
35
+
36
+ context 'when a document is not valid' do
37
+
38
+ let(:requests) do
39
+ [
40
+ { delete_one: { filter: { _id: 0 }}},
41
+ { delete_one: 'whoami' }
42
+ ]
43
+ end
44
+
45
+ it 'raises an exception' do
46
+ expect {
47
+ combiner.combine
48
+ }.to raise_error(Mongo::Error::InvalidBulkOperation)
49
+ end
50
+ end
51
+ end
52
+
53
+ context 'when provided a series of delete many' do
54
+
55
+ context 'when the documents are valid' do
56
+
57
+ let(:requests) do
58
+ [
59
+ { delete_many: { filter: { _id: 0 }}},
60
+ { delete_many: { filter: { _id: 1 }}}
61
+ ]
62
+ end
63
+
64
+ it 'returns a single delete many' do
65
+ expect(combiner.combine).to eq(
66
+ [
67
+ {
68
+ delete_many: [
69
+ { q: { _id: 0 }, limit: 0 },
70
+ { q: { _id: 1 }, limit: 0 }
71
+ ]
72
+ }
73
+ ]
74
+ )
75
+ end
76
+ end
77
+
78
+ context 'when a document is not valid' do
79
+
80
+ let(:requests) do
81
+ [
82
+ { delete_many: { filter: { _id: 0 }}},
83
+ { delete_many: 'whoami' }
84
+ ]
85
+ end
86
+
87
+ it 'raises an exception' do
88
+ expect {
89
+ combiner.combine
90
+ }.to raise_error(Mongo::Error::InvalidBulkOperation)
91
+ end
92
+ end
93
+ end
94
+
95
+ context 'when provided a series of insert one' do
96
+
97
+ context 'when the documents are valid' do
98
+
99
+ let(:requests) do
100
+ [{ insert_one: { _id: 0 }}, { insert_one: { _id: 1 }}]
101
+ end
102
+
103
+ it 'returns a single insert one' do
104
+ expect(combiner.combine).to eq(
105
+ [{ insert_one: [{ _id: 0 }, { _id: 1 }]}]
106
+ )
107
+ end
108
+ end
109
+
110
+ context 'when a document is not valid' do
111
+
112
+ let(:requests) do
113
+ [{ insert_one: { _id: 0 }}, { insert_one: 'whoami' }]
114
+ end
115
+
116
+ it 'raises an exception' do
117
+ expect {
118
+ combiner.combine
119
+ }.to raise_error(Mongo::Error::InvalidBulkOperation)
120
+ end
121
+ end
122
+ end
123
+
124
+ context 'when provided a series of update one' do
125
+
126
+ context 'when the documents are valid' do
127
+
128
+ let(:requests) do
129
+ [
130
+ { update_one: { filter: { _id: 0 }, update: { '$set' => { name: 'test' }}}},
131
+ { update_one: { filter: { _id: 1 }, update: { '$set' => { name: 'test' }}}}
132
+ ]
133
+ end
134
+
135
+ it 'returns a single update one' do
136
+ expect(combiner.combine).to eq(
137
+ [
138
+ {
139
+ update_one: [
140
+ { q: { _id: 0 }, u: { '$set' => { name: 'test' }}, multi: false, upsert: false },
141
+ { q: { _id: 1 }, u: { '$set' => { name: 'test' }}, multi: false, upsert: false }
142
+ ]
143
+ }
144
+ ]
145
+ )
146
+ end
147
+ end
148
+
149
+ context 'when a document is not valid' do
150
+
151
+ let(:requests) do
152
+ [
153
+ { update_one: { filter: { _id: 0 }, update: { '$set' => { name: 'test' }}}},
154
+ { update_one: 'whoami' }
155
+ ]
156
+ end
157
+
158
+ it 'raises an exception' do
159
+ expect {
160
+ combiner.combine
161
+ }.to raise_error(Mongo::Error::InvalidBulkOperation)
162
+ end
163
+ end
164
+ end
165
+
166
+ context 'when provided a series of update many ops' do
167
+
168
+ context 'when the documents are valid' do
169
+
170
+ let(:requests) do
171
+ [
172
+ { update_many: { filter: { _id: 0 }, update: { '$set' => { name: 'test' }}}},
173
+ { update_many: { filter: { _id: 1 }, update: { '$set' => { name: 'test' }}}}
174
+ ]
175
+ end
176
+
177
+ it 'returns a single update many' do
178
+ expect(combiner.combine).to eq(
179
+ [
180
+ {
181
+ update_many: [
182
+ { q: { _id: 0 }, u: { '$set' => { name: 'test' }}, multi: true, upsert: false },
183
+ { q: { _id: 1 }, u: { '$set' => { name: 'test' }}, multi: true, upsert: false }
184
+ ]
185
+ }
186
+ ]
187
+ )
188
+ end
189
+ end
190
+
191
+ context 'when a document is not valid' do
192
+
193
+ let(:requests) do
194
+ [
195
+ { update_many: { filter: { _id: 0 }, update: { '$set' => { name: 'test' }}}},
196
+ { update_many: 'whoami' }
197
+ ]
198
+ end
199
+
200
+ it 'raises an exception' do
201
+ expect {
202
+ combiner.combine
203
+ }.to raise_error(Mongo::Error::InvalidBulkOperation)
204
+ end
205
+ end
206
+ end
207
+
208
+ context 'when provided a mix of operations' do
209
+
210
+ let(:requests) do
211
+ [
212
+ { insert_one: { _id: 0 }},
213
+ { delete_one: { filter: { _id: 0 }}},
214
+ { insert_one: { _id: 1 }},
215
+ { delete_one: { filter: { _id: 1 }}}
216
+ ]
217
+ end
218
+
219
+ it 'returns an unordered mixed grouping' do
220
+ expect(combiner.combine).to eq(
221
+ [
222
+ {
223
+ insert_one: [
224
+ { _id: 0 },
225
+ { _id: 1 }
226
+ ]
227
+ },
228
+ {
229
+ delete_one: [
230
+ { q: { _id: 0 }, limit: 1 },
231
+ { q: { _id: 1 }, limit: 1 }
232
+ ]
233
+ }
234
+ ]
235
+ )
236
+ end
237
+ end
238
+ end
239
+ end