mongo 1.12.5 → 2.0.0

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 (475) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data/CONTRIBUTING.md +64 -0
  4. data/LICENSE +1 -1
  5. data/README.md +21 -126
  6. data/Rakefile +39 -21
  7. data/bin/mongo_console +6 -38
  8. data/lib/mongo/address/ipv4.rb +85 -0
  9. data/lib/mongo/address/ipv6.rb +85 -0
  10. data/lib/mongo/address/unix.rb +76 -0
  11. data/lib/mongo/address.rb +111 -0
  12. data/lib/mongo/auth/cr/conversation.rb +119 -0
  13. data/lib/mongo/auth/cr.rb +44 -0
  14. data/lib/mongo/auth/executable.rb +52 -0
  15. data/lib/mongo/auth/ldap/conversation.rb +92 -0
  16. data/lib/mongo/auth/ldap.rb +48 -0
  17. data/lib/mongo/auth/roles.rb +104 -0
  18. data/lib/mongo/auth/scram/conversation.rb +450 -0
  19. data/lib/mongo/auth/scram.rb +53 -0
  20. data/lib/mongo/auth/user/view.rb +102 -0
  21. data/lib/mongo/auth/user.rb +159 -0
  22. data/lib/mongo/auth/x509/conversation.rb +92 -0
  23. data/lib/mongo/auth/x509.rb +48 -0
  24. data/lib/mongo/auth.rb +108 -0
  25. data/lib/mongo/bulk_write/bulk_writable.rb +191 -0
  26. data/lib/mongo/bulk_write/deletable.rb +60 -0
  27. data/lib/mongo/bulk_write/insertable.rb +52 -0
  28. data/lib/mongo/bulk_write/ordered_bulk_write.rb +48 -0
  29. data/lib/mongo/bulk_write/replacable.rb +57 -0
  30. data/lib/mongo/bulk_write/unordered_bulk_write.rb +46 -0
  31. data/lib/mongo/bulk_write/updatable.rb +68 -0
  32. data/lib/mongo/bulk_write.rb +52 -0
  33. data/lib/mongo/client.rb +246 -0
  34. data/lib/mongo/cluster/topology/replica_set.rb +160 -0
  35. data/lib/mongo/cluster/topology/sharded.rb +132 -0
  36. data/lib/mongo/cluster/topology/standalone.rb +132 -0
  37. data/lib/mongo/cluster/topology/unknown.rb +155 -0
  38. data/lib/mongo/cluster/topology.rb +60 -0
  39. data/lib/mongo/cluster.rb +203 -0
  40. data/lib/mongo/collection/view/aggregation.rb +108 -0
  41. data/lib/mongo/collection/view/explainable.rb +49 -0
  42. data/lib/mongo/collection/view/immutable.rb +43 -0
  43. data/lib/mongo/collection/view/iterable.rb +48 -0
  44. data/lib/mongo/collection/view/map_reduce.rb +191 -0
  45. data/lib/mongo/collection/view/readable.rb +363 -0
  46. data/lib/mongo/collection/view/writable.rb +185 -0
  47. data/lib/mongo/collection/view.rb +169 -0
  48. data/lib/mongo/collection.rb +130 -1101
  49. data/lib/mongo/cursor.rb +78 -681
  50. data/lib/mongo/database/view.rb +101 -0
  51. data/lib/mongo/database.rb +224 -0
  52. data/lib/mongo/error/bulk_write_error.rb +41 -0
  53. data/lib/mongo/error/invalid_bulk_operation.rb +36 -0
  54. data/lib/mongo/error/invalid_bulk_operation_type.rb +36 -0
  55. data/lib/mongo/error/invalid_collection_name.rb +39 -0
  56. data/lib/mongo/error/invalid_database_name.rb +39 -0
  57. data/{test/replica_set/ssl_test.rb → lib/mongo/error/invalid_document.rb} +21 -14
  58. data/lib/mongo/error/invalid_file.rb +38 -0
  59. data/lib/mongo/error/invalid_nonce.rb +46 -0
  60. data/lib/mongo/error/invalid_replacement_document.rb +39 -0
  61. data/lib/mongo/error/invalid_signature.rb +47 -0
  62. data/{test/functional/ssl_test.rb → lib/mongo/error/invalid_update_document.rb} +22 -12
  63. data/lib/mongo/error/max_bson_size.rb +40 -0
  64. data/lib/mongo/error/max_message_size.rb +42 -0
  65. data/{test/functional/db_connection_test.rb → lib/mongo/error/multi_index_drop.rb} +17 -8
  66. data/lib/mongo/{utils.rb → error/need_primary_server.rb} +10 -6
  67. data/lib/mongo/{connection.rb → error/operation_failure.rb} +10 -6
  68. data/lib/mongo/error/parser.rb +77 -0
  69. data/lib/mongo/{connection/socket.rb → error/socket_error.rb} +10 -5
  70. data/lib/mongo/error/socket_timeout_error.rb +23 -0
  71. data/lib/mongo/error/unsupported_features.rb +43 -0
  72. data/lib/mongo/error.rb +82 -0
  73. data/lib/mongo/event/listeners.rb +63 -0
  74. data/lib/mongo/event/primary_elected.rb +53 -0
  75. data/lib/mongo/event/publisher.rb +42 -0
  76. data/lib/mongo/event/server_added.rb +53 -0
  77. data/lib/mongo/event/server_removed.rb +53 -0
  78. data/lib/mongo/event/subscriber.rb +41 -0
  79. data/lib/mongo/event.rb +40 -0
  80. data/lib/mongo/grid/file/chunk.rb +184 -0
  81. data/lib/mongo/grid/file/metadata.rb +229 -0
  82. data/lib/mongo/grid/file.rb +106 -0
  83. data/lib/mongo/grid/fs.rb +149 -0
  84. data/lib/mongo/{gridfs.rb → grid.rb} +3 -5
  85. data/lib/mongo/index/view.rb +261 -0
  86. data/lib/mongo/index.rb +64 -0
  87. data/lib/mongo/loggable.rb +126 -0
  88. data/lib/mongo/logger.rb +132 -0
  89. data/lib/mongo/operation/aggregate/result.rb +88 -0
  90. data/lib/mongo/operation/aggregate.rb +100 -0
  91. data/lib/mongo/operation/command.rb +62 -0
  92. data/lib/mongo/operation/executable.rb +105 -0
  93. data/lib/mongo/operation/kill_cursors.rb +39 -0
  94. data/lib/mongo/operation/limited.rb +37 -0
  95. data/lib/mongo/operation/list_collections/result.rb +114 -0
  96. data/lib/mongo/operation/list_indexes/result.rb +118 -0
  97. data/lib/mongo/operation/map_reduce/result.rb +122 -0
  98. data/lib/mongo/operation/map_reduce.rb +96 -0
  99. data/lib/mongo/operation/read/collections_info.rb +67 -0
  100. data/lib/mongo/operation/read/get_more.rb +71 -0
  101. data/lib/mongo/operation/read/indexes.rb +68 -0
  102. data/lib/mongo/operation/read/list_collections.rb +75 -0
  103. data/lib/mongo/operation/read/list_indexes.rb +77 -0
  104. data/lib/mongo/operation/read/query.rb +71 -0
  105. data/lib/mongo/{functional.rb → operation/read.rb} +7 -7
  106. data/lib/mongo/operation/read_preferrable.rb +34 -0
  107. data/lib/mongo/operation/result.rb +259 -0
  108. data/lib/mongo/operation/specifiable.rb +397 -0
  109. data/lib/mongo/operation/write/bulk/bulk_delete/result.rb +75 -0
  110. data/lib/mongo/operation/write/bulk/bulk_delete.rb +144 -0
  111. data/lib/mongo/operation/write/bulk/bulk_insert/result.rb +68 -0
  112. data/lib/mongo/operation/write/bulk/bulk_insert.rb +129 -0
  113. data/lib/mongo/operation/write/bulk/bulk_mergable.rb +67 -0
  114. data/lib/mongo/operation/write/bulk/bulk_update/result.rb +162 -0
  115. data/lib/mongo/operation/write/bulk/bulk_update.rb +153 -0
  116. data/lib/mongo/operation/write/bulk/legacy_bulk_mergable.rb +83 -0
  117. data/lib/mongo/operation/write/bulk.rb +17 -0
  118. data/lib/mongo/operation/write/command/create_index.rb +50 -0
  119. data/lib/mongo/operation/write/command/create_user.rb +43 -0
  120. data/lib/mongo/operation/write/command/delete.rb +56 -0
  121. data/lib/mongo/operation/write/command/drop_index.rb +51 -0
  122. data/lib/mongo/operation/write/command/insert.rb +55 -0
  123. data/lib/mongo/operation/write/command/remove_user.rb +42 -0
  124. data/lib/mongo/operation/write/command/update.rb +60 -0
  125. data/lib/mongo/operation/write/command/writable.rb +61 -0
  126. data/lib/mongo/operation/write/command.rb +22 -0
  127. data/lib/mongo/operation/write/create_index.rb +89 -0
  128. data/lib/mongo/operation/write/create_user.rb +75 -0
  129. data/lib/mongo/operation/write/delete/result.rb +40 -0
  130. data/lib/mongo/operation/write/delete.rb +93 -0
  131. data/lib/mongo/operation/write/drop_index.rb +62 -0
  132. data/lib/mongo/{utils/thread_local_variable_manager.rb → operation/write/insert/result.rb} +15 -8
  133. data/lib/mongo/operation/write/insert.rb +90 -0
  134. data/lib/mongo/operation/write/remove_user.rb +70 -0
  135. data/lib/mongo/operation/write/update/result.rb +160 -0
  136. data/lib/mongo/operation/write/update.rb +103 -0
  137. data/lib/mongo/{connection/socket/socket_util.rb → operation/write.rb} +10 -24
  138. data/lib/mongo/operation.rb +25 -0
  139. data/lib/mongo/options/mapper.rb +78 -0
  140. data/lib/mongo/options.rb +15 -0
  141. data/lib/mongo/protocol/bit_vector.rb +61 -0
  142. data/lib/mongo/protocol/delete.rb +94 -0
  143. data/lib/mongo/protocol/get_more.rb +99 -0
  144. data/lib/mongo/protocol/insert.rb +99 -0
  145. data/lib/mongo/protocol/kill_cursors.rb +74 -0
  146. data/lib/mongo/protocol/message.rb +252 -0
  147. data/lib/mongo/protocol/query.rb +147 -0
  148. data/lib/mongo/protocol/reply.rb +72 -0
  149. data/lib/mongo/protocol/serializers.rb +180 -0
  150. data/lib/mongo/protocol/update.rb +111 -0
  151. data/lib/mongo/protocol.rb +15 -0
  152. data/lib/mongo/server/connectable.rb +110 -0
  153. data/lib/mongo/server/connection.rb +134 -0
  154. data/lib/mongo/server/connection_pool/queue.rb +182 -0
  155. data/lib/mongo/server/connection_pool.rb +141 -0
  156. data/lib/mongo/server/context.rb +66 -0
  157. data/lib/mongo/server/description/features.rb +85 -0
  158. data/lib/mongo/server/description/inspector/primary_elected.rb +58 -0
  159. data/lib/mongo/server/description/inspector/server_added.rb +59 -0
  160. data/lib/mongo/server/description/inspector/server_removed.rb +59 -0
  161. data/lib/mongo/server/description/inspector.rb +79 -0
  162. data/lib/mongo/server/description.rb +450 -0
  163. data/lib/mongo/server/monitor/connection.rb +89 -0
  164. data/lib/mongo/server/monitor.rb +176 -0
  165. data/lib/mongo/server.rb +163 -0
  166. data/lib/mongo/server_selector/nearest.rb +94 -0
  167. data/lib/mongo/server_selector/primary.rb +88 -0
  168. data/lib/mongo/server_selector/primary_preferred.rb +94 -0
  169. data/lib/mongo/server_selector/secondary.rb +91 -0
  170. data/lib/mongo/server_selector/secondary_preferred.rb +96 -0
  171. data/lib/mongo/server_selector/selectable.rb +209 -0
  172. data/lib/mongo/server_selector.rb +81 -0
  173. data/lib/mongo/socket/ssl.rb +130 -0
  174. data/lib/mongo/socket/tcp.rb +69 -0
  175. data/lib/mongo/socket/unix.rb +64 -0
  176. data/lib/mongo/socket.rb +179 -0
  177. data/lib/mongo/uri.rb +504 -0
  178. data/lib/mongo/version.rb +21 -0
  179. data/lib/mongo/write_concern/acknowledged.rb +52 -0
  180. data/lib/mongo/write_concern/normalizable.rb +51 -0
  181. data/lib/mongo/write_concern/unacknowledged.rb +55 -0
  182. data/lib/mongo/write_concern.rb +99 -0
  183. data/lib/mongo.rb +24 -82
  184. data/mongo.gemspec +17 -14
  185. data/spec/certificates/ca.pem +17 -0
  186. data/spec/certificates/client.pem +101 -0
  187. data/spec/certificates/crl.pem +10 -0
  188. data/spec/certificates/crl_client_revoked.pem +12 -0
  189. data/spec/certificates/password_protected.pem +51 -0
  190. data/spec/certificates/server.pem +34 -0
  191. data/spec/mongo/address/ipv4_spec.rb +74 -0
  192. data/spec/mongo/address/ipv6_spec.rb +74 -0
  193. data/spec/mongo/address/unix_spec.rb +30 -0
  194. data/spec/mongo/address_spec.rb +206 -0
  195. data/spec/mongo/auth/cr_spec.rb +59 -0
  196. data/spec/mongo/auth/ldap_spec.rb +40 -0
  197. data/spec/mongo/auth/scram/conversation_spec.rb +197 -0
  198. data/spec/mongo/auth/scram_spec.rb +55 -0
  199. data/spec/mongo/auth/user/view_spec.rb +76 -0
  200. data/spec/mongo/auth/user_spec.rb +190 -0
  201. data/spec/mongo/auth/x509_spec.rb +40 -0
  202. data/spec/mongo/auth_spec.rb +65 -0
  203. data/spec/mongo/bulk/bulk_write_spec.rb +262 -0
  204. data/spec/mongo/client_spec.rb +564 -0
  205. data/spec/mongo/cluster/topology/replica_set_spec.rb +101 -0
  206. data/spec/mongo/cluster/topology/sharded_spec.rb +74 -0
  207. data/spec/mongo/cluster/topology/standalone_spec.rb +79 -0
  208. data/spec/mongo/cluster/topology_spec.rb +65 -0
  209. data/spec/mongo/cluster_spec.rb +129 -0
  210. data/spec/mongo/collection/view/aggregation_spec.rb +148 -0
  211. data/spec/mongo/collection/view/explainable_spec.rb +32 -0
  212. data/spec/mongo/collection/view/map_reduce_spec.rb +242 -0
  213. data/spec/mongo/collection/view/readable_spec.rb +603 -0
  214. data/spec/mongo/collection/view/writable_spec.rb +679 -0
  215. data/spec/mongo/collection/view_spec.rb +530 -0
  216. data/spec/mongo/collection_spec.rb +362 -0
  217. data/spec/mongo/crud_spec.rb +42 -0
  218. data/spec/mongo/cursor_spec.rb +295 -0
  219. data/spec/mongo/database_spec.rb +302 -0
  220. data/spec/mongo/error/parser_spec.rb +119 -0
  221. data/spec/mongo/event/publisher_spec.rb +50 -0
  222. data/spec/mongo/event/subscriber_spec.rb +34 -0
  223. data/spec/mongo/grid/file/chunk_spec.rb +226 -0
  224. data/spec/mongo/grid/file/metadata_spec.rb +92 -0
  225. data/spec/mongo/grid/file_spec.rb +172 -0
  226. data/spec/mongo/grid/fs_spec.rb +129 -0
  227. data/spec/mongo/index/view_spec.rb +330 -0
  228. data/spec/mongo/loggable_spec.rb +62 -0
  229. data/spec/mongo/logger_spec.rb +97 -0
  230. data/spec/mongo/operation/aggregate/result_spec.rb +80 -0
  231. data/spec/mongo/operation/aggregate_spec.rb +127 -0
  232. data/spec/mongo/operation/command_spec.rb +98 -0
  233. data/spec/mongo/operation/kill_cursors_spec.rb +66 -0
  234. data/spec/mongo/operation/limited_spec.rb +50 -0
  235. data/spec/mongo/operation/map_reduce_spec.rb +143 -0
  236. data/spec/mongo/operation/read/collections_info_spec.rb +40 -0
  237. data/spec/mongo/operation/read/get_more_spec.rb +81 -0
  238. data/spec/mongo/operation/read/indexes_spec.rb +31 -0
  239. data/spec/mongo/operation/read/query_spec.rb +84 -0
  240. data/spec/mongo/operation/result_spec.rb +275 -0
  241. data/spec/mongo/operation/specifiable_spec.rb +53 -0
  242. data/spec/mongo/operation/write/bulk_delete_spec.rb +235 -0
  243. data/spec/mongo/operation/write/bulk_insert_spec.rb +235 -0
  244. data/spec/mongo/operation/write/bulk_update_spec.rb +236 -0
  245. data/spec/mongo/operation/write/command/delete_spec.rb +103 -0
  246. data/spec/mongo/operation/write/command/insert_spec.rb +103 -0
  247. data/spec/mongo/operation/write/command/update_spec.rb +109 -0
  248. data/spec/mongo/operation/write/create_index_spec.rb +63 -0
  249. data/spec/mongo/operation/write/create_user_spec.rb +44 -0
  250. data/spec/mongo/operation/write/delete_spec.rb +186 -0
  251. data/spec/mongo/operation/write/drop_index_spec.rb +51 -0
  252. data/spec/mongo/operation/write/insert_spec.rb +244 -0
  253. data/spec/mongo/operation/write/remove_user_spec.rb +46 -0
  254. data/spec/mongo/operation/write/response_spec.rb +85 -0
  255. data/spec/mongo/operation/write/update_spec.rb +228 -0
  256. data/spec/mongo/protocol/delete_spec.rb +167 -0
  257. data/spec/mongo/protocol/get_more_spec.rb +146 -0
  258. data/spec/mongo/protocol/insert_spec.rb +161 -0
  259. data/spec/mongo/protocol/kill_cursors_spec.rb +101 -0
  260. data/spec/mongo/protocol/query_spec.rb +285 -0
  261. data/spec/mongo/protocol/reply_spec.rb +157 -0
  262. data/spec/mongo/protocol/update_spec.rb +186 -0
  263. data/spec/mongo/server/connection_pool/queue_spec.rb +170 -0
  264. data/spec/mongo/server/connection_pool_spec.rb +120 -0
  265. data/spec/mongo/server/connection_spec.rb +312 -0
  266. data/spec/mongo/server/description/features_spec.rb +138 -0
  267. data/spec/mongo/server/description/inspector/primary_elected_spec.rb +94 -0
  268. data/spec/mongo/server/description/inspector/server_added_spec.rb +92 -0
  269. data/spec/mongo/server/description/inspector/server_removed_spec.rb +95 -0
  270. data/spec/mongo/server/description_spec.rb +510 -0
  271. data/spec/mongo/server/monitor_spec.rb +144 -0
  272. data/spec/mongo/server_discovery_and_monitoring_spec.rb +103 -0
  273. data/spec/mongo/server_selection_rtt_spec.rb +104 -0
  274. data/spec/mongo/server_selection_spec.rb +89 -0
  275. data/spec/mongo/server_selector/nearest_spec.rb +250 -0
  276. data/spec/mongo/server_selector/primary_preferred_spec.rb +290 -0
  277. data/spec/mongo/server_selector/primary_spec.rb +114 -0
  278. data/spec/mongo/server_selector/secondary_preferred_spec.rb +252 -0
  279. data/spec/mongo/server_selector/secondary_spec.rb +196 -0
  280. data/spec/mongo/server_selector_spec.rb +101 -0
  281. data/spec/mongo/server_spec.rb +131 -0
  282. data/spec/mongo/uri_spec.rb +517 -0
  283. data/spec/mongo/write_concern/acknowledged_spec.rb +44 -0
  284. data/spec/mongo/write_concern/unacknowledged_spec.rb +15 -0
  285. data/spec/spec_helper.rb +133 -0
  286. data/spec/support/authorization.rb +247 -0
  287. data/spec/support/crud/read.rb +144 -0
  288. data/spec/support/crud/write.rb +214 -0
  289. data/spec/support/crud.rb +203 -0
  290. data/spec/support/crud_tests/read/aggregate.yml +43 -0
  291. data/spec/support/crud_tests/read/count.yml +37 -0
  292. data/spec/support/crud_tests/read/distinct.yml +33 -0
  293. data/spec/support/crud_tests/read/find.yml +50 -0
  294. data/spec/support/crud_tests/write/deleteMany.yml +36 -0
  295. data/spec/support/crud_tests/write/deleteOne.yml +49 -0
  296. data/spec/support/crud_tests/write/findOneAndDelete.yml +54 -0
  297. data/spec/support/crud_tests/write/findOneAndReplace.yml +153 -0
  298. data/spec/support/crud_tests/write/findOneAndUpdate.yml +161 -0
  299. data/spec/support/crud_tests/write/insertMany.yml +24 -0
  300. data/spec/support/crud_tests/write/insertOne.yml +19 -0
  301. data/spec/support/crud_tests/write/replaceOne.yml +96 -0
  302. data/spec/support/crud_tests/write/updateMany.yml +83 -0
  303. data/spec/support/crud_tests/write/updateOne.yml +80 -0
  304. data/spec/support/helpers.rb +140 -0
  305. data/spec/support/matchers.rb +37 -0
  306. data/spec/support/sdam/rs/discover_arbiters.yml +41 -0
  307. data/spec/support/sdam/rs/discover_passives.yml +41 -0
  308. data/spec/support/sdam/rs/discover_primary.yml +40 -0
  309. data/spec/support/sdam/rs/discover_secondary.yml +41 -0
  310. data/spec/support/sdam/rs/discovery.yml +195 -0
  311. data/spec/support/sdam/rs/ghost_discovered.yml +39 -0
  312. data/spec/support/sdam/rs/hosts_differ_from_seeds.yml +34 -0
  313. data/spec/support/sdam/rs/member_reconfig.yml +68 -0
  314. data/spec/support/sdam/rs/member_standalone.yml +60 -0
  315. data/spec/support/sdam/rs/new_primary.yml +74 -0
  316. data/spec/support/sdam/rs/new_primary_wrong_set_name.yml +71 -0
  317. data/spec/support/sdam/rs/non_rs_member.yml +31 -0
  318. data/spec/support/sdam/rs/normalize_case.yml +49 -0
  319. data/spec/support/sdam/rs/primary_becomes_standalone.yml +52 -0
  320. data/spec/support/sdam/rs/primary_changes_set_name.yml +57 -0
  321. data/spec/support/sdam/rs/primary_disconnect.yml +56 -0
  322. data/spec/support/sdam/rs/primary_wrong_set_name.yml +27 -0
  323. data/spec/support/sdam/rs/response_from_removed.yml +63 -0
  324. data/spec/support/sdam/rs/rsother_discovered.yml +41 -0
  325. data/spec/support/sdam/rs/sec_not_auth.yml +49 -0
  326. data/spec/support/sdam/rs/secondary_wrong_set_name.yml +28 -0
  327. data/spec/support/sdam/rs/secondary_wrong_set_name_with_primary.yml +69 -0
  328. data/spec/support/sdam/rs/unexpected_mongos.yml +26 -0
  329. data/spec/support/sdam/rs/wrong_set_name.yml +35 -0
  330. data/spec/support/sdam/sharded/multiple_mongoses.yml +46 -0
  331. data/spec/support/sdam/sharded/non_mongos_removed.yml +41 -0
  332. data/spec/support/sdam/sharded/normalize_uri_case.yml +32 -0
  333. data/spec/support/sdam/single/direct_connection_external_ip.yml +34 -0
  334. data/spec/support/sdam/single/direct_connection_mongos.yml +33 -0
  335. data/spec/support/sdam/single/direct_connection_rsarbiter.yml +35 -0
  336. data/spec/support/sdam/single/direct_connection_rsprimary.yml +34 -0
  337. data/spec/support/sdam/single/direct_connection_rssecondary.yml +35 -0
  338. data/spec/support/sdam/single/direct_connection_slave.yml +32 -0
  339. data/spec/support/sdam/single/direct_connection_standalone.yml +32 -0
  340. data/spec/support/sdam/single/not_ok_response.yml +39 -0
  341. data/spec/support/sdam/single/standalone_removed.yml +32 -0
  342. data/spec/support/sdam/single/unavailable_seed.yml +28 -0
  343. data/spec/support/server_discovery_and_monitoring.rb +167 -0
  344. data/spec/support/server_selection/rtt/first_value.yml +4 -0
  345. data/spec/support/server_selection/rtt/first_value_zero.yml +4 -0
  346. data/spec/support/server_selection/rtt/value_test_1.yml +4 -0
  347. data/spec/support/server_selection/rtt/value_test_2.yml +4 -0
  348. data/spec/support/server_selection/rtt/value_test_3.yml +4 -0
  349. data/spec/support/server_selection/rtt/value_test_4.yml +4 -0
  350. data/spec/support/server_selection/rtt/value_test_5.yml +4 -0
  351. data/spec/support/server_selection/selection/ReplicaSetNoPrimary/read/Nearest.yml +26 -0
  352. data/spec/support/server_selection/selection/ReplicaSetNoPrimary/read/Nearest_non_matching.yml +21 -0
  353. data/spec/support/server_selection/selection/ReplicaSetNoPrimary/read/Primary.yml +21 -0
  354. data/spec/support/server_selection/selection/ReplicaSetNoPrimary/read/PrimaryPreferred.yml +26 -0
  355. data/spec/support/server_selection/selection/ReplicaSetNoPrimary/read/PrimaryPreferred_non_matching.yml +21 -0
  356. data/spec/support/server_selection/selection/ReplicaSetNoPrimary/read/Secondary.yml +26 -0
  357. data/spec/support/server_selection/selection/ReplicaSetNoPrimary/read/SecondaryPreferred.yml +26 -0
  358. data/spec/support/server_selection/selection/ReplicaSetNoPrimary/read/SecondaryPreferred_non_matching.yml +21 -0
  359. data/spec/support/server_selection/selection/ReplicaSetNoPrimary/read/Secondary_non_matching.yml +21 -0
  360. data/spec/support/server_selection/selection/ReplicaSetWithPrimary/read/Nearest.yml +33 -0
  361. data/spec/support/server_selection/selection/ReplicaSetWithPrimary/read/Nearest_non_matching.yml +26 -0
  362. data/spec/support/server_selection/selection/ReplicaSetWithPrimary/read/Primary.yml +29 -0
  363. data/spec/support/server_selection/selection/ReplicaSetWithPrimary/read/PrimaryPreferred.yml +29 -0
  364. data/spec/support/server_selection/selection/ReplicaSetWithPrimary/read/PrimaryPreferred_non_matching.yml +29 -0
  365. data/spec/support/server_selection/selection/ReplicaSetWithPrimary/read/Secondary.yml +31 -0
  366. data/spec/support/server_selection/selection/ReplicaSetWithPrimary/read/SecondaryPreferred.yml +31 -0
  367. data/spec/support/server_selection/selection/ReplicaSetWithPrimary/read/SecondaryPreferred_non_matching.yml +29 -0
  368. data/spec/support/server_selection/selection/ReplicaSetWithPrimary/read/Secondary_non_matching.yml +26 -0
  369. data/spec/support/server_selection/selection/Sharded/read/SecondaryPreferred.yml +26 -0
  370. data/spec/support/server_selection/selection/Single/read/SecondaryPreferred.yml +19 -0
  371. data/spec/support/server_selection/selection/Unknown/read/SecondaryPreferred.yml +11 -0
  372. data/spec/support/server_selection.rb +157 -0
  373. data/spec/support/server_selection_rtt.rb +41 -0
  374. data/spec/support/shared/bulk_write.rb +535 -0
  375. data/spec/support/shared/cursor.rb +38 -0
  376. data/spec/support/shared/operation.rb +77 -0
  377. data/spec/support/shared/protocol.rb +31 -0
  378. data/spec/support/shared/server_selector.rb +111 -0
  379. data/spec/support/shared/socket.rb +82 -0
  380. data/spec/support/travis.rb +14 -0
  381. data.tar.gz.sig +2 -3
  382. metadata +583 -186
  383. metadata.gz.sig +0 -0
  384. data/VERSION +0 -1
  385. data/lib/mongo/bulk_write_collection_view.rb +0 -387
  386. data/lib/mongo/collection_writer.rb +0 -364
  387. data/lib/mongo/connection/node.rb +0 -249
  388. data/lib/mongo/connection/pool.rb +0 -340
  389. data/lib/mongo/connection/pool_manager.rb +0 -320
  390. data/lib/mongo/connection/sharding_pool_manager.rb +0 -67
  391. data/lib/mongo/connection/socket/ssl_socket.rb +0 -95
  392. data/lib/mongo/connection/socket/tcp_socket.rb +0 -87
  393. data/lib/mongo/connection/socket/unix_socket.rb +0 -39
  394. data/lib/mongo/db.rb +0 -808
  395. data/lib/mongo/exception.rb +0 -145
  396. data/lib/mongo/functional/authentication.rb +0 -455
  397. data/lib/mongo/functional/logging.rb +0 -85
  398. data/lib/mongo/functional/read_preference.rb +0 -183
  399. data/lib/mongo/functional/scram.rb +0 -556
  400. data/lib/mongo/functional/uri_parser.rb +0 -409
  401. data/lib/mongo/functional/write_concern.rb +0 -66
  402. data/lib/mongo/gridfs/grid.rb +0 -112
  403. data/lib/mongo/gridfs/grid_ext.rb +0 -53
  404. data/lib/mongo/gridfs/grid_file_system.rb +0 -163
  405. data/lib/mongo/gridfs/grid_io.rb +0 -484
  406. data/lib/mongo/legacy.rb +0 -140
  407. data/lib/mongo/mongo_client.rb +0 -697
  408. data/lib/mongo/mongo_replica_set_client.rb +0 -535
  409. data/lib/mongo/mongo_sharded_client.rb +0 -159
  410. data/lib/mongo/networking.rb +0 -372
  411. data/lib/mongo/utils/conversions.rb +0 -110
  412. data/lib/mongo/utils/core_ext.rb +0 -70
  413. data/lib/mongo/utils/server_version.rb +0 -69
  414. data/lib/mongo/utils/support.rb +0 -80
  415. data/test/functional/authentication_test.rb +0 -39
  416. data/test/functional/bulk_api_stress_test.rb +0 -133
  417. data/test/functional/bulk_write_collection_view_test.rb +0 -1198
  418. data/test/functional/client_test.rb +0 -627
  419. data/test/functional/collection_test.rb +0 -2175
  420. data/test/functional/collection_writer_test.rb +0 -83
  421. data/test/functional/conversions_test.rb +0 -163
  422. data/test/functional/cursor_fail_test.rb +0 -57
  423. data/test/functional/cursor_message_test.rb +0 -56
  424. data/test/functional/cursor_test.rb +0 -683
  425. data/test/functional/db_api_test.rb +0 -835
  426. data/test/functional/db_test.rb +0 -348
  427. data/test/functional/grid_file_system_test.rb +0 -285
  428. data/test/functional/grid_io_test.rb +0 -252
  429. data/test/functional/grid_test.rb +0 -273
  430. data/test/functional/pool_test.rb +0 -136
  431. data/test/functional/safe_test.rb +0 -98
  432. data/test/functional/support_test.rb +0 -62
  433. data/test/functional/timeout_test.rb +0 -60
  434. data/test/functional/uri_test.rb +0 -446
  435. data/test/functional/write_concern_test.rb +0 -118
  436. data/test/helpers/general.rb +0 -50
  437. data/test/helpers/test_unit.rb +0 -476
  438. data/test/replica_set/authentication_test.rb +0 -37
  439. data/test/replica_set/basic_test.rb +0 -189
  440. data/test/replica_set/client_test.rb +0 -393
  441. data/test/replica_set/connection_test.rb +0 -138
  442. data/test/replica_set/count_test.rb +0 -66
  443. data/test/replica_set/cursor_test.rb +0 -220
  444. data/test/replica_set/insert_test.rb +0 -157
  445. data/test/replica_set/max_values_test.rb +0 -151
  446. data/test/replica_set/pinning_test.rb +0 -105
  447. data/test/replica_set/query_test.rb +0 -73
  448. data/test/replica_set/read_preference_test.rb +0 -219
  449. data/test/replica_set/refresh_test.rb +0 -211
  450. data/test/replica_set/replication_ack_test.rb +0 -95
  451. data/test/sharded_cluster/basic_test.rb +0 -203
  452. data/test/shared/authentication/basic_auth_shared.rb +0 -260
  453. data/test/shared/authentication/bulk_api_auth_shared.rb +0 -249
  454. data/test/shared/authentication/gssapi_shared.rb +0 -176
  455. data/test/shared/authentication/sasl_plain_shared.rb +0 -96
  456. data/test/shared/authentication/scram_shared.rb +0 -92
  457. data/test/shared/ssl_shared.rb +0 -235
  458. data/test/test_helper.rb +0 -61
  459. data/test/threading/basic_test.rb +0 -120
  460. data/test/tools/mongo_config.rb +0 -708
  461. data/test/tools/mongo_config_test.rb +0 -160
  462. data/test/unit/client_test.rb +0 -381
  463. data/test/unit/collection_test.rb +0 -166
  464. data/test/unit/connection_test.rb +0 -335
  465. data/test/unit/cursor_test.rb +0 -307
  466. data/test/unit/db_test.rb +0 -136
  467. data/test/unit/grid_test.rb +0 -76
  468. data/test/unit/mongo_sharded_client_test.rb +0 -48
  469. data/test/unit/node_test.rb +0 -93
  470. data/test/unit/pool_manager_test.rb +0 -111
  471. data/test/unit/read_pref_test.rb +0 -406
  472. data/test/unit/read_test.rb +0 -159
  473. data/test/unit/safe_test.rb +0 -158
  474. data/test/unit/sharding_pool_manager_test.rb +0 -84
  475. data/test/unit/write_concern_test.rb +0 -175
