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,206 @@
1
+ require 'spec_helper'
2
+
3
+ describe Mongo::Address do
4
+
5
+ describe '#==' do
6
+
7
+ context 'when the other host and port are the same' do
8
+
9
+ let(:address) do
10
+ described_class.new('127.0.0.1:27017')
11
+ end
12
+
13
+ let(:other) do
14
+ described_class.new('127.0.0.1:27017')
15
+ end
16
+
17
+ it 'returns true' do
18
+ expect(address).to eq(other)
19
+ end
20
+ end
21
+
22
+ context 'when the other port is different' do
23
+
24
+ let(:address) do
25
+ described_class.new('127.0.0.1:27017')
26
+ end
27
+
28
+ let(:other) do
29
+ described_class.new('127.0.0.1:27018')
30
+ end
31
+
32
+ it 'returns false' do
33
+ expect(address).to_not eq(other)
34
+ end
35
+ end
36
+
37
+ context 'when the other host is different' do
38
+
39
+ let(:address) do
40
+ described_class.new('127.0.0.1:27017')
41
+ end
42
+
43
+ let(:other) do
44
+ described_class.new('127.0.0.2:27017')
45
+ end
46
+
47
+ it 'returns false' do
48
+ expect(address).to_not eq(other)
49
+ end
50
+ end
51
+
52
+ context 'when the other object is not an address' do
53
+
54
+ let(:address) do
55
+ described_class.new('127.0.0.1:27017')
56
+ end
57
+
58
+ it 'returns false' do
59
+ expect(address).to_not eq('test')
60
+ end
61
+ end
62
+
63
+ context 'when the addresses are identical unix sockets' do
64
+
65
+ let(:address) do
66
+ described_class.new('/path/to/socket.sock')
67
+ end
68
+
69
+ let(:other) do
70
+ described_class.new('/path/to/socket.sock')
71
+ end
72
+
73
+ it 'returns true' do
74
+ expect(address).to eq(other)
75
+ end
76
+ end
77
+ end
78
+
79
+ describe '#hash' do
80
+
81
+ let(:address) do
82
+ described_class.new('127.0.0.1:27017')
83
+ end
84
+
85
+ it 'hashes on the host and port' do
86
+ expect(address.hash).to eq([ '127.0.0.1', 27017 ].hash)
87
+ end
88
+ end
89
+
90
+ describe '#initialize' do
91
+
92
+ context 'when providing an ipv4 host' do
93
+
94
+ context 'when a port is provided' do
95
+
96
+ let(:address) do
97
+ described_class.new('127.0.0.1:27017')
98
+ end
99
+
100
+ it 'sets the port' do
101
+ expect(address.port).to eq(27017)
102
+ end
103
+
104
+ it 'sets the host' do
105
+ expect(address.host).to eq('127.0.0.1')
106
+ end
107
+ end
108
+
109
+ context 'when no port is provided' do
110
+
111
+ let(:address) do
112
+ described_class.new('127.0.0.1')
113
+ end
114
+
115
+ it 'sets the port to 27017' do
116
+ expect(address.port).to eq(27017)
117
+ end
118
+
119
+ it 'sets the host' do
120
+ expect(address.host).to eq('127.0.0.1')
121
+ end
122
+ end
123
+ end
124
+
125
+ context 'when providing an ipv6 host' do
126
+
127
+ context 'when a port is provided' do
128
+
129
+ let(:address) do
130
+ described_class.new('[::1]:27017')
131
+ end
132
+
133
+ it 'sets the port' do
134
+ expect(address.port).to eq(27017)
135
+ end
136
+
137
+ it 'sets the host' do
138
+ expect(address.host).to eq('::1')
139
+ end
140
+ end
141
+
142
+ context 'when no port is provided' do
143
+
144
+ let(:address) do
145
+ described_class.new('[::1]')
146
+ end
147
+
148
+ it 'sets the port to 27017' do
149
+ expect(address.port).to eq(27017)
150
+ end
151
+
152
+ it 'sets the host' do
153
+ expect(address.host).to eq('::1')
154
+ end
155
+ end
156
+ end
157
+
158
+ context 'when providing a DNS entry' do
159
+
160
+ context 'when a port is provided' do
161
+
162
+ let(:address) do
163
+ described_class.new('localhost:27017')
164
+ end
165
+
166
+ it 'sets the port' do
167
+ expect(address.port).to eq(27017)
168
+ end
169
+
170
+ it 'sets the host' do
171
+ expect(address.host).to eq('localhost')
172
+ end
173
+ end
174
+
175
+ context 'when a port is not provided' do
176
+
177
+ let(:address) do
178
+ described_class.new('localhost')
179
+ end
180
+
181
+ it 'sets the port to 27017' do
182
+ expect(address.port).to eq(27017)
183
+ end
184
+
185
+ it 'sets the host' do
186
+ expect(address.host).to eq('localhost')
187
+ end
188
+ end
189
+ end
190
+
191
+ context 'when providing a socket path' do
192
+
193
+ let(:address) do
194
+ described_class.new('/path/to/socket.sock')
195
+ end
196
+
197
+ it 'sets the port to nil' do
198
+ expect(address.port).to be_nil
199
+ end
200
+
201
+ it 'sets the host' do
202
+ expect(address.host).to eq('/path/to/socket.sock')
203
+ end
204
+ end
205
+ end
206
+ end
@@ -0,0 +1,59 @@
1
+ require 'spec_helper'
2
+
3
+ describe Mongo::Auth::CR 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
+ describe '#login' do
18
+
19
+ context 'when the user is not authorized' do
20
+
21
+ let(:user) do
22
+ Mongo::Auth::User.new(
23
+ database: 'driver',
24
+ user: 'notauser',
25
+ password: 'password'
26
+ )
27
+ end
28
+
29
+ let(:cr) do
30
+ described_class.new(user)
31
+ end
32
+
33
+ let(:login) do
34
+ cr.login(connection).documents[0]
35
+ end
36
+
37
+ it 'raises an exception' do
38
+ expect {
39
+ cr.login(connection)
40
+ }.to raise_error(Mongo::Auth::Unauthorized)
41
+ end
42
+ end
43
+ end
44
+
45
+ context 'when the user is authorized for the database' do
46
+
47
+ let(:cr) do
48
+ described_class.new(root_user)
49
+ end
50
+
51
+ let(:login) do
52
+ cr.login(connection).documents[0]
53
+ end
54
+
55
+ it 'logs the user into the connection', unless: scram_sha_1_enabled? do
56
+ expect(cr.login(connection).documents[0]['ok']).to eq(1)
57
+ end
58
+ end
59
+ end
@@ -0,0 +1,40 @@
1
+ require 'spec_helper'
2
+
3
+ describe Mongo::Auth::LDAP 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,197 @@
1
+ require 'spec_helper'
2
+
3
+ describe Mongo::Auth::SCRAM::Conversation do
4
+
5
+ let(:user) do
6
+ Mongo::Auth::User.new(
7
+ database: Mongo::Database::ADMIN,
8
+ user: 'user',
9
+ password: 'pencil'
10
+ )
11
+ end
12
+
13
+ let(:conversation) do
14
+ described_class.new(user)
15
+ end
16
+
17
+ describe '#start' do
18
+
19
+ let(:query) do
20
+ conversation.start
21
+ end
22
+
23
+ before do
24
+ expect(SecureRandom).to receive(:base64).once.and_return('NDA2NzU3MDY3MDYwMTgy')
25
+ end
26
+
27
+ let(:selector) do
28
+ query.selector
29
+ end
30
+
31
+ it 'sets the sasl start flag' do
32
+ expect(selector[:saslStart]).to eq(1)
33
+ end
34
+
35
+ it 'sets the auto authorize flag' do
36
+ expect(selector[:autoAuthorize]).to eq(1)
37
+ end
38
+
39
+ it 'sets the mechanism' do
40
+ expect(selector[:mechanism]).to eq('SCRAM-SHA-1')
41
+ end
42
+
43
+ it 'sets the payload' do
44
+ expect(selector[:payload].data).to eq('n,,n=user,r=NDA2NzU3MDY3MDYwMTgy')
45
+ end
46
+ end
47
+
48
+ describe '#continue' do
49
+
50
+ let(:reply) do
51
+ Mongo::Protocol::Reply.new
52
+ end
53
+
54
+ let(:documents) do
55
+ [{
56
+ 'conversationId' => 1,
57
+ 'done' => false,
58
+ 'payload' => payload,
59
+ 'ok' => 1.0
60
+ }]
61
+ end
62
+
63
+ before do
64
+ expect(SecureRandom).to receive(:base64).once.and_return('NDA2NzU3MDY3MDYwMTgy')
65
+ reply.instance_variable_set(:@documents, documents)
66
+ end
67
+
68
+ context 'when the server rnonce starts with the nonce' do
69
+
70
+ let(:payload) do
71
+ BSON::Binary.new(
72
+ 'r=NDA2NzU3MDY3MDYwMTgyt7/+IWaw1HaZZ5NmPJUTWapLpH2Gg+d8,s=AVvQXzAbxweH2RYDICaplw==,i=10000'
73
+ )
74
+ end
75
+
76
+ let(:query) do
77
+ conversation.continue(reply)
78
+ end
79
+
80
+ let(:selector) do
81
+ query.selector
82
+ end
83
+
84
+ it 'sets the conversation id' do
85
+ expect(selector[:conversationId]).to eq(1)
86
+ end
87
+
88
+ it 'sets the payload' do
89
+ expect(selector[:payload].data).to eq(
90
+ 'c=biws,r=NDA2NzU3MDY3MDYwMTgyt7/+IWaw1HaZZ5NmPJUTWapLpH2Gg+d8,p=qYUYNy6SQ9Jucq9rFA9nVgXQdbM='
91
+ )
92
+ end
93
+
94
+ it 'sets the continue flag' do
95
+ expect(selector[:saslContinue]).to eq(1)
96
+ end
97
+ end
98
+
99
+ context 'when the server nonce does not start with the nonce' do
100
+
101
+ let(:payload) do
102
+ BSON::Binary.new(
103
+ 'r=NDA2NzU4MDY3MDYwMTgyt7/+IWaw1HaZZ5NmPJUTWapLpH2Gg+d8,s=AVvQXzAbxweH2RYDICaplw==,i=10000'
104
+ )
105
+ end
106
+
107
+ it 'raises an error' do
108
+ expect {
109
+ conversation.continue(reply)
110
+ }.to raise_error(Mongo::Error::InvalidNonce)
111
+ end
112
+ end
113
+ end
114
+
115
+ describe '#finalize' do
116
+
117
+ let(:continue_reply) do
118
+ Mongo::Protocol::Reply.new
119
+ end
120
+
121
+ let(:continue_documents) do
122
+ [{
123
+ 'conversationId' => 1,
124
+ 'done' => false,
125
+ 'payload' => continue_payload,
126
+ 'ok' => 1.0
127
+ }]
128
+ end
129
+
130
+ let(:continue_payload) do
131
+ BSON::Binary.new(
132
+ 'r=NDA2NzU3MDY3MDYwMTgyt7/+IWaw1HaZZ5NmPJUTWapLpH2Gg+d8,s=AVvQXzAbxweH2RYDICaplw==,i=10000'
133
+ )
134
+ end
135
+
136
+ let(:reply) do
137
+ Mongo::Protocol::Reply.new
138
+ end
139
+
140
+ let(:documents) do
141
+ [{
142
+ 'conversationId' => 1,
143
+ 'done' => false,
144
+ 'payload' => payload,
145
+ 'ok' => 1.0
146
+ }]
147
+ end
148
+
149
+ before do
150
+ expect(SecureRandom).to receive(:base64).once.and_return('NDA2NzU3MDY3MDYwMTgy')
151
+ continue_reply.instance_variable_set(:@documents, continue_documents)
152
+ reply.instance_variable_set(:@documents, documents)
153
+ end
154
+
155
+ context 'when the verifier matches the server signature' do
156
+
157
+ let(:payload) do
158
+ BSON::Binary.new('v=gwo9E8+uifshm7ixj441GvIfuUY=')
159
+ end
160
+
161
+ let(:query) do
162
+ conversation.continue(continue_reply)
163
+ conversation.finalize(reply)
164
+ end
165
+
166
+ let(:selector) do
167
+ query.selector
168
+ end
169
+
170
+ it 'sets the conversation id' do
171
+ expect(selector[:conversationId]).to eq(1)
172
+ end
173
+
174
+ it 'sets the empty payload' do
175
+ expect(selector[:payload].data).to eq('')
176
+ end
177
+
178
+ it 'sets the continue flag' do
179
+ expect(selector[:saslContinue]).to eq(1)
180
+ end
181
+ end
182
+
183
+ context 'when the verifier does not match the server signature' do
184
+
185
+ let(:payload) do
186
+ BSON::Binary.new('v=LQ+8yhQeVL2a3Dh+TDJ7xHz4Srk=')
187
+ end
188
+
189
+ it 'raises an error' do
190
+ expect {
191
+ conversation.continue(continue_reply)
192
+ conversation.finalize(reply)
193
+ }.to raise_error(Mongo::Error::InvalidSignature)
194
+ end
195
+ end
196
+ end
197
+ end
@@ -0,0 +1,55 @@
1
+ require 'spec_helper'
2
+
3
+ describe Mongo::Auth::SCRAM 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
+ describe '#login' do
18
+
19
+ context 'when the user is not authorized' do
20
+
21
+ let(:user) do
22
+ Mongo::Auth::User.new(
23
+ database: 'driver',
24
+ user: 'notauser',
25
+ password: 'password'
26
+ )
27
+ end
28
+
29
+ let(:cr) do
30
+ described_class.new(user)
31
+ end
32
+
33
+ it 'raises an exception', if: list_command_enabled? do
34
+ expect {
35
+ cr.login(connection)
36
+ }.to raise_error(Mongo::Auth::Unauthorized)
37
+ end
38
+ end
39
+ end
40
+
41
+ context 'when the user is authorized for the database' do
42
+
43
+ let(:cr) do
44
+ described_class.new(root_user)
45
+ end
46
+
47
+ let(:login) do
48
+ cr.login(connection).documents[0]
49
+ end
50
+
51
+ it 'logs the user into the connection', if: list_command_enabled? do
52
+ expect(login['ok']).to eq(1)
53
+ end
54
+ end
55
+ end
@@ -0,0 +1,76 @@
1
+ require 'spec_helper'
2
+
3
+ describe Mongo::Auth::User::View do
4
+
5
+ let(:view) do
6
+ described_class.new(root_authorized_client.database)
7
+ end
8
+
9
+ describe '#create' do
10
+
11
+ let!(:response) do
12
+ view.create(
13
+ 'durran',
14
+ password: 'password', roles: [ Mongo::Auth::Roles::READ_WRITE ]
15
+ )
16
+ end
17
+
18
+ after do
19
+ view.remove('durran')
20
+ end
21
+
22
+ context 'when user creation was successful' do
23
+
24
+ it 'saves the user in the database' do
25
+ expect(response).to be_successful
26
+ end
27
+ end
28
+
29
+ context 'when creation was not successful' do
30
+
31
+ it 'raises an exception' do
32
+ expect {
33
+ view.create('durran', password: 'password')
34
+ }.to raise_error(Mongo::Error::OperationFailure)
35
+ end
36
+ end
37
+ end
38
+
39
+ describe '#remove' do
40
+
41
+ context 'when user removal was successful' do
42
+
43
+ before do
44
+ view.create(
45
+ 'durran',
46
+ password: 'password', roles: [ Mongo::Auth::Roles::READ_WRITE ]
47
+ )
48
+ end
49
+
50
+ let(:response) do
51
+ view.remove('durran')
52
+ end
53
+
54
+ it 'saves the user in the database' do
55
+ expect(response).to be_successful
56
+ end
57
+ end
58
+
59
+ context 'when removal was not successful' do
60
+
61
+ it 'raises an exception', if: write_command_enabled? do
62
+ expect {
63
+ view.remove('notauser')
64
+ }.to raise_error(Mongo::Error::OperationFailure)
65
+ end
66
+
67
+ it 'does not raise an exception', unless: write_command_enabled? do
68
+ expect(view.remove('notauser').written_count).to eq(0)
69
+ end
70
+ end
71
+ end
72
+
73
+ describe '#update' do
74
+
75
+ end
76
+ end