mongo 2.0.6 → 2.1.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 (317) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +5 -2
  3. data/lib/mongo/address/ipv4.rb +6 -1
  4. data/lib/mongo/address/unix.rb +2 -2
  5. data/lib/mongo/address.rb +18 -10
  6. data/lib/mongo/auth/cr/conversation.rb +1 -1
  7. data/lib/mongo/auth/ldap/conversation.rb +7 -3
  8. data/lib/mongo/auth/scram/conversation.rb +9 -3
  9. data/lib/mongo/auth/user/view.rb +23 -2
  10. data/lib/mongo/auth/x509/conversation.rb +1 -1
  11. data/lib/mongo/bulk_write/combineable.rb +51 -0
  12. data/lib/mongo/bulk_write/ordered_combiner.rb +55 -0
  13. data/lib/mongo/bulk_write/result.rb +191 -0
  14. data/lib/mongo/bulk_write/result_combiner.rb +117 -0
  15. data/lib/mongo/bulk_write/transformable.rb +132 -0
  16. data/lib/mongo/bulk_write/unordered_combiner.rb +52 -0
  17. data/lib/mongo/bulk_write/validatable.rb +62 -0
  18. data/lib/mongo/bulk_write.rb +159 -23
  19. data/lib/mongo/client.rb +52 -16
  20. data/lib/mongo/cluster/topology/replica_set.rb +27 -9
  21. data/lib/mongo/cluster/topology/sharded.rb +1 -1
  22. data/lib/mongo/cluster/topology/unknown.rb +5 -2
  23. data/lib/mongo/cluster.rb +42 -7
  24. data/lib/mongo/collection/view/aggregation.rb +48 -9
  25. data/lib/mongo/collection/view/immutable.rb +6 -6
  26. data/lib/mongo/collection/view/iterable.rb +18 -4
  27. data/lib/mongo/collection/view/map_reduce.rb +58 -17
  28. data/lib/mongo/collection/view/readable.rb +173 -42
  29. data/lib/mongo/collection/view/writable.rb +37 -23
  30. data/lib/mongo/collection/view.rb +2 -2
  31. data/lib/mongo/collection.rb +370 -33
  32. data/lib/mongo/cursor.rb +15 -3
  33. data/lib/mongo/database/view.rb +5 -4
  34. data/lib/mongo/database.rb +14 -4
  35. data/lib/mongo/dbref.rb +113 -0
  36. data/lib/mongo/error/closed_stream.rb +34 -0
  37. data/lib/mongo/error/extra_file_chunk.rb +34 -0
  38. data/lib/mongo/error/{invalid_uri_option.rb → file_not_found.rb} +11 -12
  39. data/lib/mongo/error/invalid_file.rb +2 -2
  40. data/lib/mongo/error/invalid_file_revision.rb +37 -0
  41. data/lib/mongo/error/invalid_uri.rb +5 -4
  42. data/lib/mongo/error/missing_file_chunk.rb +38 -0
  43. data/lib/mongo/error/operation_failure.rb +1 -1
  44. data/lib/mongo/error/parser.rb +1 -1
  45. data/lib/mongo/error/unchangeable_collection_option.rb +38 -0
  46. data/lib/mongo/error/unexpected_chunk_length.rb +39 -0
  47. data/lib/mongo/error.rb +13 -2
  48. data/lib/mongo/event/description_changed.rb +1 -1
  49. data/lib/mongo/grid/file/chunk.rb +6 -6
  50. data/lib/mongo/grid/file/{metadata.rb → info.rb} +41 -39
  51. data/lib/mongo/grid/file.rb +13 -10
  52. data/lib/mongo/grid/fs_bucket.rb +448 -0
  53. data/lib/mongo/grid/stream/read.rb +208 -0
  54. data/lib/mongo/grid/stream/write.rb +187 -0
  55. data/lib/mongo/grid/stream.rb +64 -0
  56. data/lib/mongo/grid.rb +2 -1
  57. data/lib/mongo/index/view.rb +3 -3
  58. data/lib/mongo/index.rb +5 -0
  59. data/lib/mongo/loggable.rb +34 -57
  60. data/lib/mongo/logger.rb +16 -78
  61. data/lib/mongo/monitoring/command_log_subscriber.rb +112 -0
  62. data/lib/mongo/monitoring/event/command_failed.rb +96 -0
  63. data/lib/mongo/monitoring/event/command_started.rb +89 -0
  64. data/lib/mongo/monitoring/event/command_succeeded.rb +118 -0
  65. data/lib/mongo/monitoring/event/secure.rb +58 -0
  66. data/lib/mongo/monitoring/event.rb +18 -0
  67. data/lib/mongo/monitoring/publishable.rb +106 -0
  68. data/lib/mongo/monitoring.rb +195 -0
  69. data/lib/mongo/operation/{aggregate.rb → commands/aggregate.rb} +3 -41
  70. data/lib/mongo/operation/commands/collections_info/result.rb +39 -0
  71. data/lib/mongo/operation/commands/collections_info.rb +68 -0
  72. data/lib/mongo/operation/{command.rb → commands/command.rb} +2 -18
  73. data/lib/mongo/operation/commands/indexes.rb +70 -0
  74. data/lib/mongo/operation/commands/list_collections/result.rb +112 -0
  75. data/lib/mongo/operation/commands/list_collections.rb +54 -0
  76. data/lib/mongo/operation/commands/list_indexes/result.rb +116 -0
  77. data/lib/mongo/operation/commands/list_indexes.rb +56 -0
  78. data/lib/mongo/operation/{map_reduce → commands/map_reduce}/result.rb +1 -1
  79. data/lib/mongo/operation/{map_reduce.rb → commands/map_reduce.rb} +3 -41
  80. data/lib/mongo/operation/commands/parallel_scan/result.rb +72 -0
  81. data/lib/mongo/operation/commands/parallel_scan.rb +56 -0
  82. data/lib/mongo/operation/commands/user_query.rb +69 -0
  83. data/lib/mongo/{bulk_write/ordered_bulk_write.rb → operation/commands/users_info/result.rb} +18 -30
  84. data/lib/mongo/operation/commands/users_info.rb +53 -0
  85. data/lib/mongo/operation/commands.rb +24 -0
  86. data/lib/mongo/operation/executable.rb +4 -68
  87. data/lib/mongo/operation/kill_cursors.rb +3 -3
  88. data/lib/mongo/operation/read/get_more.rb +2 -22
  89. data/lib/mongo/{bulk_write/unordered_bulk_write.rb → operation/read/query/result.rb} +20 -26
  90. data/lib/mongo/operation/read/query.rb +4 -21
  91. data/lib/mongo/operation/read.rb +0 -4
  92. data/lib/mongo/operation/{read_preferrable.rb → read_preference.rb} +3 -2
  93. data/lib/mongo/operation/result.rb +13 -1
  94. data/lib/mongo/operation/specifiable.rb +42 -0
  95. data/lib/mongo/operation/write/bulk/bulkable.rb +82 -0
  96. data/lib/mongo/operation/write/bulk/delete/result.rb +74 -0
  97. data/lib/mongo/operation/write/bulk/delete.rb +71 -0
  98. data/lib/mongo/operation/write/bulk/insert/result.rb +129 -0
  99. data/lib/mongo/operation/write/bulk/insert.rb +96 -0
  100. data/lib/mongo/operation/write/bulk/legacy_mergable.rb +87 -0
  101. data/lib/mongo/operation/write/bulk/mergable.rb +71 -0
  102. data/lib/mongo/operation/write/bulk/update/result.rb +174 -0
  103. data/lib/mongo/operation/write/bulk/update.rb +81 -0
  104. data/lib/mongo/operation/write/bulk.rb +6 -3
  105. data/lib/mongo/operation/write/command/create_index.rb +0 -1
  106. data/lib/mongo/operation/write/command/create_user.rb +0 -1
  107. data/lib/mongo/operation/write/command/delete.rb +0 -1
  108. data/lib/mongo/operation/write/command/drop_index.rb +0 -1
  109. data/lib/mongo/operation/write/command/insert.rb +0 -1
  110. data/lib/mongo/operation/write/command/remove_user.rb +0 -1
  111. data/lib/mongo/operation/write/command/update.rb +0 -1
  112. data/lib/mongo/operation/write/command/update_user.rb +0 -1
  113. data/lib/mongo/operation/write/command/writable.rb +13 -18
  114. data/lib/mongo/operation/write/create_index.rb +4 -27
  115. data/lib/mongo/operation/write/create_user.rb +4 -30
  116. data/lib/mongo/operation/write/delete.rb +6 -29
  117. data/lib/mongo/operation/write/drop_index.rb +3 -3
  118. data/lib/mongo/operation/write/gle.rb +48 -0
  119. data/lib/mongo/operation/write/idable.rb +5 -0
  120. data/lib/mongo/operation/write/insert.rb +2 -24
  121. data/lib/mongo/operation/write/remove_user.rb +4 -27
  122. data/lib/mongo/operation/write/update.rb +13 -36
  123. data/lib/mongo/operation/write/update_user.rb +4 -30
  124. data/lib/mongo/operation/write/write_command_enabled.rb +53 -0
  125. data/lib/mongo/operation/write.rb +2 -0
  126. data/lib/mongo/operation.rb +32 -4
  127. data/lib/mongo/options/mapper.rb +4 -2
  128. data/lib/mongo/options/redacted.rb +156 -0
  129. data/lib/mongo/options.rb +1 -0
  130. data/lib/mongo/protocol/delete.rb +75 -15
  131. data/lib/mongo/protocol/get_more.rb +65 -13
  132. data/lib/mongo/protocol/insert.rb +85 -13
  133. data/lib/mongo/protocol/kill_cursors.rb +59 -14
  134. data/lib/mongo/protocol/message.rb +12 -12
  135. data/lib/mongo/protocol/query.rb +163 -37
  136. data/lib/mongo/protocol/reply.rb +103 -0
  137. data/lib/mongo/protocol/serializers.rb +1 -1
  138. data/lib/mongo/protocol/update.rb +82 -14
  139. data/lib/mongo/retryable.rb +83 -0
  140. data/lib/mongo/server/connectable.rb +21 -25
  141. data/lib/mongo/server/connection.rb +75 -4
  142. data/lib/mongo/server/connection_pool/queue.rb +15 -0
  143. data/lib/mongo/server/connection_pool.rb +12 -0
  144. data/lib/mongo/server/description/features.rb +2 -1
  145. data/lib/mongo/server/description.rb +52 -1
  146. data/lib/mongo/server/monitor/connection.rb +26 -2
  147. data/lib/mongo/server/monitor.rb +19 -3
  148. data/lib/mongo/server.rb +39 -5
  149. data/lib/mongo/server_selector/selectable.rb +40 -31
  150. data/lib/mongo/server_selector.rb +19 -10
  151. data/lib/mongo/socket/ssl.rb +28 -16
  152. data/lib/mongo/socket/tcp.rb +3 -3
  153. data/lib/mongo/socket/unix.rb +5 -8
  154. data/lib/mongo/socket.rb +11 -4
  155. data/lib/mongo/uri.rb +248 -137
  156. data/lib/mongo/version.rb +1 -1
  157. data/lib/mongo.rb +5 -3
  158. data/spec/mongo/address/unix_spec.rb +1 -1
  159. data/spec/mongo/address_spec.rb +25 -0
  160. data/spec/mongo/auth/cr_spec.rb +9 -1
  161. data/spec/mongo/auth/ldap/conversation_spec.rb +43 -0
  162. data/spec/mongo/auth/ldap_spec.rb +9 -1
  163. data/spec/mongo/auth/scram_spec.rb +9 -1
  164. data/spec/mongo/auth/user/view_spec.rb +26 -1
  165. data/spec/mongo/auth/x509_spec.rb +9 -1
  166. data/spec/mongo/bulk_write/ordered_combiner_spec.rb +271 -0
  167. data/spec/mongo/bulk_write/unordered_combiner_spec.rb +239 -0
  168. data/spec/mongo/bulk_write_spec.rb +428 -0
  169. data/spec/mongo/client_spec.rb +167 -17
  170. data/spec/mongo/cluster/topology/replica_set_spec.rb +18 -9
  171. data/spec/mongo/cluster/topology/sharded_spec.rb +11 -3
  172. data/spec/mongo/cluster/topology/single_spec.rb +12 -4
  173. data/spec/mongo/cluster_spec.rb +55 -10
  174. data/spec/mongo/collection/view/aggregation_spec.rb +188 -1
  175. data/spec/mongo/collection/view/explainable_spec.rb +1 -1
  176. data/spec/mongo/collection/view/immutable_spec.rb +103 -0
  177. data/spec/mongo/collection/view/map_reduce_spec.rb +99 -4
  178. data/spec/mongo/collection/view/readable_spec.rb +238 -6
  179. data/spec/mongo/collection/view/writable_spec.rb +4 -4
  180. data/spec/mongo/collection/view_spec.rb +459 -71
  181. data/spec/mongo/collection_spec.rb +1291 -9
  182. data/spec/mongo/command_monitoring_spec.rb +51 -0
  183. data/spec/mongo/connection_string_spec.rb +115 -0
  184. data/spec/mongo/crud_spec.rb +2 -2
  185. data/spec/mongo/cursor_spec.rb +3 -3
  186. data/spec/mongo/database_spec.rb +47 -11
  187. data/spec/mongo/dbref_spec.rb +149 -0
  188. data/spec/mongo/grid/file/chunk_spec.rb +5 -5
  189. data/spec/mongo/grid/file/{metadata_spec.rb → info_spec.rb} +29 -17
  190. data/spec/mongo/grid/file_spec.rb +8 -8
  191. data/spec/mongo/grid/fs_bucket_spec.rb +1020 -0
  192. data/spec/mongo/grid/stream/read_spec.rb +275 -0
  193. data/spec/mongo/grid/stream/write_spec.rb +440 -0
  194. data/spec/mongo/grid/stream_spec.rb +48 -0
  195. data/spec/mongo/gridfs_spec.rb +50 -0
  196. data/spec/mongo/logger_spec.rb +0 -40
  197. data/spec/mongo/monitoring/command_log_subscriber_spec.rb +76 -0
  198. data/spec/mongo/monitoring/event/command_started_spec.rb +26 -0
  199. data/spec/mongo/monitoring/event/command_succeeded_spec.rb +26 -0
  200. data/spec/mongo/monitoring/event/secure_spec.rb +57 -0
  201. data/spec/mongo/monitoring_spec.rb +168 -0
  202. data/spec/mongo/operation/commands/aggregate_spec.rb +69 -0
  203. data/spec/mongo/operation/{read → commands}/collections_info_spec.rb +1 -1
  204. data/spec/mongo/operation/{command_spec.rb → commands/command_spec.rb} +0 -18
  205. data/spec/mongo/operation/{read → commands}/indexes_spec.rb +1 -1
  206. data/spec/mongo/operation/{map_reduce_spec.rb → commands/map_reduce_spec.rb} +1 -19
  207. data/spec/mongo/operation/kill_cursors_spec.rb +1 -17
  208. data/spec/mongo/operation/read/get_more_spec.rb +0 -16
  209. data/spec/mongo/operation/read/query_spec.rb +19 -16
  210. data/spec/mongo/operation/{read_preferrable_spec.rb → read_preference_spec.rb} +11 -11
  211. data/spec/mongo/operation/write/bulk/{bulk_delete_spec.rb → delete_spec.rb} +18 -29
  212. data/spec/mongo/operation/write/bulk/{bulk_insert_spec.rb → insert_spec.rb} +3 -14
  213. data/spec/mongo/operation/write/bulk/{bulk_update_spec.rb → update_spec.rb} +8 -19
  214. data/spec/mongo/operation/write/command/delete_spec.rb +0 -16
  215. data/spec/mongo/operation/write/command/insert_spec.rb +0 -16
  216. data/spec/mongo/operation/write/command/update_spec.rb +0 -16
  217. data/spec/mongo/operation/write/delete_spec.rb +4 -4
  218. data/spec/mongo/operation/write/insert_spec.rb +2 -13
  219. data/spec/mongo/operation/write/update_spec.rb +7 -7
  220. data/spec/mongo/options/redacted_spec.rb +350 -0
  221. data/spec/mongo/protocol/kill_cursors_spec.rb +5 -3
  222. data/spec/mongo/protocol/query_spec.rb +15 -30
  223. data/spec/mongo/retryable_spec.rb +147 -0
  224. data/spec/mongo/server/connection_pool/queue_spec.rb +16 -0
  225. data/spec/mongo/server/connection_pool_spec.rb +50 -6
  226. data/spec/mongo/server/connection_spec.rb +49 -4
  227. data/spec/mongo/server/description_spec.rb +49 -3
  228. data/spec/mongo/server/monitor_spec.rb +51 -0
  229. data/spec/mongo/server_discovery_and_monitoring_spec.rb +32 -59
  230. data/spec/mongo/server_selection_rtt_spec.rb +37 -57
  231. data/spec/mongo/server_selection_spec.rb +19 -9
  232. data/spec/mongo/server_selector/nearest_spec.rb +35 -27
  233. data/spec/mongo/server_selector/primary_preferred_spec.rb +32 -30
  234. data/spec/mongo/server_selector/primary_spec.rb +21 -14
  235. data/spec/mongo/server_selector/secondary_preferred_spec.rb +28 -26
  236. data/spec/mongo/server_selector/secondary_spec.rb +24 -22
  237. data/spec/mongo/server_selector_spec.rb +87 -24
  238. data/spec/mongo/server_spec.rb +94 -8
  239. data/spec/mongo/socket/ssl_spec.rb +123 -13
  240. data/spec/mongo/socket/unix_spec.rb +52 -0
  241. data/spec/mongo/uri_spec.rb +295 -67
  242. data/spec/spec_helper.rb +40 -24
  243. data/spec/support/authorization.rb +23 -9
  244. data/spec/support/certificates/client.pem +4 -4
  245. data/spec/support/command_monitoring/bulkWrite.yml +73 -0
  246. data/spec/support/command_monitoring/command.yml +42 -0
  247. data/spec/support/command_monitoring/deleteMany.yml +55 -0
  248. data/spec/support/command_monitoring/deleteOne.yml +55 -0
  249. data/spec/support/command_monitoring/find.yml +219 -0
  250. data/spec/support/command_monitoring/insertMany.yml +81 -0
  251. data/spec/support/command_monitoring/insertOne.yml +51 -0
  252. data/spec/support/command_monitoring/updateMany.yml +67 -0
  253. data/spec/support/command_monitoring/updateOne.yml +95 -0
  254. data/spec/support/command_monitoring.rb +365 -0
  255. data/spec/support/connection_string.rb +228 -0
  256. data/spec/support/connection_string_tests/invalid-uris.yml +193 -0
  257. data/spec/support/connection_string_tests/valid-auth.yml +256 -0
  258. data/spec/support/connection_string_tests/valid-host_identifiers.yml +121 -0
  259. data/spec/support/connection_string_tests/valid-options.yml +30 -0
  260. data/spec/support/connection_string_tests/valid-unix_socket-absolute.yml +197 -0
  261. data/spec/support/connection_string_tests/valid-unix_socket-relative.yml +213 -0
  262. data/spec/support/connection_string_tests/valid-warnings.yml +55 -0
  263. data/spec/support/crud/read.rb +22 -19
  264. data/spec/support/crud/write.rb +58 -27
  265. data/spec/support/crud.rb +10 -2
  266. data/spec/support/gridfs.rb +637 -0
  267. data/spec/support/gridfs_tests/delete.yml +157 -0
  268. data/spec/support/gridfs_tests/download.yml +210 -0
  269. data/spec/support/gridfs_tests/download_by_name.yml +113 -0
  270. data/spec/support/gridfs_tests/upload.yml +158 -0
  271. data/spec/support/matchers.rb +1 -1
  272. data/spec/support/sdam/rs/equal_electionids.yml +44 -0
  273. data/spec/support/sdam/rs/new_primary_new_electionid.yml +95 -0
  274. data/spec/support/sdam/rs/null_election_id.yml +144 -0
  275. data/spec/support/sdam/rs/primary_disconnect_electionid.yml +124 -0
  276. data/spec/support/sdam/rs/primary_mismatched_me.yml +37 -0
  277. data/spec/support/sdam/rs/primary_to_no_primary_mismatched_me.yml +75 -0
  278. data/spec/support/sdam/rs/secondary_mismatched_me.yml +37 -0
  279. data/spec/support/sdam/sharded/mongos_disconnect.yml +104 -0
  280. data/spec/support/sdam/single/direct_connection_rsarbiter.yml +1 -1
  281. data/spec/support/sdam/single/direct_connection_rsprimary.yml +1 -1
  282. data/spec/support/sdam/single/direct_connection_rssecondary.yml +1 -1
  283. data/spec/support/sdam/single/direct_connection_slave.yml +1 -1
  284. data/spec/support/sdam/single/direct_connection_standalone.yml +1 -1
  285. data/spec/support/sdam/single/not_ok_response.yml +0 -1
  286. data/spec/support/server_discovery_and_monitoring.rb +22 -3
  287. data/spec/support/server_selection.rb +3 -1
  288. data/spec/support/shared/bulk_write.rb +218 -22
  289. data/spec/support/shared/server_selector.rb +80 -14
  290. data.tar.gz.sig +0 -0
  291. metadata +188 -59
  292. metadata.gz.sig +0 -0
  293. data/lib/mongo/bulk_write/bulk_writable.rb +0 -196
  294. data/lib/mongo/bulk_write/deletable.rb +0 -56
  295. data/lib/mongo/bulk_write/insertable.rb +0 -48
  296. data/lib/mongo/bulk_write/replacable.rb +0 -57
  297. data/lib/mongo/bulk_write/updatable.rb +0 -68
  298. data/lib/mongo/grid/fs.rb +0 -149
  299. data/lib/mongo/operation/list_collections/result.rb +0 -114
  300. data/lib/mongo/operation/list_indexes/result.rb +0 -118
  301. data/lib/mongo/operation/read/collections_info.rb +0 -68
  302. data/lib/mongo/operation/read/indexes.rb +0 -69
  303. data/lib/mongo/operation/read/list_collections.rb +0 -76
  304. data/lib/mongo/operation/read/list_indexes.rb +0 -78
  305. data/lib/mongo/operation/write/bulk/bulk_delete/result.rb +0 -75
  306. data/lib/mongo/operation/write/bulk/bulk_delete.rb +0 -145
  307. data/lib/mongo/operation/write/bulk/bulk_insert/result.rb +0 -130
  308. data/lib/mongo/operation/write/bulk/bulk_insert.rb +0 -132
  309. data/lib/mongo/operation/write/bulk/bulk_mergable.rb +0 -67
  310. data/lib/mongo/operation/write/bulk/bulk_update/result.rb +0 -162
  311. data/lib/mongo/operation/write/bulk/bulk_update.rb +0 -154
  312. data/lib/mongo/operation/write/bulk/legacy_bulk_mergable.rb +0 -83
  313. data/spec/mongo/bulk/bulk_write_spec.rb +0 -262
  314. data/spec/mongo/grid/fs_spec.rb +0 -160
  315. data/spec/mongo/loggable_spec.rb +0 -63
  316. data/spec/mongo/operation/aggregate_spec.rb +0 -127
  317. /data/lib/mongo/operation/{aggregate → commands/aggregate}/result.rb +0 -0
