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
@@ -10,251 +10,417 @@ describe Mongo::BulkWrite do
10
10
  authorized_collection.delete_many
11
11
  end
12
12
 
13
- let(:bulk) do
14
- described_class.get(authorized_collection, operations, options)
15
- end
13
+ describe '#execute' do
16
14
 
17
- describe '#get' do
15
+ shared_examples_for 'an executable bulk write' do
18
16
 
19
- let(:operations) do
20
- [{ insert_one: { _id: 0 } }]
21
- end
17
+ context 'when providing a bad operation' do
22
18
 
23
- context 'When an ordered bulk write object is created' do
19
+ let(:requests) do
20
+ [{ not_an_operation: { _id: 0 }}]
21
+ end
24
22
 
25
- let(:options) do
26
- { ordered: true }
23
+ it 'raises an exception' do
24
+ expect {
25
+ bulk_write.execute
26
+ }.to raise_error(Mongo::Error::InvalidBulkOperationType)
27
+ end
27
28
  end
28
29
 
29
- it 'returns an OrderedBulkWrite object' do
30
- expect(bulk).to be_a(Mongo::BulkWrite::OrderedBulkWrite)
31
- end
32
- end
30
+ context 'when the operations do not need to be split' do
33
31
 
34
- context 'When an unordered bulk write object is created' do
32
+ context 'when a write error occurs' do
35
33
 
36
- let(:options) do
37
- { ordered: false }
38
- end
34
+ let(:requests) do
35
+ [
36
+ { insert_one: { _id: 0 }},
37
+ { insert_one: { _id: 1 }},
38
+ { insert_one: { _id: 0 }},
39
+ { insert_one: { _id: 1 }}
40
+ ]
41
+ end
39
42
 
40
- it 'returns an UnorderedBulkWrite object' do
41
- expect(bulk).to be_a(Mongo::BulkWrite::UnorderedBulkWrite)
42
- end
43
- end
43
+ let(:error) do
44
+ begin
45
+ bulk_write.execute
46
+ rescue => e
47
+ e
48
+ end
49
+ end
44
50
 
45
- context 'When ordered is not specified in options' do
51
+ it 'raises an exception' do
52
+ expect {
53
+ bulk_write.execute
54
+ }.to raise_error(Mongo::Error::BulkWriteError)
55
+ end
46
56
 
47
- let(:options) do
48
- { }
49
- end
57
+ it 'sets the document index on the error' do
58
+ expect(error.result[Mongo::Error::WRITE_ERRORS].first['index']).to eq(2)
59
+ end
60
+ end
50
61
 
51
- it 'returns an OrderedBulkWrite object' do
52
- expect(bulk).to be_a(Mongo::BulkWrite::OrderedBulkWrite)
53
- end
54
- end
55
- end
62
+ context 'when provided a single insert one' do
56
63
 
57
- describe 'Ordered bulk write' do
64
+ let(:requests) do
65
+ [{ insert_one: { _id: 0 }}]
66
+ end
58
67
 
59
- let(:options) do
60
- { ordered: true }
61
- end
68
+ let(:result) do
69
+ bulk_write.execute
70
+ end
62
71
 
63
- it_behaves_like 'a bulk write object'
72
+ it 'inserts the document' do
73
+ expect(result.inserted_count).to eq(1)
74
+ expect(authorized_collection.find(_id: 0).count).to eq(1)
75
+ end
76
+ end
64
77
 
65
- context 'when the batch requires splitting' do
78
+ context 'when provided multiple insert ones' do
66
79
 
67
- context 'when the operations are the same type' do
80
+ let(:requests) do
81
+ [
82
+ { insert_one: { _id: 0 }},
83
+ { insert_one: { _id: 1 }},
84
+ { insert_one: { _id: 2 }}
85
+ ]
86
+ end
68
87
 
69
- let(:error) do
70
- begin
71
- bulk.execute
72
- rescue => ex
73
- ex
88
+ let(:result) do
89
+ bulk_write.execute
74
90
  end
75
- end
76
91
 
77
- let(:operations) do
78
- [].tap do |ops|
79
- 3000.times do |i|
80
- ops << { insert_one: { _id: i } }
81
- end
82
- ops << { insert_one: { _id: 0 } }
83
- ops << { insert_one: { _id: 3001 } }
92
+ it 'inserts the documents' do
93
+ expect(result.inserted_count).to eq(3)
94
+ expect(authorized_collection.find(_id: { '$in'=> [ 0, 1, 2 ]}).count).to eq(3)
84
95
  end
85
96
  end
86
97
 
87
- it 'raises a BulkWriteError' do
88
- expect(error).to be_a(Mongo::Error::BulkWriteError)
89
- end
98
+ context 'when provided a single delete one' do
90
99
 