@@ -0,0 +1,190 @@
1
+ require 'spec_helper'
2
+
3
+ describe Mongo::Auth::User do
4
+
5
+ let(:options) do
6
+ { database: 'testing', user: 'user', password: 'pass' }
7
+ end
8
+
9
+ let(:user) do
10
+ described_class.new(options)
11
+ end
12
+
13
+ describe '#auth_key' do
14
+
15
+ let(:nonce) do
16
+
17
+ end
18
+
19
+ let(:expected) do
20
+ Digest::MD5.hexdigest("#{nonce}#{user.name}#{user.hashed_password}")
21
+ end
22
+
23
+ it 'returns the users authentication key' do
24
+ expect(user.auth_key(nonce)).to eq(expected)
25
+ end
26
+ end
27
+
28
+ describe '#encoded_name' do
29
+
30
+ context 'when the user name contains an =' do
31
+
32
+ let(:options) do
33
+ { user: 'user=' }
34
+ end
35
+
36
+ it 'escapes the = character to =3D' do
37
+ expect(user.encoded_name).to eq('user=3D')
38
+ end
39
+
40
+ it 'returns a UTF-8 string' do
41
+ expect(user.encoded_name.encoding.name).to eq('UTF-8')
42
+ end
43
+ end
44
+
45
+ context 'when the user name contains a ,' do
46
+
47
+ let(:options) do
48
+ { user: 'user,' }
49
+ end
50
+
51
+ it 'escapes the , character to =2C' do
52
+ expect(user.encoded_name).to eq('user=2C')
53
+ end
54
+
55
+ it 'returns a UTF-8 string' do
56
+ expect(user.encoded_name.encoding.name).to eq('UTF-8')
57
+ end
58
+ end
59
+
60
+ context 'when the user name contains no special characters' do
61
+
62
+ it 'does not alter the user name' do
63
+ expect(user.name).to eq('user')
64
+ end
65
+
66
+ it 'returns a UTF-8 string' do
67
+ expect(user.encoded_name.encoding.name).to eq('UTF-8')
68
+ end
69
+ end
70
+ end
71
+
72
+ describe '#initialize' do
73
+
74
+ it 'sets the database' do
75
+ expect(user.database).to eq('testing')
76
+ end
77
+
78
+ it 'sets the name' do
79
+ expect(user.name).to eq('user')
80
+ end
81
+
82
+ it 'sets the password' do
83
+ expect(user.password).to eq('pass')
84
+ end
85
+ end
86
+
87
+ describe '#hashed_password' do
88
+
89
+ let(:expected) do
90
+ Digest::MD5.hexdigest("user:mongo:pass")
91
+ end
92
+
93
+ it 'returns the hashed password' do
94
+ expect(user.hashed_password).to eq(expected)
95
+ end
96
+ end
97
+
98
+ describe '#mechanism' do
99
+
100
+ context 'when the option is provided' do
101
+
102
+ let(:options) do
103
+ { database: 'testing', user: 'user', password: 'pass', auth_mech: :plain }
104
+ end
105
+
106
+ let(:user) do
107
+ described_class.new(options)
108
+ end
109
+
110
+ it 'returns the option' do
111
+ expect(user.mechanism).to eq(:plain)
112
+ end
113
+ end
114
+
115
+ context 'when no option is provided' do
116
+
117
+ let(:user) do
118
+ described_class.new(options)
119
+ end
120
+
121
+ it 'returns the default' do
122
+ expect(user.mechanism).to eq(:mongodb_cr)
123
+ end
124
+ end
125
+ end
126
+
127
+ describe '#auth_mech_properties' do
128
+
129
+ context 'when the option is provided' do
130
+
131
+ let(:auth_mech_properties) do
132
+ { service_name: 'test',
133
+ service_realm: 'test',
134
+ canonicalize_host_name: true }
135
+ end
136
+
137
+ let(:options) do
138
+ { database: 'testing', user: 'user', password: 'pass', auth_mech_properties: auth_mech_properties }
139
+ end
140
+
141
+ let(:user) do
142
+ described_class.new(options)
143
+ end
144
+
145
+ it 'returns the option' do
146
+ expect(user.auth_mech_properties).to eq(auth_mech_properties)
147
+ end
148
+ end
149
+
150
+ context 'when no option is provided' do
151
+
152
+ let(:user) do
153
+ described_class.new(options)
154
+ end
155
+
156
+ it 'returns an empty hash' do
157
+ expect(user.auth_mech_properties).to eq({})
158
+ end
159
+ end
160
+ end
161
+
162
+ describe '#roles' do
163
+
164
+ context 'when roles are provided' do
165
+
166
+ let(:roles) do
167
+ [ Mongo::Auth::Roles::ROOT ]
168
+ end
169
+
170
+ let(:user) do
171
+ described_class.new(roles: roles)
172
+ end
173
+
174
+ it 'returns the roles' do
175
+ expect(user.roles).to eq(roles)
176
+ end
177
+ end
178
+
179
+ context 'when no roles are provided' do
180
+
181
+ let(:user) do
182
+ described_class.new({})
183
+ end
184
+
185
+ it 'returns an empty array' do
186
+ expect(user.roles).to be_empty
187
+ end
188
+ end
189
+ end
190
+ end
@@ -0,0 +1,40 @@
1
+ require 'spec_helper'
2
+
3
+ describe Mongo::Auth::X509 do
4
+
5
+ let(:address) do
6
+ Mongo::Address.new(DEFAULT_ADDRESS)
7
+ end
8
+
9
+ let(:server) do
10
+ Mongo::Server.new(address, Mongo::Event::Listeners.new)
11
+ end
12
+
13
+ let(:connection) do
14
+ Mongo::Server::Connection.new(server)
15
+ end
16
+
17
+ let(:user) do
18
+ Mongo::Auth::User.new(database: TEST_DB, user: 'driver', password: 'password')
19
+ end
20
+
21
+ describe '#login' do
22
+
23
+ context 'when the user is not authorized for the database' do
24
+
25
+ let(:cr) do
26
+ described_class.new(user)
27
+ end
28
+
29
+ let(:login) do
30
+ cr.login(connection).documents[0]
31
+ end
32
+
33
+ it 'logs the user into the connection' do
34
+ expect {
35
+ cr.login(connection)
36
+ }.to raise_error(Mongo::Auth::Unauthorized)
37
+ end
38
+ end
39
+ end
40
+ end
@@ -0,0 +1,65 @@
1
+ require 'spec_helper'
2
+
3
+ describe Mongo::Auth do
4
+
5
+ describe '#get' do
6
+
7
+ context 'when a mongodb_cr user is provided' do
8
+
9
+ let(:user) do
10
+ Mongo::Auth::User.new(auth_mech: :mongodb_cr)
11
+ end
12
+
13
+ let(:cr) do
14
+ described_class.get(user)
15
+ end
16
+
17
+ it 'returns CR' do
18
+ expect(cr).to be_a(Mongo::Auth::CR)
19
+ end
20
+ end
21
+
22
+ context 'when a mongodb_x509 user is provided' do
23
+
24
+ let(:user) do
25
+ Mongo::Auth::User.new(auth_mech: :mongodb_x509)
26
+ end
27
+
28
+ let(:x509) do
29
+ described_class.get(user)
30
+ end
31
+
32
+ it 'returns X509' do
33
+ expect(x509).to be_a(Mongo::Auth::X509)
34
+ end
35
+ end
36
+
37
+ context 'when a plain user is provided' do
38
+
39
+ let(:user) do
40
+ Mongo::Auth::User.new(auth_mech: :plain)
41
+ end
42
+
43
+ let(:ldap) do
44
+ described_class.get(user)
45
+ end
46
+
47
+ it 'returns LDAP' do
48
+ expect(ldap).to be_a(Mongo::Auth::LDAP)
49
+ end
50
+ end
51
+
52
+ context 'when an invalid mechanism is provided' do
53
+
54
+ let(:user) do
55
+ Mongo::Auth::User.new(auth_mech: :nothing)
56
+ end
57
+
58
+ it 'raises an error' do
59
+ expect {
60
+ described_class.get(user)
61
+ }.to raise_error(Mongo::Auth::InvalidMechanism)
62
+ end
63
+ end
64
+ end
65
+ end
@@ -0,0 +1,262 @@
1
+ require 'spec_helper'
2
+
3
+ describe Mongo::BulkWrite do
4
+
5
+ before do
6
+ authorized_collection.find.delete_many
7
+ end
8
+
9
+ after do
10
+ authorized_collection.find.delete_many
11
+ end
12
+
13
+ let(:bulk) do
14
+ described_class.get(authorized_collection, operations, options)
15
+ end
16
+
17
+ describe '#get' do
18
+
19
+ let(:operations) do
20
+ [{ insert_one: { _id: 0 } }]
21
+ end
22
+
23
+ context 'When an ordered bulk write object is created' do
24
+
25
+ let(:options) do
26
+ { ordered: true }
27
+ end
28
+
29
+ it 'returns an OrderedBulkWrite object' do
30
+ expect(bulk).to be_a(Mongo::BulkWrite::OrderedBulkWrite)
31
+ end
32
+ end
33
+
34
+ context 'When an unordered bulk write object is created' do
35
+
36
+ let(:options) do
37
+ { ordered: false }
38
+ end
39
+
40
+ it 'returns an UnorderedBulkWrite object' do
41
+ expect(bulk).to be_a(Mongo::BulkWrite::UnorderedBulkWrite)
42
+ end
43
+ end
44
+
45
+ context 'When ordered is not specified in options' do
46
+
47
+ let(:options) do
48
+ { }
49
+ end
50
+
51
+ it 'returns an OrderedBulkWrite object' do
52
+ expect(bulk).to be_a(Mongo::BulkWrite::OrderedBulkWrite)
53
+ end
54
+ end
55
+ end
56
+
57
+ describe 'Ordered bulk write' do
58
+
59
+ let(:options) do
60
+ { ordered: true }
61
+ end
62
+
63
+ it_behaves_like 'a bulk write object'
64
+
65
+ context 'when the batch requires splitting' do
66
+
67
+ context 'when the operations are the same type' do
68
+
69
+ let(:error) do
70
+ begin
71
+ bulk.execute
72
+ rescue => ex
73
+ ex
74
+ end
75
+ end
76
+
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 } }
84
+ end
85
+ end
86
+
87
+ it 'raises a BulkWriteError' do
88
+ expect(error).to be_a(Mongo::Error::BulkWriteError)
89
+ end
90
+
91
+ it 'halts execution after first error and reports correct index' do
92
+ expect(error.result[:write_errors].first['index']).to eq(3000)
93
+ expect(authorized_collection.find.count).to eq(3000)
94
+ end
95
+ end
96
+
97
+ context 'when operations are mixed types' do
98
+
99
+ let(:error) do
100
+ begin
101
+ bulk.execute
102
+ rescue => ex
103
+ ex
104
+ end
105
+ end
106
+
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 } }
115
+ end
116
+ end
117
+
118
+ it 'raises a BulkWriteError error' do
119
+ expect(error).to be_a(Mongo::Error::BulkWriteError)
120
+ end
121
+
122
+ it 'halts execution after first error and reports correct index' do
123
+ expect(error.result[:write_errors].first['index']).to eq(2001)
124
+ expect(authorized_collection.find.count).to eq(1999)
125
+ end
126
+ end
127
+
128
+ context 'when the operations exceed the max bson size' do
129
+
130
+ let(:error) do
131
+ begin
132
+ bulk.execute
133
+ rescue => ex
134
+ ex
135
+ end
136
+ end
137
+
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 } }
145
+ end
146
+ end
147
+
148
+ it 'raises a BulkWriteError error' do
149
+ expect(error).to be_a(Mongo::Error::BulkWriteError)
150
+ end
151
+
152
+ it 'splits messages into multiple messages' do
153
+ error
154
+ expect(authorized_collection.find.count).to eq(6)
155
+ end
156
+ end
157
+ end
158
+ end
159
+
160
+ describe 'Unordered bulk write' do
161
+
162
+ let(:options) do
163
+ { ordered: false }
164
+ end
165
+
166
+ it_behaves_like 'a bulk write object'
167
+
168
+ context 'when the operations exceed the max batch size' do
169
+
170
+ context 'when operations are all the same type' do
171
+
172
+ let(:error) do
173
+ begin
174
+ bulk.execute
175
+ rescue => ex
176
+ ex
177
+ end
178
+ end
179
+
180
+ let(:operations) do
181
+ [].tap do |ops|
182
+ 3000.times do |i|
183
+ ops << { insert_one: { _id: i } }
184
+ end
185
+ ops << { insert_one: { _id: 0 } }
186
+ ops << { insert_one: { _id: 3001 } }
187
+ end
188
+ end
189
+
190
+ it 'raises a BulkWriteError error' do
191
+ expect(error).to be_a(Mongo::Error::BulkWriteError)
192
+ end
193
+
194
+ it 'does not halt execution after first error' do
195
+ expect(error.result[:write_errors].first['index']).to eq(3000)
196
+ expect(authorized_collection.find.count).to eq(3001)
197
+ end
198
+ end
199
+
200
+ context 'when operations are mixed types' do
201
+
202
+ let(:error) do
203
+ begin
204
+ bulk.execute
205
+ rescue => ex
206
+ ex
207
+ end
208
+ end
209
+
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
219
+ end
220
+
221
+ it 'raises a BulkWriteError error' do
222
+ expect(error).to be_a(Mongo::Error::BulkWriteError)
223
+ end
224
+
225
+ it 'does not halt execution after first error' do
226
+ expect(error.result[:write_errors].first['index']).to eq(2001)
227
+ expect(authorized_collection.find.count).to eq(2000)
228
+ end
229
+ end
230
+
231
+ context 'when the operations exceed the max bson size' do
232
+
233
+ let(:error) do
234
+ begin
235
+ bulk.execute
236
+ rescue => ex
237
+ ex
238
+ end
239
+ end
240
+
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
249
+ end
250
+
251
+ it 'raises a BulkWriteError error' do
252
+ expect(error).to be_a(Mongo::Error::BulkWriteError)
253
+ end
254
+
255
+ it 'splits messages into multiple messages' do
256
+ error
257
+ expect(authorized_collection.find.count).to eq(16)
258
+ end
259
+ end
260
+ end
261
+ end
262
+ end