@@ -4,6 +4,217 @@ describe Mongo::URI do
4
4
  let(:scheme) { 'mongodb://' }
5
5
  let(:uri) { described_class.new(string) }
6
6
 
7
+ describe 'invalid uris' do
8
+
9
+ context 'string is not uri' do
10
+
11
+ let(:string) { 'tyler' }
12
+
13
+ it 'raises an error' do
14
+ expect { uri }.to raise_error(Mongo::Error::InvalidURI)
15
+ end
16
+ end
17
+
18
+ context 'empty string' do
19
+
20
+ let(:string) { '' }
21
+
22
+ it 'raises an error' do
23
+ expect { uri }.to raise_error(Mongo::Error::InvalidURI)
24
+ end
25
+ end
26
+
27
+ context 'mongo://localhost:27017' do
28
+
29
+ let(:string) { 'mongo://localhost:27017' }
30
+
31
+ it 'raises an error' do
32
+ expect { uri }.to raise_error(Mongo::Error::InvalidURI)
33
+ end
34
+ end
35
+
36
+ context 'mongodb://' do
37
+
38
+ let(:string) { 'mongodb://' }
39
+
40
+ it 'raises an error' do
41
+ expect { uri }.to raise_error(Mongo::Error::InvalidURI)
42
+ end
43
+ end
44
+
45
+ context 'mongodb://localhost::27017' do
46
+
47
+ let(:string) { 'mongodb://localhost::27017' }
48
+
49
+ it 'raises an error' do
50
+ expect { uri }.to raise_error(Mongo::Error::InvalidURI)
51
+ end
52
+ end
53
+
54
+ context 'mongodb://localhost::27017/' do
55
+
56
+ let(:string) { 'mongodb://localhost::27017/' }
57
+
58
+ it 'raises an error' do
59
+ expect { uri }.to raise_error(Mongo::Error::InvalidURI)
60
+ end
61
+ end
62
+
63
+ context 'mongodb://::' do
64
+
65
+ let(:string) { 'mongodb://::' }
66
+
67
+ it 'raises an error' do
68
+ expect { uri }.to raise_error(Mongo::Error::InvalidURI)
69
+ end
70
+ end
71
+
72
+ context 'mongodb://localhost,localhost::' do
73
+
74
+ let(:string) { 'mongodb://localhost,localhost::' }
75
+
76
+ it 'raises an error' do
77
+ expect { uri }.to raise_error(Mongo::Error::InvalidURI)
78
+ end
79
+ end
80
+
81
+ context 'mongodb://localhost::27017,abc' do
82
+
83
+ let(:string) { 'mongodb://localhost::27017,abc' }
84
+
85
+ it 'raises an error' do
86
+ expect { uri }.to raise_error(Mongo::Error::InvalidURI)
87
+ end
88
+ end
89
+
90
+ context 'mongodb://localhost:-1' do
91
+
92
+ let(:string) { 'mongodb://localhost:-1' }
93
+
94
+ it 'raises an error' do
95
+ expect { uri }.to raise_error(Mongo::Error::InvalidURI)
96
+ end
97
+ end
98
+
99
+ context 'mongodb://localhost:0/' do
100
+
101
+ let(:string) { 'mongodb://localhost:0/' }
102
+
103
+ it 'raises an error' do
104
+ expect { uri }.to raise_error(Mongo::Error::InvalidURI)
105
+ end
106
+ end
107
+
108
+ context 'mongodb://localhost:65536' do
109
+
110
+ let(:string) { 'mongodb://localhost:65536' }
111
+
112
+ it 'raises an error' do
113
+ expect { uri }.to raise_error(Mongo::Error::InvalidURI)
114
+ end
115
+ end
116
+
117
+ context 'mongodb://localhost:foo' do
118
+
119
+ let(:string) { 'mongodb://localhost:foo' }
120
+
121
+ it 'raises an error' do
122
+ expect { uri }.to raise_error(Mongo::Error::InvalidURI)
123
+ end
124
+ end
125
+
126
+ context 'mongodb://[::1]:-1' do
127
+
128
+ let(:string) { 'mongodb://[::1]:-1' }
129
+
130
+ it 'raises an error' do
131
+ expect { uri }.to raise_error(Mongo::Error::InvalidURI)
132
+ end
133
+ end
134
+
135
+ context 'mongodb://[::1]:0/' do
136
+
137
+ let(:string) { 'mongodb://[::1]:0/' }
138
+
139
+ it 'raises an error' do
140
+ expect { uri }.to raise_error(Mongo::Error::InvalidURI)
141
+ end
142
+ end
143
+
144
+ context 'mongodb://[::1]:65536' do
145
+
146
+ let(:string) { 'mongodb://[::1]:65536' }
147
+
148
+ it 'raises an error' do
149
+ expect { uri }.to raise_error(Mongo::Error::InvalidURI)
150
+ end
151
+ end
152
+
153
+ context 'mongodb://[::1]:65536/' do
154
+
155
+ let(:string) { 'mongodb://[::1]:65536/' }
156
+
157
+ it 'raises an error' do
158
+ expect { uri }.to raise_error(Mongo::Error::InvalidURI)
159
+ end
160
+ end
161
+
162
+ context 'mongodb://[::1]:foo' do
163
+
164
+ let(:string) { 'mongodb://[::1]:foo' }
165
+
166
+ it 'raises an error' do
167
+ expect { uri }.to raise_error(Mongo::Error::InvalidURI)
168
+ end
169
+ end
170
+
171
+ context 'mongodb://example.com?w=1' do
172
+
173
+ let(:string) { 'mongodb://example.com?w=1' }
174
+
175
+ it 'raises an error' do
176
+ expect { uri }.to raise_error(Mongo::Error::InvalidURI)
177
+ end
178
+ end
179
+
180
+ context 'mongodb://example.com/?w' do
181
+
182
+ let(:string) { 'mongodb://example.com/?w' }
183
+
184
+ it 'raises an error' do
185
+ expect { uri }.to raise_error(Mongo::Error::InvalidURI)
186
+ end
187
+ end
188
+
189
+ context 'mongodb://alice:foo:bar@127.0.0.1' do
190
+
191
+ let(:string) { 'mongodb://alice:foo:bar@127.0.0.1' }
192
+
193
+ it 'raises an error' do
194
+ expect { uri }.to raise_error(Mongo::Error::InvalidURI)
195
+ end
196
+ end
197
+
198
+ context 'mongodb://alice@@127.0.0.1' do
199
+
200
+ let(:string) { 'mongodb://alice@@127.0.0.1' }
201
+
202
+ it 'raises an error' do
203
+ expect { uri }.to raise_error(Mongo::Error::InvalidURI)
204
+ end
205
+ end
206
+
207
+ context 'mongodb://alice@foo:bar@127.0.0.1' do
208
+
209
+ let(:string) { 'mongodb://alice@foo:bar@127.0.0.1' }
210
+
211
+ it 'raises an error' do
212
+ expect { uri }.to raise_error(Mongo::Error::InvalidURI)
213
+ end
214
+ end
215
+
216
+ end
217
+
7
218
  describe '#initialize' do
