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,564 @@
1
+ require 'spec_helper'
2
+
3
+ describe Mongo::Client do
4
+
5
+ describe '#==' do
6
+
7
+ let(:client) do
8
+ described_class.new(
9
+ ['127.0.0.1:27017'],
10
+ :read => { :mode => :primary },
11
+ :database => TEST_DB
12
+ )
13
+ end
14
+
15
+ context 'when the other is a client' do
16
+
17
+ context 'when the options and cluster are equal' do
18
+
19
+ let(:other) do
20
+ described_class.new(
21
+ ['127.0.0.1:27017'],
22
+ :read => { :mode => :primary },
23
+ :database => TEST_DB
24
+ )
25
+ end
26
+
27
+ it 'returns true' do
28
+ expect(client).to eq(other)
29
+ end
30
+ end
31
+
32
+ context 'when the options and cluster are not equal' do
33
+
34
+ let(:other) do
35
+ described_class.new(
36
+ ['127.0.0.1:27017'],
37
+ :read => { :mode => :secondary },
38
+ :database => TEST_DB
39
+ )
40
+ end
41
+
42
+ it 'returns true' do
43
+ expect(client).not_to eq(other)
44
+ end
45
+ end
46
+ end
47
+
48
+ context 'when the other is not a client' do
49
+
50
+ it 'returns false' do
51
+ expect(client).not_to eq('test')
52
+ end
53
+ end
54
+ end
55
+
56
+ describe '#[]' do
57
+
58
+ let(:client) do
59
+ described_class.new(['127.0.0.1:27017'], :database => TEST_DB)
60
+ end
61
+
62
+ shared_examples_for 'a collection switching object' do
63
+
64
+ before do
65
+ client.use(:dbtest)
66
+ end
67
+
68
+ it 'returns the new collection' do
69
+ expect(collection.name).to eq('users')
70
+ end
71
+ end
72
+
73
+ context 'when provided a string' do
74
+
75
+ let(:collection) do
76
+ client['users']
77
+ end
78
+
79
+ it_behaves_like 'a collection switching object'
80
+ end
81
+
82
+ context 'when provided a symbol' do
83
+
84
+ let(:collection) do
85
+ client[:users]
86
+ end
87
+
88
+ it_behaves_like 'a collection switching object'
89
+ end
90
+ end
91
+
92
+ describe '#eql' do
93
+
94
+ let(:client) do
95
+ described_class.new(
96
+ ['127.0.0.1:27017'],
97
+ :read => { :mode => :primary },
98
+ :database => TEST_DB
99
+ )
100
+ end
101
+
102
+ context 'when the other is a client' do
103
+
104
+ context 'when the options and cluster are equal' do
105
+
106
+ let(:other) do
107
+ described_class.new(
108
+ ['127.0.0.1:27017'],
109
+ :read => { :mode => :primary },
110
+ :database => TEST_DB
111
+ )
112
+ end
113
+
114
+ it 'returns true' do
115
+ expect(client).to eql(other)
116
+ end
117
+ end
118
+
119
+ context 'when the options and cluster are not equal' do
120
+
121
+ let(:other) do
122
+ described_class.new(
123
+ ['127.0.0.1:27017'],
124
+ :read => { :mode => :secondary },
125
+ :database => TEST_DB
126
+ )
127
+ end
128
+
129
+ it 'returns true' do
130
+ expect(client).not_to eql(other)
131
+ end
132
+ end
133
+ end
134
+
135
+ context 'when the other is not a client' do
136
+
137
+ let(:client) do
138
+ described_class.new(
139
+ ['127.0.0.1:27017'],
140
+ :read => { :mode => :primary },
141
+ :database => TEST_DB
142
+ )
143
+ end
144
+
145
+ it 'returns false' do
146
+ expect(client).not_to eql('test')
147
+ end
148
+ end
149
+ end
150
+
151
+ describe '#hash' do
152
+
153
+ let(:client) do
154
+ described_class.new(
155
+ ['127.0.0.1:27017'],
156
+ :read => { :mode => :primary },
157
+ :local_threshold_ms => 10,
158
+ :server_selection_timeout_ms => 10000,
159
+ :database => TEST_DB
160
+ )
161
+ end
162
+
163
+ let(:expected) do
164
+ [client.cluster, { :read => { :mode => :primary },
165
+ :local_threshold_ms => 10,
166
+ :server_selection_timeout_ms => 10000,
167
+ :database => TEST_DB }].hash
168
+ end
169
+
170
+ it 'returns a hash of the cluster and options' do
171
+ expect(client.hash).to eq(expected)
172
+ end
173
+ end
174
+
175
+ describe '#inspect' do
176
+
177
+ let(:client) do
178
+ described_class.new(
179
+ ['127.0.0.1:27017'],
180
+ :read => { :mode => :primary },
181
+ :database => TEST_DB
182
+ )
183
+ end
184
+
185
+ it 'returns the cluster information' do
186
+ expect(client.inspect).to include(
187
+ "<Mongo::Client:0x#{client.object_id} cluster=127.0.0.1:27017"
188
+ )
189
+ end
190
+ end
191
+
192
+ describe '#initialize' do
193
+
194
+ context 'when providing options' do
195
+
196
+ context 'when no database is provided' do
197
+
198
+ let(:client) do
199
+ described_class.new(['127.0.0.1:27017'], :read => { :mode => :secondary })
200
+ end
201
+
202
+ it 'defaults the database to admin' do
203
+ expect(client.database.name).to eq('admin')
204
+ end
205
+ end
206
+
207
+ context 'when a database is provided' do
208
+
209
+ let(:client) do
210
+ described_class.new(['127.0.0.1:27017'], :database => :testdb)
211
+ end
212
+
213
+ it 'sets the current database' do
214
+ expect(client[:users].name).to eq('users')
215
+ end
216
+ end
217
+ end
218
+
219
+ context 'when providing a connection string' do
220
+
221
+ context 'when a database is provided' do
222
+
223
+ let!(:uri) do
224
+ 'mongodb://127.0.0.1:27017/testdb'
225
+ end
226
+
227
+ let(:client) do
228
+ described_class.new(uri)
229
+ end
230
+
231
+ it 'sets the database' do
232
+ expect { client[:users] }.to_not raise_error
233
+ end
234
+ end
235
+
236
+ context 'when a database is not provided' do
237
+
238
+ let!(:uri) do
239
+ 'mongodb://127.0.0.1:27017'
240
+ end
241
+
242
+ let(:client) do
243
+ described_class.new(uri)
244
+ end
245
+
246
+ it 'defaults the database to admin' do
247
+ expect(client.database.name).to eq('admin')
248
+ end
249
+ end
250
+
251
+ context 'when options are provided' do
252
+
253
+ let!(:uri) do
254
+ 'mongodb://127.0.0.1:27017/testdb?w=3'
255
+ end
256
+
257
+ let(:client) do
258
+ described_class.new(uri)
259
+ end
260
+
261
+ it 'sets the options' do
262
+ expect(client.options).to eq(:write => { :w => 3 }, :database => 'testdb')
263
+ end
264
+ end
265
+
266
+ context 'when options are provided not in the string' do
267
+
268
+ let!(:uri) do
269
+ 'mongodb://127.0.0.1:27017/testdb'
270
+ end
271
+
272
+ let(:client) do
273
+ described_class.new(uri, :write => { :w => 3 })
274
+ end
275
+
276
+ it 'sets the options' do
277
+ expect(client.options).to eq(:write => { :w => 3 }, :database => 'testdb')
278
+ end
279
+ end
280
+
281
+ context 'when options are provided in the string and explicitly' do
282
+
283
+ let!(:uri) do
284
+ 'mongodb://127.0.0.1:27017/testdb?w=3'
285
+ end
286
+
287
+ let(:client) do
288
+ described_class.new(uri, :write => { :w => 4 })
289
+ end
290
+
291
+ it 'allows explicit options to take preference' do
292
+ expect(client.options).to eq(:write => { :w => 4 }, :database => 'testdb')
293
+ end
294
+ end
295
+
296
+ context 'when a replica set name is provided' do
297
+
298
+ let!(:uri) do
299
+ 'mongodb://127.0.0.1:27017/testdb?replicaSet=testing'
300
+ end
301
+
302
+ let(:client) do
303
+ described_class.new(uri)
304
+ end
305
+
306
+ it 'sets the correct cluster topology' do
307
+ expect(client.cluster.topology).to be_a(Mongo::Cluster::Topology::ReplicaSet)
308
+ end
309
+ end
310
+ end
311
+ end
312
+
313
+ describe '#read_preference' do
314
+
315
+ let(:client) do
316
+ described_class.new(['127.0.0.1:27017'],
317
+ :database => TEST_DB,
318
+ :read => mode)
319
+ end
320
+
321
+ let(:preference) do
322
+ client.read_preference
323
+ end
324
+
325
+ context 'when mode is primary' do
326
+
327
+ let(:mode) do
328
+ { :mode => :primary }
329
+ end
330
+
331
+ it 'returns a primary read preference' do
332
+ expect(preference).to be_a(Mongo::ServerSelector::Primary)
333
+ end
334
+
335
+ it 'passes the options to the read preference' do
336
+ expect(preference.options[:database]).to eq(TEST_DB)
337
+ end
338
+ end
339
+
340
+ context 'when mode is primary_preferred' do
341
+
342
+ let(:mode) do
343
+ { :mode => :primary_preferred }
344
+ end
345
+
346
+ it 'returns a primary preferred read preference' do
347
+ expect(preference).to be_a(Mongo::ServerSelector::PrimaryPreferred)
348
+ end
349
+ end
350
+
351
+ context 'when mode is secondary' do
352
+
353
+ let(:mode) do
354
+ { :mode => :secondary }
355
+ end
356
+
357
+ it 'returns a secondary read preference' do
358
+ expect(preference).to be_a(Mongo::ServerSelector::Secondary)
359
+ end
360
+ end
361
+
362
+ context 'when mode is secondary preferred' do
363
+
364
+ let(:mode) do
365
+ { :mode => :secondary_preferred }
366
+ end
367
+
368
+ it 'returns a secondary preferred read preference' do
369
+ expect(preference).to be_a(Mongo::ServerSelector::SecondaryPreferred)
370
+ end
371
+ end
372
+
373
+ context 'when mode is nearest' do
374
+
375
+ let(:mode) do
376
+ { :mode => :nearest }
377
+ end
378
+
379
+ it 'returns a nearest read preference' do
380
+ expect(preference).to be_a(Mongo::ServerSelector::Nearest)
381
+ end
382
+ end
383
+
384
+ context 'when no mode provided' do
385
+
386
+ let(:mode) do
387
+ {}
388
+ end
389
+
390
+ it 'returns a primary read preference' do
391
+ expect(preference).to be_a(Mongo::ServerSelector::Primary)
392
+ end
393
+ end
394
+ end
395
+
396
+ describe '#use' do
397
+
398
+ let(:client) do
399
+ described_class.new(['127.0.0.1:27017'], :database => TEST_DB)
400
+ end
401
+
402
+ shared_examples_for 'a database switching object' do
403
+
404
+ it 'returns the new client' do
405
+ expect(client.send(:database).name).to eq('ruby-driver')
406
+ end
407
+ end
408
+
409
+ context 'when provided a string' do
410
+
411
+ let(:database) do
412
+ client.use('testdb')
413
+ end
414
+
415
+ it_behaves_like 'a database switching object'
416
+ end
417
+
418
+ context 'when provided a symbol' do
419
+
420
+ let(:database) do
421
+ client.use(:testdb)
422
+ end
423
+
424
+ it_behaves_like 'a database switching object'
425
+ end
426
+
427
+ context 'when providing nil' do
428
+
429
+ it 'raises an exception' do
430
+ expect {
431
+ client.use(nil)
432
+ }.to raise_error(Mongo::Error::InvalidDatabaseName)
433
+ end
434
+ end
435
+ end
436
+
437
+ describe '#with' do
438
+
439
+ context 'when the write concern is not changed' do
440
+
441
+ let(:client) do
442
+ described_class.new(
443
+ ['127.0.0.1:27017'],
444
+ :read => { :mode => :secondary }, :write => { :w => 1 }, :database => TEST_DB
445
+ )
446
+ end
447
+
448
+ let!(:new_client) do
449
+ client.with(:read => { :mode => :primary })
450
+ end
451
+
452
+ it 'returns a new client' do
453
+ expect(new_client).not_to equal(client)
454
+ end
455
+
456
+ it 'replaces the existing options' do
457
+ expect(new_client.options).to eq({
458
+ :read => { :mode => :primary }, :write => { :w => 1 }, :database => TEST_DB
459
+ })
460
+ end
461
+
462
+ it 'does not modify the original client' do
463
+ expect(client.options).to eq({
464
+ :read => { :mode => :secondary }, :write => { :w => 1 }, :database => TEST_DB
465
+ })
466
+ end
467
+
468
+ it 'keeps the same cluster' do
469
+ expect(new_client.cluster).to equal(client.cluster)
470
+ end
471
+ end
472
+
473
+ context 'when the write concern is changed' do
474
+
475
+ let(:client) do
476
+ described_class.new(['127.0.0.1:27017'], :write => { :w => 1 }, :database => TEST_DB)
477
+ end
478
+
479
+ context 'when the write concern has not been accessed' do
480
+
481
+ let!(:new_client) do
482
+ client.with(:write => { :w => 0 })
483
+ end
484
+
485
+ let(:get_last_error) do
486
+ new_client.write_concern.get_last_error
487
+ end
488
+
489
+ it 'returns the correct write concern' do
490
+ expect(get_last_error).to be_nil
491
+ end
492
+ end
493
+
494
+ context 'when the write concern has been accessed' do
495
+
496
+ let!(:new_client) do
497
+ client.write_concern
498
+ client.with(:write => { :w => 0 })
499
+ end
500
+
501
+ let(:get_last_error) do
502
+ new_client.write_concern.get_last_error
503
+ end
504
+
505
+ it 'returns the correct write concern' do
506
+ expect(get_last_error).to be_nil
507
+ end
508
+ end
509
+ end
510
+ end
511
+
512
+ describe '#write_concern' do
513
+
514
+ let(:concern) { client.write_concern }
515
+
516
+ context 'when no option was provided to the client' do
517
+
518
+ let(:client) { described_class.new(['127.0.0.1:27017'], :database => TEST_DB) }
519
+
520
+ it 'returns a acknowledged write concern' do
521
+ expect(concern.get_last_error).to eq(:getlasterror => 1, :w => 1)
522
+ end
523
+ end
524
+
525
+ context 'when an option is provided' do
526
+
527
+ context 'when the option is acknowledged' do
528
+
529
+ let(:client) do
530
+ described_class.new(['127.0.0.1:27017'], :write => { :j => true }, :database => TEST_DB)
531
+ end
532
+
533
+ it 'returns a acknowledged write concern' do
534
+ expect(concern.get_last_error).to eq(:getlasterror => 1, :j => true)
535
+ end
536
+ end
537
+
538
+ context 'when the option is unacknowledged' do
539
+
540
+ context 'when the w is 0' do
541
+
542
+ let(:client) do
543
+ described_class.new(['127.0.0.1:27017'], :write => { :w => 0 }, :database => TEST_DB)
544
+ end
545
+
546
+ it 'returns an unacknowledged write concern' do
547
+ expect(concern.get_last_error).to be_nil
548
+ end
549
+ end
550
+
551
+ context 'when the w is -1' do
552
+
553
+ let(:client) do
554
+ described_class.new(['127.0.0.1:27017'], :write => { :w => -1 }, :database => TEST_DB)
555
+ end
556
+
557
+ it 'returns an unacknowledged write concern' do
558
+ expect(concern.get_last_error).to be_nil
559
+ end
560
+ end
561
+ end
562
+ end
563
+ end
564
+ end
@@ -0,0 +1,101 @@
1
+ require 'spec_helper'
2
+
3
+ describe Mongo::Cluster::Topology::ReplicaSet do
4
+
5
+ let(:address) do
6
+ Mongo::Address.new('127.0.0.1:27017')
7
+ end
8
+
9
+ describe '#servers' do
10
+
11
+ let(:mongos) do
12
+ Mongo::Server.new(address, Mongo::Event::Listeners.new)
13
+ end
14
+
15
+ let(:standalone) do
16
+ Mongo::Server.new(address, Mongo::Event::Listeners.new)
17
+ end
18
+
19
+ let(:replica_set) do
20
+ Mongo::Server.new(address, Mongo::Event::Listeners.new)
21
+ end
22
+
23
+ let(:replica_set_two) do
24
+ Mongo::Server.new(address, Mongo::Event::Listeners.new)
25
+ end
26
+
27
+ let(:mongos_description) do
28
+ Mongo::Server::Description.new(address, { 'msg' => 'isdbgrid' })
29
+ end
30
+
31
+ let(:standalone_description) do
32
+ Mongo::Server::Description.new(address, { 'ismaster' => true })
33
+ end
34
+
35
+ let(:replica_set_description) do
36
+ Mongo::Server::Description.new(address, { 'ismaster' => true, 'setName' => 'testing' })
37
+ end
38
+
39
+ let(:replica_set_two_description) do
40
+ Mongo::Server::Description.new(address, { 'ismaster' => true, 'setName' => 'test' })
41
+ end
42
+
43
+ before do
44
+ mongos.monitor.instance_variable_set(:@description, mongos_description)
45
+ standalone.monitor.instance_variable_set(:@description, standalone_description)
46
+ replica_set.monitor.instance_variable_set(:@description, replica_set_description)
47
+ replica_set_two.monitor.instance_variable_set(:@description, replica_set_two_description)
48
+ end
49
+
50
+ context 'when no replica set name is provided' do
51
+
52
+ let(:topology) do
53
+ described_class.new({})
54
+ end
55
+
56
+ let(:servers) do
57
+ topology.servers([ mongos, standalone, replica_set, replica_set_two ])
58
+ end
59
+
60
+ it 'returns only replica set members' do
61
+ expect(servers).to eq([ replica_set, replica_set_two ])
62
+ end
63
+ end
64
+
65
+ context 'when a replica set name is provided' do
66
+
67
+ let(:topology) do
68
+ described_class.new(:replica_set => 'testing')
69
+ end
70
+
71
+ let(:servers) do
72
+ topology.servers([ mongos, standalone, replica_set, replica_set_two ])
73
+ end
74
+
75
+ it 'returns only replica set members is the provided set' do
76
+ expect(servers).to eq([ replica_set ])
77
+ end
78
+ end
79
+ end
80
+
81
+ describe '.replica_set?' do
82
+
83
+ it 'returns true' do
84
+ expect(described_class.new({})).to be_replica_set
85
+ end
86
+ end
87
+
88
+ describe '.sharded?' do
89
+
90
+ it 'returns false' do
91
+ expect(described_class.new({})).to_not be_sharded
92
+ end
93
+ end
94
+
95
+ describe '.standalone?' do
96
+
97
+ it 'returns false' do
98
+ expect(described_class.new({})).to_not be_standalone
99
+ end
100
+ end
101
+ end