91
- it 'halts execution after first error and reports correct index' do
92
- expect(error.result[Mongo::Error::WRITE_ERRORS].first['index']).to eq(3000)
93
- expect(authorized_collection.find.count).to eq(3000)
94
- end
95
- end
100
+ let(:requests) do
101
+ [{ delete_one: { filter: { _id: 0 }}}]
102
+ end
96
103
 
97
- context 'when operations are mixed types' do
104
+ let(:result) do
105
+ bulk_write.execute
106
+ end
98
107
 
99
- let(:error) do
100
- begin
101
- bulk.execute
102
- rescue => ex
103
- ex
108
+ before do
109
+ authorized_collection.insert_one({ _id: 0 })
104
110
  end
105
- end
106
111
 
107
- let(:operations) do
108
- [].tap do |ops|
109
- 2000.times do |i|
110
- ops << { insert_one: { _id: i } }
111
- end
112
- ops << { delete_one: { _id: 0 } }
113
- ops << { insert_one: { _id: 1 } }
114
- ops << { insert_one: { _id: 2000 } }
112
+ it 'deletes the document' do
113
+ expect(result.deleted_count).to eq(1)
114
+ expect(authorized_collection.find(_id: 0).count).to eq(0)
115
115
  end
116
116
  end
117
117
 
118
- it 'raises a BulkWriteError error' do
119
- expect(error).to be_a(Mongo::Error::BulkWriteError)
118
+ context 'when provided multiple delete ones' do
119
+
120
+ let(:requests) do
121
+ [
122
+ { delete_one: { filter: { _id: 0 }}},
123
+ { delete_one: { filter: { _id: 1 }}},
124
+ { delete_one: { filter: { _id: 2 }}}
125
+ ]
126
+ end
127
+
128
+ let(:result) do
129
+ bulk_write.execute
130
+ end
131
+
132
+ before do
133
+ authorized_collection.insert_many([
134
+ { _id: 0 }, { _id: 1 }, { _id: 2 }
135
+ ])
136
+ end
137
+
138
+ it 'deletes the documents' do
139
+ expect(result.deleted_count).to eq(3)
140
+ expect(authorized_collection.find(_id: { '$in'=> [ 0, 1, 2 ]}).count).to eq(0)
141
+ end
120
142
  end
121
143
 
122
- it 'halts execution after first error and reports correct index' do
123
- expect(error.result[Mongo::Error::WRITE_ERRORS].first['index']).to eq(2001)
124
- expect(authorized_collection.find.count).to eq(1999)
144
+ context 'when provided a single delete many' do
145
+
146
+ let(:requests) do
147
+ [{ delete_many: { filter: { _id: 0 }}}]
148
+ end
149
+
150
+ let(:result) do
151
+ bulk_write.execute
152
+ end
153
+
154
+ before do
155
+ authorized_collection.insert_one({ _id: 0 })
156
+ end
157
+
158
+ it 'deletes the documents' do
159
+ expect(result.deleted_count).to eq(1)
160
+ expect(authorized_collection.find(_id: 0).count).to eq(0)
161
+ end
125
162
  end
126
- end
127
163
 
128
- context 'when the operations exceed the max bson size' do
164
+ context 'when provided multiple delete many ops' do
165
+
166
+ let(:requests) do
167
+ [
168
+ { delete_many: { filter: { _id: 0 }}},
169
+ { delete_many: { filter: { _id: 1 }}},
170
+ { delete_many: { filter: { _id: 2 }}}
171
+ ]
172
+ end
173
+
174
+ let(:result) do
175
+ bulk_write.execute
176
+ end
177
+
178
+ before do
179
+ authorized_collection.insert_many([
180
+ { _id: 0 }, { _id: 1 }, { _id: 2 }
181
+ ])
182
+ end
129
183
 
130
- let(:error) do
131
- begin
132
- bulk.execute
133
- rescue => ex
134
- ex
184
+ it 'deletes the documents' do
185
+ expect(result.deleted_count).to eq(3)
186
+ expect(authorized_collection.find(_id: { '$in'=> [ 0, 1, 2 ]}).count).to eq(0)
135
187
  end
136
188
  end
137
189
 
138
- let(:operations) do
139
- [].tap do |ops|
140
- 6.times do |i|
141
- ops << { insert_one: { _id: i, x: 'y'*4000000 } }
142
- end
143
- ops << { insert_one: { _id: 0 } }
144
- ops << { insert_one: { _id: 100 } }
190
+ context 'when providing a single replace one' do
191
+
192
+ let(:requests) do
193
+ [{ replace_one: { filter: { _id: 0 }, replacement: { name: 'test' }}}]
194
+ end
195
+
196
+ let(:result) do
197
+ bulk_write.execute
198
+ end
199
+
200
+ before do
201
+ authorized_collection.insert_one({ _id: 0 })
202
+ end
203
+
204
+ it 'replaces the document' do
205
+ expect(result.modified_count).to eq(1)
206
+ expect(authorized_collection.find(_id: 0).first[:name]).to eq('test')
145
207
  end