8
219
  context 'string is not uri' do
9
220
  let(:string) { 'tyler' }
@@ -49,7 +260,7 @@ describe Mongo::URI do
49
260
  end
50
261
 
51
262
  context 'unix socket server' do
52
- let(:servers) { '/tmp/mongodb-27017.sock' }
263
+ let(:servers) { '%2Ftmp%2Fmongodb-27017.sock' }
53
264
 
54
265
  it 'returns an array with the parsed server' do
55
266
  expect(uri.servers).to eq([servers])
@@ -129,16 +340,16 @@ describe Mongo::URI do
129
340
  describe '#database' do
130
341
  let(:servers) { 'localhost' }
131
342
  let(:string) { "#{scheme}#{servers}/#{db}" }
132
- let(:db) { TEST_DB }
343
+ let(:db) { 'auth-db' }
133
344
 
134
345
  context 'database provided' do
135
346
  it 'returns the database name' do
136
- expect(uri.database).to eq(TEST_DB)
347
+ expect(uri.database).to eq(db)
137
348
  end
138
349
  end
139
350
  end
140
351
 
141
- describe '#options' do
352
+ describe '#uri_options' do
142
353
  let(:servers) { 'localhost' }
143
354
  let(:string) { "#{scheme}#{servers}/?#{options}" }
