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,235 @@
1
+ require 'spec_helper'
2
+
3
+ describe Mongo::Operation::Write::BulkInsert do
4
+ include_context 'operation'
5
+
6
+ let(:documents) do
7
+ [{ :name => 'test' }]
8
+ end
9
+
10
+ let(:spec) do
11
+ { documents: documents,
12
+ db_name: db_name,
13
+ coll_name: coll_name,
14
+ write_concern: write_concern
15
+ }
16
+ end
17
+
18
+ let(:op) do
19
+ described_class.new(spec)
20
+ end
21
+
22
+ describe '#initialize' do
23
+
24
+ context 'spec' do
25
+
26
+ it 'sets the spec' do
27
+ expect(op.spec).to eq(spec)
28
+ end
29
+ end
30
+ end
31
+
32
+ describe '#==' do
33
+
34
+ context 'spec' do
35
+
36
+ context 'when two inserts have the same specs' do
37
+
38
+ let(:other) do
39
+ described_class.new(spec)
40
+ end
41
+
42
+ it 'returns true' do
43
+ expect(op).to eq(other)
44
+ end
45
+ end
46
+
47
+ context 'when two inserts have different specs' do
48
+
49
+ let(:other_docs) do
50
+ [{ :bar => 1 }]
51
+ end
52
+
53
+ let(:other_spec) do
54
+ { :documents => other_docs,
55
+ :db_name => 'test',
56
+ :coll_name => 'coll_name',
57
+ :write_concern => { 'w' => 1 },
58
+ :ordered => true
59
+ }
60
+ end
61
+
62
+ let(:other) do
63
+ described_class.new(other_spec)
64
+ end
65
+
66
+ it 'returns false' do
67
+ expect(op).not_to eq(other)
68
+ end
69
+ end
70
+ end
71
+ end
72
+
73
+ describe '#dup' do
74
+
75
+ context 'deep copy' do
76
+
77
+ it 'copies the list of documents' do
78
+ copy = op.dup
79
+ expect(copy.spec[:documents]).to_not be(op.spec[:documents])
80
+ end
81
+ end
82
+ end
83
+
84
+ describe '#execute' do
85
+
86
+ before do
87
+ authorized_collection.indexes.create_one({ name: 1 }, { unique: true })
88
+ end
89
+
90
+ after do
91
+ authorized_collection.find.delete_many
92
+ authorized_collection.indexes.drop_one('name_1')
93
+ end
94
+
95
+ context 'when inserting a single document' do
96
+
97
+ context 'when the insert succeeds' do
98
+
99
+ let(:response) do
100
+ op.execute(authorized_primary.context)
101
+ end
102
+
103
+ it 'inserts the documents into the database', if: write_command_enabled? do
104
+ expect(response.written_count).to eq(1)
105
+ end
106
+
107
+ it 'inserts the documents into the database', unless: write_command_enabled? do
108
+ expect(response.written_count).to eq(0)
109
+ end
110
+ end
111
+ end
112
+
113
+ context 'when inserting multiple documents' do
114
+
115
+ context 'when the insert succeeds' do
116
+
117
+ let(:documents) do
118
+ [{ name: 'test1' }, { name: 'test2' }]
119
+ end
120
+
121
+ let(:response) do
122
+ op.execute(authorized_primary.context)
123
+ end
124
+
125
+ it 'inserts the documents into the database', if: write_command_enabled? do
126
+ expect(response.written_count).to eq(2)
127
+ end
128
+
129
+ it 'inserts the documents into the database', unless: write_command_enabled? do
130
+ expect(response.written_count).to eq(0)
131
+ end
132
+ end
133
+ end
134
+
135
+ context 'when the inserts are ordered' do
136
+
137
+ let(:documents) do
138
+ [{ name: 'test' }, { name: 'test' }, { name: 'test1' }]
139
+ end
140
+
141
+ let(:spec) do
142
+ { documents: documents,
143
+ db_name: db_name,
144
+ coll_name: coll_name,
145
+ write_concern: write_concern,
146
+ ordered: true
147
+ }
148
+ end
149
+
150
+ let(:failing_insert) do
151
+ described_class.new(spec)
152
+ end
153
+
154
+ context 'when write concern is acknowledged' do
155
+
156
+ let(:write_concern) do
157
+ Mongo::WriteConcern.get(w: 1)
158
+ end
159
+
160
+ context 'when the insert fails' do
161
+
162
+ it 'aborts after first error' do
163
+ failing_insert.execute(authorized_primary.context)
164
+ expect(authorized_collection.find.count).to eq(1)
165
+ end
166
+ end
167
+ end
168
+
169
+ context 'when write concern is unacknowledged' do
170
+
171
+ let(:write_concern) do
172
+ Mongo::WriteConcern.get(w: 0)
173
+ end
174
+
175
+ context 'when the insert fails' do
176
+
177
+ it 'aborts after first error' do
178
+ failing_insert.execute(authorized_primary.context)
179
+ expect(authorized_collection.find.count).to eq(1)
180
+ end
181
+ end
182
+ end
183
+ end
184
+
185
+ context 'when the inserts are unordered' do
186
+
187
+ let(:documents) do
188
+ [{ name: 'test' }, { name: 'test' }, { name: 'test1' }]
189
+ end
190
+
191
+ let(:spec) do
192
+ { documents: documents,
193
+ db_name: db_name,
194
+ coll_name: coll_name,
195
+ write_concern: write_concern,
196
+ ordered: false
197
+ }
198
+ end
199
+
200
+ let(:failing_insert) do
201
+ described_class.new(spec)
202
+ end
203
+
204
+ context 'when write concern is acknowledged' do
205
+
206
+ let(:write_concern) do
207
+ Mongo::WriteConcern.get(w: 1)
208
+ end
209
+
210
+ context 'when the insert fails' do
211
+
212
+ it 'does not abort after first error' do
213
+ failing_insert.execute(authorized_primary.context)
214
+ expect(authorized_collection.find.count).to eq(2)
215
+ end
216
+ end
217
+ end
218
+
219
+ context 'when write concern is unacknowledged' do
220
+
221
+ let(:write_concern) do
222
+ Mongo::WriteConcern.get(w: 0)
223
+ end
224
+
225
+ context 'when the insert fails' do
226
+
227
+ it 'does not after first error' do
228
+ failing_insert.execute(authorized_primary.context)
229
+ expect(authorized_collection.find.count).to eq(2)
230
+ end
231
+ end
232
+ end
233
+ end
234
+ end
235
+ end
@@ -0,0 +1,236 @@
1
+ require 'spec_helper'
2
+
3
+ describe Mongo::Operation::Write::BulkUpdate do
4
+ include_context 'operation'
5
+
6
+ let(:documents) do
7
+ [{ :q => { :foo => 1 },
8
+ :u => { :$set => { :bar => 1 } },
9
+ :multi => true,
10
+ :upsert => false }]
11
+ end
12
+
13
+ let(:spec) do
14
+ { updates: documents,
15
+ db_name: db_name,
16
+ coll_name: coll_name,
17
+ write_concern: write_concern,
18
+ ordered: true
19
+ }
20
+ end
21
+
22
+ let(:op) do
23
+ described_class.new(spec)
24
+ end
25
+
26
+ describe '#initialize' do
27
+
28
+ context 'spec' do
29
+
30
+ it 'sets the spec' do
31
+ expect(op.spec).to eq(spec)
32
+ end
33
+ end
34
+ end
35
+
36
+ describe '#==' do
37
+
38
+ context 'spec' do
39
+
40
+ context 'when two ops have the same specs' do
41
+
42
+ let(:other) { described_class.new(spec) }
43
+
44
+ it 'returns true' do
45
+ expect(op).to eq(other)
46
+ end
47
+ end
48
+
49
+ context 'when two ops have different specs' do
50
+ let(:other_docs) do
51
+ [ {:q => { :foo => 1 },
52
+ :u => { :$set => { :bar => 1 } },
53
+ :multi => true,
54
+ :upsert => true } ]
55
+ end
56
+
57
+ let(:other_spec) do
58
+ { updates: other_docs,
59
+ db_name: db_name,
60
+ coll_name: coll_name,
61
+ write_concern: write_concern,
62
+ ordered: true
63
+ }
64
+ end
65
+
66
+ let(:other) { described_class.new(other_spec) }
67
+
68
+ it 'returns false' do
69
+ expect(op).not_to eq(other)
70
+ end
71
+ end
72
+ end
73
+ end
74
+
75
+ describe '#dup' do
76
+
77
+ context 'deep copy' do
78
+
79
+ it 'copies the list of updates' do
80
+ copy = op.dup
81
+ expect(copy.spec[:updates]).not_to be(op.spec[:updates])
82
+ end
83
+ end
84
+ end
85
+
86
+ describe '#execute' do
87
+
88
+ before do
89
+ authorized_collection.insert_many([
90
+ { name: 'test', field: 'test', other: 'test' },
91
+ { name: 'testing', field: 'test', other: 'test' }
92
+ ])
93
+ end
94
+
95
+ after do
96
+ authorized_collection.find.delete_many
97
+ end
98
+
99
+ context 'when updating a single document' do
100
+
101
+ context 'when the update passes' do
102
+
103
+ let(:documents) do
104
+ [{ q: { other: 'test' }, u: { '$set' => { field: 'blah' }}, multi: false }]
105
+ end
106
+
107
+ it 'updates the document' do
108
+ op.execute(authorized_primary.context)
109
+ expect(authorized_collection.find(field: 'blah').count).to eq(1)
110
+ end
111
+ end
112
+ end
113
+
114
+ context 'when updating multiple documents' do
115
+
116
+ let(:update) do
117
+ described_class.new({
118
+ updates: documents,
119
+ db_name: db_name,
120
+ coll_name: coll_name,
121
+ write_concern: write_concern
122
+ })
123
+ end
124
+
125
+ context 'when the updates succeed' do
126
+
127
+ let(:documents) do
128
+ [{ q: { other: 'test' }, u: { '$set' => { field: 'blah' }}, multi: true }]
129
+ end
130
+
131
+ it 'updates the documents' do
132
+ op.execute(authorized_primary.context)
133
+ expect(authorized_collection.find(field: 'blah').count).to eq(2)
134
+ end
135
+ end
136
+ end
137
+
138
+ context 'when the updates are ordered' do
139
+
140
+ let(:documents) do
141
+ [ { q: { name: 'test' }, u: { '$st' => { field: 'blah' }}, multi: true},
142
+ { q: { field: 'test' }, u: { '$set' => { other: 'blah' }}, multi: true }
143
+ ]
144
+ end
145
+
146
+ let(:spec) do
147
+ { updates: documents,
148
+ db_name: db_name,
149
+ coll_name: coll_name,
150
+ write_concern: write_concern,
151
+ ordered: true
152
+ }
153
+ end
154
+
155
+ let(:failing_update) do
156
+ described_class.new(spec)
157
+ end
158
+
159
+ context 'when the update fails' do
160
+
161
+ context 'when write concern is acknowledged' do
162
+
163
+ let(:write_concern) do
164
+ Mongo::WriteConcern.get(w: 1)
165
+ end
166
+
167
+ it 'aborts after first error' do
168
+ failing_update.execute(authorized_primary.context)
169
+ expect(authorized_collection.find(other: 'blah').count).to eq(0)
170
+ end
171
+ end
172
+
173
+ context 'when write concern is unacknowledged' do
174
+
175
+ let(:write_concern) do
176
+ Mongo::WriteConcern.get(w: 0)
177
+ end
178
+
179
+ it 'aborts after first error' do
180
+ failing_update.execute(authorized_primary.context)
181
+ expect(authorized_collection.find(other: 'blah').count).to eq(0)
182
+ end
183
+ end
184
+ end
185
+ end
186
+
187
+ context 'when the updates are unordered' do
188
+
189
+ let(:documents) do
190
+ [ { q: { name: 'test' }, u: { '$st' => { field: 'blah' }}, multi: true},
191
+ { q: { field: 'test' }, u: { '$set' => { other: 'blah' }}, multi: false }
192
+ ]
193
+ end
194
+
195
+ let(:spec) do
196
+ { updates: documents,
197
+ db_name: db_name,
198
+ coll_name: coll_name,
199
+ write_concern: write_concern,
200
+ ordered: false
201
+ }
202
+ end
203
+
204
+ let(:failing_update) do
205
+ described_class.new(spec)
206
+ end
207
+
208
+ context 'when the update fails' do
209
+
210
+ context 'when write concern is acknowledged' do
211
+
212
+ let(:write_concern) do
213
+ Mongo::WriteConcern.get(w: 1)
214
+ end
215
+
216
+ it 'does not abort after first error' do
217
+ failing_update.execute(authorized_primary.context)
218
+ expect(authorized_collection.find(other: 'blah').count).to eq(1)
219
+ end
220
+ end
221
+
222
+ context 'when write concern is unacknowledged' do
223
+
224
+ let(:write_concern) do
225
+ Mongo::WriteConcern.get(w: 0)
226
+ end
227
+
228
+ it 'does not abort after first error' do
229
+ failing_update.execute(authorized_primary.context)
230
+ expect(authorized_collection.find(other: 'blah').count).to eq(1)
231
+ end
232
+ end
233
+ end
234
+ end
235
+ end
236
+ end
@@ -0,0 +1,103 @@
1
+ require 'spec_helper'
2
+
3
+ describe Mongo::Operation::Write::Command::Delete do
4
+ include_context 'operation'
5
+
6
+ let(:deletes) { [{:q => { :foo => 1 }, :limit => 1}] }
7
+ let(:spec) do
8
+ { :deletes => deletes,
9
+ :db_name => db_name,
10
+ :coll_name => coll_name,
11
+ :write_concern => write_concern,
12
+ :ordered => true
13
+ }
14
+ end
15
+
16
+ let(:op) { described_class.new(spec) }
17
+
18
+ describe '#initialize' do
19
+
20
+ context 'spec' do
21
+
22
+ it 'sets the spec' do
23
+ expect(op.spec).to eq(spec)
24
+ end
25
+ end
26
+ end
27
+
28
+ describe '#==' do
29
+
30
+ context 'spec' do
31
+
32
+ context 'when two ops have the same specs' do
33
+ let(:other) { described_class.new(spec) }
34
+
35
+ it 'returns true' do
36
+ expect(op).to eq(other)
37
+ end
38
+ end
39
+
40
+ context 'when two ops have different specs' do
41
+ let(:other_deletes) { [{:q => { :bar => 1 }, :limit => 1}] }
42
+ let(:other_spec) do
43
+ { :deletes => other_deletes,
44
+ :db_name => db_name,
45
+ :coll_name => coll_name,
46
+ :write_concern => write_concern.options,
47
+ :ordered => true
48
+ }
49
+ end
50
+ let(:other) { described_class.new(other_spec) }
51
+
52
+ it 'returns false' do
53
+ expect(op).not_to eq(other)
54
+ end
55
+ end
56
+ end
57
+ end
58
+
59
+ context '#merge' do
60
+ let(:other_op) { described_class.new(spec) }
61
+
62
+ it 'is not allowed' do
63
+ expect{ op.merge(other_op) }.to raise_exception
64
+ end
65
+ end
66
+
67
+ context '#merge!' do
68
+ let(:other_op) { described_class.new(spec) }
69
+
70
+ it 'is not allowed' do
71
+ expect{ op.merge!(other_op) }.to raise_exception
72
+ end
73
+ end
74
+
75
+ describe '#execute' do
76
+
77
+ context 'server' do
78
+
79
+ context 'message' do
80
+ let(:expected_selector) do
81
+ { :deletes => deletes,
82
+ :delete => coll_name,
83
+ :writeConcern => write_concern.options,
84
+ :ordered => true
85
+ }
86
+ end
87
+
88
+ it 'creates a query wire protocol message with correct specs' do
89
+ allow_any_instance_of(Mongo::ServerSelector::Primary).to receive(:server) do
90
+ primary_server
91
+ end
92
+
93
+ expect(Mongo::Protocol::Query).to receive(:new) do |db, coll, sel, options|
94
+ expect(db).to eq(db_name)
95
+ expect(coll).to eq(Mongo::Database::COMMAND)
96
+ expect(sel).to eq(expected_selector)
97
+ end
98
+ op.execute(primary_context)
99
+ end
100
+ end
101
+ end
102
+ end
103
+ end
@@ -0,0 +1,103 @@
1
+ require 'spec_helper'
2
+
3
+ describe Mongo::Operation::Write::Command::Insert do
4
+ include_context 'operation'
5
+
6
+ let(:documents) { [{ :foo => 1 }] }
7
+ let(:spec) do
8
+ { :documents => documents,
9
+ :db_name => db_name,
10
+ :coll_name => coll_name,
11
+ :write_concern => write_concern,
12
+ :ordered => true
13
+ }
14
+ end
15
+
16
+ let(:op) { described_class.new(spec) }
17
+
18
+ describe '#initialize' do
19
+
20
+ context 'spec' do
21
+
22
+ it 'sets the spec' do
23
+ expect(op.spec).to eq(spec)
24
+ end
25
+ end
26
+ end
27
+
28
+ describe '#==' do
29
+
30
+ context 'spec' do
31
+
32
+ context 'when two ops have the same specs' do
33
+ let(:other) { described_class.new(spec) }
34
+
35
+ it 'returns true' do
36
+ expect(op).to eq(other)
37
+ end
38
+ end
39
+
40
+ context 'when two ops have different specs' do
41
+ let(:other_documents) { [{ :bar => 1 }] }
42
+ let(:other_spec) do
43
+ { :documents => other_documents,
44
+ :db_name => db_name,
45
+ :insert => coll_name,
46
+ :write_concern => write_concern.options,
47
+ :ordered => true
48
+ }
49
+ end
50
+ let(:other) { described_class.new(other_spec) }
51
+
52
+ it 'returns false' do
53
+ expect(op).not_to eq(other)
54
+ end
55
+ end
56
+ end
57
+ end
58
+
59
+ context '#merge' do
60
+ let(:other_op) { described_class.new(spec) }
61
+
62
+ it 'is not allowed' do
63
+ expect{ op.merge(other_op) }.to raise_exception
64
+ end
65
+ end
66
+
67
+ context '#merge!' do
68
+ let(:other_op) { described_class.new(spec) }
69
+
70
+ it 'is not allowed' do
71
+ expect{ op.merge!(other_op) }.to raise_exception
72
+ end
73
+ end
74
+
75
+ describe '#execute' do
76
+
77
+ context 'server' do
78
+
79
+ context 'message' do
80
+ let(:expected_selector) do
81
+ { :documents => documents,
82
+ :insert => coll_name,
83
+ :writeConcern => write_concern.options,
84
+ :ordered => true
85
+ }
86
+ end
87
+
88
+ it 'creates a query wire protocol message with correct specs' do
89
+ allow_any_instance_of(Mongo::ServerSelector::Primary).to receive(:server) do
90
+ primary_server
91
+ end
92
+
93
+ expect(Mongo::Protocol::Query).to receive(:new) do |db, coll, sel, options|
94
+ expect(db).to eq(db_name)
95
+ expect(coll).to eq(Mongo::Database::COMMAND)
96
+ expect(sel).to eq(expected_selector)
97
+ end
98
+ op.execute(primary_context)
99
+ end
100
+ end
101
+ end
102
+ end
103
+ end