146
208
  end
147
209
 
148
- it 'raises a BulkWriteError error' do
149
- expect(error).to be_a(Mongo::Error::BulkWriteError)
210
+ context 'when providing a single update one' do
211
+
212
+ let(:requests) do
213
+ [{ update_one: { filter: { _id: 0 }, update: { "$set" => { name: 'test' }}}}]
214
+ end
215
+
216
+ let(:result) do
217
+ bulk_write.execute
218
+ end
219
+
220
+ before do
221
+ authorized_collection.insert_one({ _id: 0 })
222
+ end
223
+
224
+ it 'updates the document' do
225
+ expect(result.modified_count).to eq(1)
226
+ expect(authorized_collection.find(_id: 0).first[:name]).to eq('test')
227
+ end
150
228
  end
151
229
 
152
- it 'splits messages into multiple messages' do
153
- error
154
- expect(authorized_collection.find.count).to eq(6)
230
+ context 'when providing a single update many' do
231
+
232
+ let(:requests) do
233
+ [{ update_many: { filter: { _id: 0 }, update: { "$set" => { name: 'test' }}}}]
234
+ end
235
+
236
+ let(:result) do
237
+ bulk_write.execute
238
+ end
239
+
240
+ before do
241
+ authorized_collection.insert_one({ _id: 0 })
242
+ end
243
+
244
+ it 'updates the documents' do
245
+ expect(result.modified_count).to eq(1)
246
+ expect(authorized_collection.find(_id: 0).first[:name]).to eq('test')
247
+ end
155
248
  end
156
249
  end
157
- end
158
- end
159
250
 
160
- describe 'Unordered bulk write' do
251
+ context 'when the operations need to be split' do
161
252
 
162
- let(:options) do
163
- { ordered: false }
164
- end
253
+ context 'when a write error occurs' do
165
254
 
166
- it_behaves_like 'a bulk write object'
255
+ let(:requests) do
256
+ 1001.times.map do |i|
257
+ { insert_one: { _id: i }}
258
+ end
259
+ end
167
260
 
168
- context 'when the operations exceed the max batch size' do
261
+ let(:error) do
262
+ begin
263
+ bulk_write.execute
264
+ rescue => e
265
+ e
266
+ end
267
+ end
169
268
 
170
- context 'when operations are all the same type' do
269
+ it 'raises an exception' do
270
+ expect {
271
+ requests.push({ insert_one: { _id: 5 }})
272
+ bulk_write.execute
273
+ }.to raise_error(Mongo::Error::BulkWriteError)
274
+ end
171
275
 
172
- let(:error) do
173
- begin
174
- bulk.execute
175
- rescue => ex
176
- ex
276
+ it 'sets the document index on the error' do
277
+ requests.push({ insert_one: { _id: 5 }})
278
+ expect(error.result[Mongo::Error::WRITE_ERRORS].first['index']).to eq(1001)
177
279
  end
178
280
  end
179
281
 
180
- let(:operations) do
181
- [].tap do |ops|
182
- 3000.times do |i|
183
- ops << { insert_one: { _id: i } }
282
+ context 'when no write errors occur' do
283
+
284
+ let(:requests) do
285
+ 1001.times.map do |i|
286
+ { insert_one: { _id: i }}
184
287
  end
185
- ops << { insert_one: { _id: 0 } }
186
- ops << { insert_one: { _id: 3001 } }
187
288
  end
188
- end
189
289
 
190
- it 'raises a BulkWriteError error' do
191
- expect(error).to be_a(Mongo::Error::BulkWriteError)
192
- end
290
+ let(:result) do
291
+ bulk_write.execute
292
+ end
193
293
 
194
- it 'does not halt execution after first error' do
195
- expect(error.result[Mongo::Error::WRITE_ERRORS].first['index']).to eq(3000)
196
- expect(authorized_collection.find.count).to eq(3001)
294
+ it 'inserts the documents' do
295
+ expect(result.inserted_count).to eq(1001)
296
+ end
197
297
  end
198
298
  end
199
299
 
200
- context 'when operations are mixed types' do
300
+ context 'when an operation exceeds the max bson size' do
201
301
 
202
- let(:error) do
203
- begin
204
- bulk.execute
205
- rescue => ex
206
- ex
302
+ let(:requests) do
303
+ 5.times.map do |i|
304
+ { insert_one: { _id: i, x: 'y' * 4000000 }}
207
305
  end
208
306
  end
209
307
 