144
355
 
@@ -146,7 +357,7 @@ describe Mongo::URI do
146
357
  let(:string) { "#{scheme}#{servers}" }
147
358
 
148
359
  it 'returns an empty hash' do
149
- expect(uri.options).to be_empty
360
+ expect(uri.uri_options).to be_empty
150
361
  end
151
362
  end
152
363
 
@@ -154,47 +365,47 @@ describe Mongo::URI do
154
365
 
155
366
  context 'numerical w value' do
156
367
  let(:options) { 'w=1' }
157
- let(:concern) { { :w => 1 } }
368
+ let(:concern) { Mongo::Options::Redacted.new(:w => 1)}
158
369
 
159
370
  it 'sets the write concern options' do
160
- expect(uri.options[:write]).to eq(concern)
371
+ expect(uri.uri_options[:write]).to eq(concern)
161
372
  end
162
373
  end
163
374
 
164
375
  context 'w=majority' do
165
376
  let(:options) { 'w=majority' }
166
- let(:concern) { { :w => :majority } }
377
+ let(:concern) { Mongo::Options::Redacted.new(:w => :majority) }
167
378
 
168
379
  it 'sets the write concern options' do
169
- expect(uri.options[:write]).to eq(concern)
380
+ expect(uri.uri_options[:write]).to eq(concern)
170
381
  end