210
- let(:operations) do
211
- [].tap do |ops|
212
- 2000.times do |i|
213
- ops << { insert_one: { _id: i } }
214
- end
215
- ops << { delete_one: { _id: 0 } }
216
- ops << { insert_one: { _id: 1 } }
217
- ops << { insert_one: { _id: 2000 } }
218
- end
308
+ let(:result) do
309
+ bulk_write.execute
219
310
  end
220
311
 
221
- it 'raises a BulkWriteError error' do
222
- expect(error).to be_a(Mongo::Error::BulkWriteError)
312
+ it 'inserts the documents' do
313
+ expect(result.inserted_count).to eq(5)
223
314
  end
315
+ end
316
+ end
224
317
 
225
- it 'does not halt execution after first error' do
226
- expect(error.result[Mongo::Error::WRITE_ERRORS].first['index']).to eq(2001)
227
- expect(authorized_collection.find.count).to eq(2000)
228
- end
318
+ context 'when the bulk write is unordered' do
319
+
320
+ let(:bulk_write) do
321
+ described_class.new(authorized_collection, requests, ordered: false)
229
322
  end
230
323
 
231
- context 'when the operations exceed the max bson size' do
324
+ it_behaves_like 'an executable bulk write'
325
+ end
232
326
 
233
- let(:error) do
234
- begin
235
- bulk.execute
236
- rescue => ex
237
- ex
238
- end
327
+ context 'when the bulk write is ordered' do
328
+
329
+ let(:bulk_write) do
330
+ described_class.new(authorized_collection, requests, ordered: true)
331
+ end
332
+
333
+ it_behaves_like 'an executable bulk write'
334
+ end
335
+ end
336
+
337
+ describe '#initialize' do
338
+
339
+ let(:requests) do
340
+ [{ insert_one: { _id: 0 }}]
341
+ end
342
+
343
+ shared_examples_for 'a bulk write initializer' do
344
+
345
+ it 'sets the collection' do
346
+ expect(bulk_write.collection).to eq(authorized_collection)
347
+ end
348
+
349
+ it 'sets the requests' do
350
+ expect(bulk_write.requests).to eq(requests)
351
+ end
352
+ end
353
+
354
+ context 'when no options are provided' do
355
+
356
+ let(:bulk_write) do
357
+ described_class.new(authorized_collection, requests)
358
+ end
359
+
360
+ it 'sets empty options' do
361
+ expect(bulk_write.options).to be_empty
362
+ end
363
+
364
+ it_behaves_like 'a bulk write initializer'
365
+ end
366
+
367
+ context 'when options are provided' do
368
+
369
+ let(:bulk_write) do
370
+ described_class.new(authorized_collection, requests, ordered: true)
371
+ end
372
+
373
+ it 'sets the options' do
374
+ expect(bulk_write.options).to eq(ordered: true)
375
+ end
376
+ end
377
+
378
+ context 'when nil options are provided' do
379
+
380
+ let(:bulk_write) do
381
+ described_class.new(authorized_collection, requests, nil)
382
+ end
383
+
384
+ it 'sets empty options' do
385
+ expect(bulk_write.options).to be_empty
386
+ end
387
+ end
388
+ end
389
+
390
+ describe '#ordered?' do
391
+
392
+ context 'when no option provided' do
393
+
394
+ let(:bulk_write) do
395
+ described_class.new(authorized_collection, [])
396
+ end
397
+
398
+ it 'returns true' do
399
+ expect(bulk_write).to be_ordered
400
+ end
401
+ end
402
+
403
+ context 'when the option is provided' do
404
+
405
+ context 'when the option is true' do
406
+
407
+ let(:bulk_write) do
408
+ described_class.new(authorized_collection, [], ordered: true)
239
409
  end
240
410
 
241
- let(:operations) do
242
- [].tap do |ops|
243
- 15.times do |i|
244
- ops << { insert_one: { _id: i, x: 'y'*4000000 } }
245
- end
246
- ops << { insert_one: { _id: 0 } }
247
- ops << { insert_one: { _id: 100 } }
248
- end
411
+ it 'returns true' do
412
+ expect(bulk_write).to be_ordered
249
413
  end
414
+ end
415
+
416
+ context 'when the option is false' do
250
417
 
251
- it 'raises a BulkWriteError error' do
252
- expect(error).to be_a(Mongo::Error::BulkWriteError)
418
+ let(:bulk_write) do
419
+ described_class.new(authorized_collection, [], ordered: false)
253
420
  end
254
421
 
255
- it 'splits messages into multiple messages' do
256
- error
257
- expect(authorized_collection.find.count).to eq(16)
422
+ it 'returns false' do
423
+ expect(bulk_write).to_not be_ordered
258
424
  end
259
425
  end
260
426
  end