171
382
  end
172
383
 
173
384
  context 'journal' do
174
- let(:options) { 'j=true' }
175
- let(:concern) { { :j => true } }
385
+ let(:options) { 'journal=true' }
386
+ let(:concern) { Mongo::Options::Redacted.new(:j => true) }
176
387
 
177
388
  it 'sets the write concern options' do
178
- expect(uri.options[:write]).to eq(concern)
389
+ expect(uri.uri_options[:write]).to eq(concern)
179
390
  end
180
391
  end
181
392
 
182
393
  context 'fsync' do
183
394
  let(:options) { 'fsync=true' }
184
- let(:concern) { { :fsync => true } }
395
+ let(:concern) { Mongo::Options::Redacted.new(:fsync => true) }
185
396
 
186
397
  it 'sets the write concern options' do
187
- expect(uri.options[:write]).to eq(concern)
398
+ expect(uri.uri_options[:write]).to eq(concern)
188
399
  end
189
400
  end
190
401
 
191
402
  context 'wtimeoutMS' do
192
403
  let(:timeout) { 1234 }
193
404
  let(:options) { "w=2&wtimeoutMS=#{timeout}" }
194
- let(:concern) { { :w => 2, :timeout => timeout } }
405
+ let(:concern) { Mongo::Options::Redacted.new(:w => 2, :timeout => timeout) }
195
406
 
196
407
  it 'sets the write concern options' do
197
- expect(uri.options[:write]).to eq(concern)
408
+ expect(uri.uri_options[:write]).to eq(concern)
198
409
  end
199
410
  end
200
411
  end
@@ -204,51 +415,51 @@ describe Mongo::URI do
204
415
 
205
416
  context 'primary' do
206
417
  let(:mode) { 'primary' }
207
- let(:read) { { :mode => :primary } }
418
+ let(:read) { Mongo::Options::Redacted.new(:mode => :primary) }
208
419
 
209
420
  it 'sets the read preference' do
210
- expect(uri.options[:read]).to eq(read)
421
+ expect(uri.uri_options[:read]).to eq(read)
211
422
  end
212
423
  end
213
424
 
214
425
  context 'primaryPreferred' do
215
426
  let(:mode) { 'primaryPreferred' }
216
- let(:read) { { :mode => :primary_preferred } }
427
+ let(:read) { Mongo::Options::Redacted.new(:mode => :primary_preferred) }
217
428
 
218
429
  it 'sets the read preference' do
219
- expect(uri.options[:read]).to eq(read)
430
+ expect(uri.uri_options[:read]).to eq(read)
220
431
  end
221
432
  end
222
433
 
223
434
  context 'secondary' do
224
435
  let(:mode) { 'secondary' }
225
- let(:read) { { :mode => :secondary } }
436
+ let(:read) { Mongo::Options::Redacted.new(:mode => :secondary) }
226
437
 
227
438
  it 'sets the read preference' do
228
- expect(uri.options[:read]).to eq(read)
439
+ expect(uri.uri_options[:read]).to eq(read)
229
440
  end
230
441
  end
231
442
 
232
443
  context 'secondaryPreferred' do
233
444
  let(:mode) { 'secondaryPreferred' }
234
- let(:read) { { :mode => :secondary_preferred } }
445
+ let(:read) { Mongo::Options::Redacted.new(:mode => :secondary_preferred) }
235
446
 
236
447
  it 'sets the read preference' do
237
- expect(uri.options[:read]).to eq(read)
448
+ expect(uri.uri_options[:read]).to eq(read)
238
449
  end
239
450
  end
240
451
 
241
452
  context 'nearest' do
242
453
  let(:mode) { 'nearest' }
243
- let(:read) { { :mode => :nearest } }
454
+ let(:read) { Mongo::Options::Redacted.new(:mode => :nearest) }
244
455
 
245
456
  it 'sets the read preference' do
246
- expect(uri.options[:read]).to eq(read)
457
+ expect(uri.uri_options[:read]).to eq(read)
247
458
  end
248
459
  end
249
460
  end
250
461
 
251
- context 'read preferece tags provided' do
462
+ context 'read preference tags provided' do
252
463
 
253
464
  context 'single read preference tag set' do
254
465
  let(:options) do
@@ -256,11 +467,11 @@ describe Mongo::URI do
256
467
  end
257
468
 
258
469
  let(:read) do
259
- { :tag_sets => [{ :dc => 'ny', :rack => '1' }] }
470
+ Mongo::Options::Redacted.new(:tag_sets => [{ 'dc' => 'ny', 'rack' => '1' }])
260
471
  end
261
472
 
262
473
  it 'sets the read preference tag set' do
263
- expect(uri.options[:read]).to eq(read)
474
+ expect(uri.uri_options[:read]).to eq(read)
264
475
  end
265
476
  end
266
477
 
@@ -270,11 +481,11 @@ describe Mongo::URI do
270
481
  end
271
482
 
272
483
  let(:read) do
273
- { :tag_sets => [{ :dc => 'ny' }, { :dc => 'bos' }] }
484
+ Mongo::Options::Redacted.new(:tag_sets => [{ 'dc' => 'ny' }, { 'dc' => 'bos' }])
274
485
  end
275
486
 
276
487
  it 'sets the read preference tag sets' do
277
- expect(uri.options[:read]).to eq(read)
488
+ expect(uri.uri_options[:read]).to eq(read)
278
489
  end
279
490
  end
280
491
  end
@@ -284,7 +495,7 @@ describe Mongo::URI do
284
495
  let(:options) { "replicaSet=#{rs_name}" }
285
496
 
286
497
  it 'sets the replica set option' do
287
- expect(uri.options[:replica_set]).to eq(rs_name)
498
+ expect(uri.uri_options[:replica_set]).to eq(rs_name)
288
499
  end
289
500
  end
290
501
 
@@ -293,28 +504,29 @@ describe Mongo::URI do
293
504
 
294
505
  context 'plain' do
295
506
  let(:mechanism) { 'PLAIN' }
296
- let(:auth) { { :mechanism => :plain } }
507
+ let(:expected) { :plain }
297
508
 
298
509
  it 'sets the auth mechanism to :plain' do
299
- expect(uri.options[:auth]).to eq(auth)
510
+ expect(uri.uri_options[:auth_mech]).to eq(expected)
300
511
  end
301
512
  end
302
513
 
303
514
  context 'mongodb-cr' do
304
515
  let(:mechanism) { 'MONGODB-CR' }
305
- let(:auth) { { :mechanism => :mongodb_cr } }
516
+ let(:expected) { :mongodb_cr }
306
517
 
307
518
  it 'sets the auth mechanism to :mongodb_cr' do
308
- expect(uri.options[:auth]).to eq(auth)
519
+ expect(uri.uri_options[:auth_mech]).to eq(expected)
309
520
  end
310
521
  end
311
522
 
312
523
  context 'gssapi' do
313
524
  let(:mechanism) { 'GSSAPI' }
314
- let(:auth) { { :mechanism => :gssapi } }
525
+ let(:expected) { :gssapi }
526
+
315
527
 
316
528
  it 'sets the auth mechanism to :gssapi' do
317
- expect(uri.options[:auth]).to eq(auth)
529
+ expect(uri.uri_options[:auth_mech]).to eq(expected)
318
530
  end
319
531
  end
320
532
  end
@@ -324,19 +536,19 @@ describe Mongo::URI do
324
536
 
325
537
  context 'regular db' do
326
538
  let(:source) { 'foo' }
327
- let(:auth) { { :source => 'foo' } }
539
+ let(:auth) { Mongo::Options::Redacted.new(:source => 'foo') }
328
540
 
329
541
  it 'sets the auth source to the database' do
330
- expect(uri.options[:auth]).to eq(auth)
542
+ expect(uri.uri_options[:auth]).to eq(auth)
331
543
  end
332
544
  end
333
545
 
334
546
  context '$external' do
335
547
  let(:source) { '$external' }
336
- let(:auth) { { :source => :external } }
548
+ let(:auth) { Mongo::Options::Redacted.new(:source => :external) }
337
549
 
338
550
  it 'sets the auth source to :external' do
339
- expect(uri.options[:auth]).to eq(auth)
551
+ expect(uri.uri_options[:auth]).to eq(auth)
340
552
  end
341
553
  end
342
554
  end
@@ -350,11 +562,11 @@ describe Mongo::URI do
350
562
 
351
563
  let(:service_name) { 'foo' }
352
564
  let(:auth) do
353
- { auth_mech_properties: { service_name: service_name } }
565
+ Mongo::Options::Redacted.new(auth_mech_properties: { service_name: service_name })
354
566
  end
355
567
 
356
568
  it 'sets the auth mechanism properties' do
357
- expect(uri.options[:auth]).to eq(auth)
569
+ expect(uri.uri_options[:auth]).to eq(auth)
358
570
  end
359
571
  end
360
572
 
@@ -365,11 +577,11 @@ describe Mongo::URI do
365
577
 
366
578
  let(:canonicalize_host_name) { 'true' }
367
579
  let(:auth) do
368
- { auth_mech_properties: { canonicalize_host_name: true } }
580
+ Mongo::Options::Redacted.new(auth_mech_properties: { canonicalize_host_name: true })
369
581
  end
370
582
 
371
583
  it 'sets the auth mechanism properties' do
372
- expect(uri.options[:auth]).to eq(auth)
584
+ expect(uri.uri_options[:auth]).to eq(auth)
373
585
  end
374
586
  end
375
587
 
@@ -380,11 +592,11 @@ describe Mongo::URI do
380
592
 
381
593
  let(:service_realm) { 'dumdum' }
382
594
  let(:auth) do
383
- { auth_mech_properties: { service_realm: service_realm } }
595
+ Mongo::Options::Redacted.new(auth_mech_properties: { service_realm: service_realm })
384
596
  end
385
597
 
386
598
  it 'sets the auth mechanism properties' do
387
- expect(uri.options[:auth]).to eq(auth)
599
+ expect(uri.uri_options[:auth]).to eq(auth)
388
600
  end
389
601
  end
390
602
 
@@ -400,13 +612,13 @@ describe Mongo::URI do
400
612
  let(:service_realm) { 'dumdum' }
401
613
 
402
614
  let(:auth) do
403
- { auth_mech_properties: { service_name: service_name,
404
- canonicalize_host_name: true,
405
- service_realm: service_realm } }
615
+ Mongo::Options::Redacted.new(auth_mech_properties: { service_name: service_name,
616
+ canonicalize_host_name: true,
617
+ service_realm: service_realm })
406
618
  end
407
619
 
408
620
  it 'sets the auth mechanism properties' do
409
- expect(uri.options[:auth]).to eq(auth)
621
+ expect(uri.uri_options[:auth]).to eq(auth)
410
622
  end
411
623
  end
412
624
  end
@@ -415,7 +627,7 @@ describe Mongo::URI do
415
627
  let(:options) { "connectTimeoutMS=4567" }
416
628
 
417
629
  it 'sets the the connect timeout' do
418
- expect(uri.options[:connect_timeout]).to eq(4.567)
630
+ expect(uri.uri_options[:connect_timeout]).to eq(4.567)
419
631
  end
420
632
  end
421
633
 
@@ -423,7 +635,7 @@ describe Mongo::URI do
423
635
  let(:options) { "socketTimeoutMS=8910" }
424
636
 
425
637
  it 'sets the socket timeout' do
426
- expect(uri.options[:socket_timeout]).to eq(8.910)
638
+ expect(uri.uri_options[:socket_timeout]).to eq(8.910)
427
639
  end
428
640
  end
429
641
 
@@ -432,7 +644,7 @@ describe Mongo::URI do
432
644
  let(:options) { "serverSelectionTimeoutMS=3561" }
433
645
 
434
646
  it 'sets the the connect timeout' do
435
- expect(uri.options[:server_selection_timeout]).to eq(3.561)
647
+ expect(uri.uri_options[:server_selection_timeout]).to eq(3.561)
436
648
  end
437
649
  end
438
650
 
@@ -441,7 +653,7 @@ describe Mongo::URI do
441
653
  let(:options) { "localThresholdMS=3561" }
442
654
 
443
655
  it 'sets the the connect timeout' do
444
- expect(uri.options[:local_threshold]).to eq(3.561)
656
+ expect(uri.uri_options[:local_threshold]).to eq(3.561)
445
657
  end
446
658
  end
447
659
 
@@ -451,7 +663,7 @@ describe Mongo::URI do
451
663
  let(:options) { "maxPoolSize=#{max_pool_size}" }
452
664
 
453
665
  it 'sets the max pool size option' do
454
- expect(uri.options[:max_pool_size]).to eq(max_pool_size)
666
+ expect(uri.uri_options[:max_pool_size]).to eq(max_pool_size)
455
667
  end
456
668
  end
457
669
 
@@ -461,7 +673,7 @@ describe Mongo::URI do
461
673
  let(:options) { "minPoolSize=#{min_pool_size}" }
462
674
 
463
675
  it 'sets the min pool size option' do
464
- expect(uri.options[:min_pool_size]).to eq(min_pool_size)
676
+ expect(uri.uri_options[:min_pool_size]).to eq(min_pool_size)
465
677
  end
466
678
  end
467
679
 
@@ -471,7 +683,7 @@ describe Mongo::URI do
471
683
  let(:options) { "waitQueueTimeoutMS=#{wait_queue_timeout}" }
472
684
 
473
685
  it 'sets the wait queue timeout option' do
474
- expect(uri.options[:wait_queue_timeout]).to eq(0.5)
686
+ expect(uri.uri_options[:wait_queue_timeout]).to eq(0.5)
475
687
  end
476
688
  end
477
689
 
@@ -482,7 +694,7 @@ describe Mongo::URI do
482
694
  let(:ssl) { true }
483
695
 
484
696
  it 'sets the ssl option to true' do
485
- expect(uri.options[:ssl]).to be true
697
+ expect(uri.uri_options[:ssl]).to be true
486
698
  end
487
699
  end
488
700
 
@@ -490,7 +702,7 @@ describe Mongo::URI do
490
702
  let(:ssl) { false }
491
703
 
492
704
  it 'sets the ssl option to false' do
493
- expect(uri.options[:ssl]).to be false
705
+ expect(uri.uri_options[:ssl]).to be false
494
706
  end
495
707
  end
496
708
  end
@@ -499,18 +711,34 @@ describe Mongo::URI do
499
711
  let(:options) { 'w=1&ssl=true' }
500
712
 
501
713
  it 'do not overshadow top level options' do
502
- expect(uri.options).not_to be_empty
714
+ expect(uri.uri_options).not_to be_empty
503
715
  end
504
716
  end
505
717
 
506
718
  context 'when an invalid option is provided' do
507
719
 
508
- let(:options) { 'iDontKnow=10' }
720
+ let(:options) { 'invalidOption=10' }
721
+
722
+ let(:uri_options) do
723
+ uri.uri_options
724
+ end
725
+
726
+ it 'does not raise an exception' do
727
+ expect(uri_options).to be_empty
728
+ end
509
729
 
510
- it 'raises an exception' do
511
- expect {
512
- uri.options
513
- }.to raise_error(Mongo::Error::InvalidURIOption)
730
+ context 'when an invalid option is combined with valid options' do
731
+
732
+ let(:options) { 'invalidOption=10&waitQueueTimeoutMS=500&ssl=true' }
733
+
734
+ it 'does not raise an exception' do
735
+ expect(uri_options).not_to be_empty
736
+ end
737
+
738
+ it 'sets the valid options' do
739
+ expect(uri_options[:wait_queue_timeout]).to eq(0.5)
740
+ expect(uri_options[:ssl]).to be true
741
+ end
514
742
  end
515
743
  end
516
744
  end