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
@@ -0,0 +1,51 @@
1
+ require 'spec_helper'
2
+
3
+ def runnable?(file)
4
+ !write_command_enabled? && (file.include?('bulkWrite') || file.include?('insert'))
5
+ end
6
+
7
+ describe 'Command Monitoring Events' do
8
+
9
+ COMMAND_MONITORING_TESTS.each do |file|
10
+
11
+ spec = Mongo::CommandMonitoring::Spec.new(file)
12
+
13
+ spec.tests.each do |test|
14
+
15
+ context(test.description) do
16
+
17
+ let(:subscriber) do
18
+ Mongo::CommandMonitoring::TestSubscriber.new
19
+ end
20
+
21
+ let(:monitoring) do
22
+ authorized_client.instance_variable_get(:@monitoring)
23
+ end
24
+
25
+ before do
26
+ authorized_collection.find.delete_many
27
+ authorized_client.subscribe(Mongo::Monitoring::COMMAND, subscriber)
28
+ end
29
+
30
+ after do
31
+ monitoring.subscribers[Mongo::Monitoring::COMMAND].delete(subscriber)
32
+ authorized_collection.find.delete_many
33
+ end
34
+
35
+ test.expectations.each do |expectation|
36
+
37
+ it "generates a #{expectation.event_name} for #{expectation.command_name}", unless: runnable?(file) do
38
+ begin
39
+ test.run(authorized_collection)
40
+ event = subscriber.send(expectation.event_type)[expectation.command_name]
41
+ expect(event).to send(expectation.matcher, expectation)
42
+ rescue Mongo::Error::OperationFailure, Mongo::Error::BulkWriteError => e
43
+ event = subscriber.send(expectation.event_type)[expectation.command_name]
44
+ expect(event).to send(expectation.matcher, expectation)
45
+ end
46
+ end
47
+ end
48
+ end
49
+ end
50
+ end
51
+ end
@@ -0,0 +1,115 @@
1
+ require 'spec_helper'
2
+
3
+ describe 'ConnectionString' do
4
+ include Mongo::ConnectionString
5
+
6
+ CONNECTION_STRING_TESTS.each do |file|
7
+
8
+ spec = Mongo::ConnectionString::Spec.new(file)
9
+
10
+ context(spec.description) do
11
+
12
+ before(:all) do
13
+
14
+ module Mongo
15
+ class Address
16
+
17
+ private
18
+
19
+ alias :original_initialize_resolver! :initialize_resolver!
20
+ def initialize_resolver!(timeout, ssl_options)
21
+ family = (host == 'localhost') ? ::Socket::AF_INET : ::Socket::AF_UNSPEC
22
+ info = ::Socket.getaddrinfo(host, nil, family, ::Socket::SOCK_STREAM)
23
+ FAMILY_MAP[info.first[4]].new(info[3], port, host)
24
+ end
25
+ end
26
+
27
+ class Server
28
+
29
+ # The constructor keeps the same API, but does not instantiate a
30
+ # monitor and run it.
31
+ alias :original_initialize :initialize
32
+ def initialize(address, cluster, monitoring, event_listeners, options = {})
33
+ @address = address
34
+ @cluster = cluster
35
+ @monitoring = monitoring
36
+ @options = options.freeze
37
+ @monitor = Monitor.new(address, event_listeners, options)
38
+ end
39
+
40
+ # Disconnect simply needs to return true since we have no monitor and
41
+ # no connection.
42
+ alias :original_disconnect! :disconnect!
43
+ def disconnect!; true; end
44
+ end
45
+ end
46
+ end
47
+
48
+ after(:all) do
49
+
50
+ module Mongo
51
+ # Return the implementations to their originals for the other
52
+ # tests in the suite.
53
+ class Address
54
+ alias :initialize_resolver! :original_initialize_resolver!
55
+ remove_method(:original_initialize_resolver!)
56
+ end
57
+
58
+ class Server
59
+ alias :initialize :original_initialize
60
+ remove_method(:original_initialize)
61
+
62
+ alias :disconnect! :original_disconnect!
63
+ remove_method(:original_disconnect!)
64
+ end
65
+ end
66
+ end
67
+
68
+ spec.tests.each_with_index do |test, index|
69
+
70
+ context "when a #{test.description} is provided" do
71
+
72
+
73
+ context 'when the uri is invalid', unless: test.valid? do
74
+
75
+ it 'raises an error' do
76
+ expect{
77
+ test.uri
78
+ }.to raise_exception(Mongo::Error::InvalidURI)
79
+ end
80
+ end
81
+
82
+ context 'when the uri should warn', if: test.warn? do
83
+
84
+ before do
85
+ expect(Mongo::Logger.logger).to receive(:warn)
86
+ end
87
+
88
+ it 'warns' do
89
+ expect(test.client).to be_a(Mongo::Client)
90
+ end
91
+ end
92
+
93
+ context 'when the uri is valid', if: test.valid? do
94
+
95
+ it 'does not raise an exception' do
96
+ expect(test.uri).to be_a(Mongo::URI)
97
+ end
98
+
99
+ it 'creates a client with the correct hosts' do
100
+ expect(test.client).to have_hosts(test)
101
+ end
102
+
103
+ it 'creates a client with the correct authentication properties' do
104
+ expect(test.client).to match_auth(test)
105
+ end
106
+
107
+ it 'creates a client with the correct options' do
108
+ expect(test.client).to match_options(test)
109
+ end
110
+ end
111
+ end
112
+ end
113
+ end
114
+ end
115
+ end
@@ -13,11 +13,11 @@ describe 'CRUD' do
13
13
  context(test.description) do
14
14
 
15
15
  before(:each) do
16
- authorized_collection.find.delete_many
16
+ authorized_collection.delete_many
17
17
  end
18
18
 
19
19
  after(:each) do
20
- authorized_collection.find.delete_many
20
+ authorized_collection.delete_many
21
21
  end
22
22
 
23
23
  let(:results) do
@@ -33,7 +33,7 @@ describe Mongo::Cursor do
33
33
  end
34
34
 
35
35
  after do
36
- authorized_collection.find.delete_many
36
+ authorized_collection.delete_many
37
37
  end
38
38
 
39
39
  it 'returns the correct amount' do
@@ -58,7 +58,7 @@ describe Mongo::Cursor do
58
58
  end
59
59
 
60
60
  after do
61
- authorized_collection.find.delete_many
61
+ authorized_collection.delete_many
62
62
  end
63
63
 
64
64
  it 'returns the correct amount' do
@@ -84,7 +84,7 @@ describe Mongo::Cursor do
84
84
  end
85
85
 
86
86
  after do
87
- authorized_collection.find.delete_many
87
+ authorized_collection.delete_many
88
88
  end
89
89
 
90
90
  context 'when a limit is provided' do
@@ -93,6 +93,26 @@ describe Mongo::Database do
93
93
  expect(database.collection_names(batch_size: 1).to_a).to include('users')
94
94
  end
95
95
  end
96
+
97
+ context 'when there are more collections than the initial batch size' do
98
+
99
+ before do
100
+ 200.times do |i|
101
+ database["#{i}_dalmatians"].create
102
+ end
103
+ end
104
+
105
+ after do
106
+ 200.times do |i|
107
+ database["#{i}_dalmatians"].drop
108
+ end
109
+ end
110
+
111
+ it 'returns all collections' do
112
+ expect(database.collection_names.select { |c| c =~ /dalmatians/}.size).to eq(200)
113
+ end
114
+
115
+ end
96
116
  end
97
117
 
98
118
  describe '#list_collections' do
@@ -195,7 +215,7 @@ describe Mongo::Database do
195
215
  end
196
216
 
197
217
  let(:client) do
198
- authorized_client.with(server_selection_timeout: 2)
218
+ authorized_client.with(server_selection_timeout: 0.1)
199
219
  end
200
220
 
201
221
  let(:database) do
@@ -278,7 +298,7 @@ describe Mongo::Database do
278
298
  shared_context 'a GridFS database' do
279
299
 
280
300
  it 'returns a Grid::FS for the db' do
281
- expect(fs).to be_a(Mongo::Grid::FS)
301
+ expect(fs).to be_a(Mongo::Grid::FSBucket)
282
302
  end
283
303
 
284
304
  context 'when operating on the fs' do
@@ -292,8 +312,8 @@ describe Mongo::Database do
292
312
  end
293
313
 
294
314
  after do
295
- fs.files_collection.find.delete_many
296
- fs.chunks_collection.find.delete_many
315
+ fs.files_collection.delete_many
316
+ fs.chunks_collection.delete_many
297
317
  end
298
318
 
299
319
  let(:from_db) do
@@ -301,7 +321,7 @@ describe Mongo::Database do
301
321
  end
302
322
 
303
323
  it 'returns the assembled file from the db' do
304
- expect(from_db.filename).to eq(file.metadata.filename)
324
+ expect(from_db.filename).to eq(file.info.filename)
305
325
  end
306
326
  end
307
327
  end
@@ -317,15 +337,31 @@ describe Mongo::Database do
317
337
 
318
338
  context 'when a custom prefix is provided' do
319
339
 
320
- let(:fs) do
321
- database.fs(:fs_name => 'grid')
322
- end
340
+ context 'when the option is fs_name' do
341
+
342
+ let(:fs) do
343
+ database.fs(:fs_name => 'grid')
344
+ end
323
345
 
324
- it 'sets the custom prefix' do
325
- expect(fs.prefix).to eq('grid')
346
+ it 'sets the custom prefix' do
347
+ expect(fs.prefix).to eq('grid')
348
+ end
349
+
350
+ it_behaves_like 'a GridFS database'
326
351
  end
327
352
 
328
- it_behaves_like 'a GridFS database'
353
+ context 'when the option is bucket_name' do
354
+
355
+ let(:fs) do
356
+ database.fs(:bucket_name => 'grid')
357
+ end
358
+
359
+ it 'sets the custom prefix' do
360
+ expect(fs.prefix).to eq('grid')
361
+ end
362
+
363
+ it_behaves_like 'a GridFS database'
364
+ end
329
365
  end
330
366
  end
331
367
  end
@@ -0,0 +1,149 @@
1
+ require 'spec_helper'
2
+ require 'json'
3
+
4
+ describe Mongo::DBRef do
5
+
6
+ let(:object_id) do
7
+ BSON::ObjectId.new
8
+ end
9
+
10
+ describe '#as_json' do
11
+
12
+ context 'when the database is not provided' do
13
+
14
+ let(:dbref) do
15
+ described_class.new('users', object_id)
16
+ end
17
+
18
+ it 'returns the json document without database' do
19
+ expect(dbref.as_json).to eq({ '$ref' => 'users', '$id' => object_id })
20
+ end
21
+ end
22
+
23
+ context 'when the database is provided' do
24
+
25
+ let(:dbref) do
26
+ described_class.new('users', object_id, 'database')
27
+ end
28
+
29
+ it 'returns the json document with database' do
30
+ expect(dbref.as_json).to eq({
31
+ '$ref' => 'users',
32
+ '$id' => object_id,
33
+ '$db' => 'database'
34
+ })
35
+ end
36
+ end
37
+ end
38
+
39
+ describe '#initialize' do
40
+
41
+ let(:dbref) do
42
+ described_class.new('users', object_id)
43
+ end
44
+
45
+ it 'sets the collection' do
46
+ expect(dbref.collection).to eq('users')
47
+ end
48
+
49
+ it 'sets the id' do
50
+ expect(dbref.id).to eq(object_id)
51
+ end
52
+
53
+ context 'when a database is provided' do
54
+
55
+ let(:dbref) do
56
+ described_class.new('users', object_id, 'db')
57
+ end
58
+
59
+ it 'sets the database' do
60
+ expect(dbref.database).to eq('db')
61
+ end
62
+ end
63
+ end
64
+
65
+ describe '#to_bson' do
66
+
67
+ let(:dbref) do
68
+ described_class.new('users', object_id, 'database')
69
+ end
70
+
71
+ it 'converts the underlying document to bson' do
72
+ expect(dbref.to_bson).to eq(dbref.as_json.to_bson)
73
+ end
74
+ end
75
+
76
+ describe '#to_json' do
77
+
78
+ context 'when the database is not provided' do
79
+
80
+ let(:dbref) do
81
+ described_class.new('users', object_id)
82
+ end
83
+
84
+ it 'returns the json document without database' do
85
+ expect(dbref.to_json).to eq("{\"$ref\":\"users\",\"$id\":#{object_id.to_json}}")
86
+ end
87
+ end
88
+
89
+ context 'when the database is provided' do
90
+
91
+ let(:dbref) do
92
+ described_class.new('users', object_id, 'database')
93
+ end
94
+
95
+ it 'returns the json document with database' do
96
+ expect(dbref.to_json).to eq("{\"$ref\":\"users\",\"$id\":#{object_id.to_json},\"$db\":\"database\"}")
97
+ end
98
+ end
99
+ end
100
+
101
+ describe '#from_bson' do
102
+
103
+ let(:bson) do
104
+ StringIO.new(dbref.to_bson)
105
+ end
106
+
107
+ let(:decoded) do
108
+ BSON::Document.from_bson(bson)
109
+ end
110
+
111
+ context 'when a database exists' do
112
+
113
+ let(:dbref) do
114
+ described_class.new('users', object_id, 'database')
115
+ end
116
+
117
+ it 'decodes the ref' do
118
+ expect(decoded.collection).to eq('users')
119
+ end
120
+
121
+ it 'decodes the id' do
122
+ expect(decoded.id).to eq(object_id)
123
+ end
124
+
125
+ it 'decodes the database' do
126
+ expect(decoded.database).to eq('database')
127
+ end
128
+ end
129
+
130
+ context 'when no database exists' do
131
+
132
+ let(:dbref) do
133
+ described_class.new('users', object_id)
134
+ end
135
+
136
+ it 'decodes the ref' do
137
+ expect(decoded.collection).to eq('users')
138
+ end
139
+
140
+ it 'decodes the id' do
141
+ expect(decoded.id).to eq(object_id)
142
+ end
143
+
144
+ it 'sets the database to nil' do
145
+ expect(decoded.database).to be_nil
146
+ end
147
+ end
148
+ end
149
+ end
@@ -10,8 +10,8 @@ describe Mongo::Grid::File::Chunk do
10
10
  BSON::ObjectId.new
11
11
  end
12
12
 
13
- let(:metadata) do
14
- Mongo::Grid::File::Metadata.new(:files_id => file_id)
13
+ let(:file_info) do
14
+ Mongo::Grid::File::Info.new(:files_id => file_id)
15
15
  end
16
16
 
17
17
  describe '#==' do
@@ -72,7 +72,7 @@ describe Mongo::Grid::File::Chunk do
72
72
  end
73
73
 
74
74
  let(:chunks) do
75
- described_class.split(raw_data, metadata)
75
+ described_class.split(raw_data, file_info)
76
76
  end
77
77
 
78
78
  it 'returns the chunks assembled into the raw data' do
@@ -157,7 +157,7 @@ describe Mongo::Grid::File::Chunk do
157
157
  end
158
158
 
159
159
  let(:chunks) do
160
- described_class.split(raw_data, metadata)
160
+ described_class.split(raw_data, file_info)
161
161
  end
162
162
 
163
163
  let(:chunk) do
@@ -204,7 +204,7 @@ describe Mongo::Grid::File::Chunk do
204
204
  end
205
205
 
206
206
  let(:chunks) do
207
- described_class.split(raw_data, metadata)
207
+ described_class.split(raw_data, file_info)
208
208
  end
209
209
 
210
210
  it 'returns the correct number of chunks' do
@@ -1,6 +1,6 @@
1
1
  require 'spec_helper'
2
2
 
3
- describe Mongo::Grid::File::Metadata do
3
+ describe Mongo::Grid::File::Info do
4
4
 
5
5
  describe '#==' do
6
6
 
@@ -8,23 +8,23 @@ describe Mongo::Grid::File::Metadata do
8
8
  Time.now.utc
9
9
  end
10
10
 
11
- let(:metadata) do
11
+ let(:info) do
12
12
  described_class.new(:filename => 'test.txt', :length => 7, :uploadDate => upload_date)
13
13
  end
14
14
 
15
- context 'when the other is not metadata' do
15
+ context 'when the other is not a file info object' do
16
16
 
17
17
  it 'returns false' do
18
- expect(metadata).to_not eq('test')
18
+ expect(info).to_not eq('test')
19
19
  end
20
20
  end
21
21
 
22
- context 'when the other object is metadata' do
22
+ context 'when the other object is file info object' do
23
23
 
24
24
  context 'when the documents are equal' do
25
25
 
26
26
  it 'returns true' do
27
- expect(metadata).to eq(metadata)
27
+ expect(info).to eq(info)
28
28
  end
29
29
  end
30
30
 
@@ -35,7 +35,7 @@ describe Mongo::Grid::File::Metadata do
35
35
  end
36
36
 
37
37
  it 'returns false' do
38
- expect(metadata).to_not eq(other)
38
+ expect(info).to_not eq(other)
39
39
  end
40
40
  end
41
41
  end
@@ -45,48 +45,60 @@ describe Mongo::Grid::File::Metadata do
45
45
 
46
46
  context 'when provided only a filename and length' do
47
47
 
48
- let(:metadata) do
48
+ let(:info) do
49
49
  described_class.new(:filename => 'test.txt', :length => 7)
50
50
  end
51
51
 
52
52
  it 'sets the default id' do
53
- expect(metadata.id).to be_a(BSON::ObjectId)
53
+ expect(info.id).to be_a(BSON::ObjectId)
54
54
  end
55
55
 
56
56
  it 'sets the upload date' do
57
- expect(metadata.upload_date).to be_a(Time)
57
+ expect(info.upload_date).to be_a(Time)
58
58
  end
59
59
 
60
60
  it 'sets the chunk size' do
61
- expect(metadata.chunk_size).to eq(Mongo::Grid::File::Chunk::DEFAULT_SIZE)
61
+ expect(info.chunk_size).to eq(Mongo::Grid::File::Chunk::DEFAULT_SIZE)
62
62
  end
63
63
 
64
64
  it 'sets the content type' do
65
- expect(metadata.content_type).to eq(Mongo::Grid::File::Metadata::DEFAULT_CONTENT_TYPE)
65
+ expect(info.content_type).to eq(Mongo::Grid::File::Info::DEFAULT_CONTENT_TYPE)
66
66
  end
67
67
  end
68
68
  end
69
69
 
70
70
  describe '#inspect' do
71
71
 
72
- let(:metadata) do
72
+ let(:info) do
73
73
  described_class.new(:filename => 'test.txt', :length => 7)
74
74
  end
75
75
 
76
76
  it 'includes the chunk size' do
77
- expect(metadata.inspect).to include(metadata.chunk_size.to_s)
77
+ expect(info.inspect).to include(info.chunk_size.to_s)
78
78
  end
79
79
 
80
80
  it 'includes the filename' do
81
- expect(metadata.inspect).to include(metadata.filename)
81
+ expect(info.inspect).to include(info.filename)
82
82
  end
83
83
 
84
84
  it 'includes the md5' do
85
- expect(metadata.inspect).to include(metadata.md5.to_s)
85
+ expect(info.inspect).to include(info.md5.to_s)
86
86
  end
87
87
 
88
88
  it 'includes the id' do
89
- expect(metadata.inspect).to include(metadata.id.to_s)
89
+ expect(info.inspect).to include(info.id.to_s)
90
+ end
91
+ end
92
+
93
+ context 'when there are extra options' do
94
+
95
+ let(:info) do
96
+ described_class.new(:filename => 'test.txt', :extra_field => 'extra')
97
+ end
98
+
99
+ it 'does not include them in the document written to the database' do
100
+ expect(info.document['extra_field']).to be_nil
101
+ expect(info.document[:extra_field]).to be_nil
90
102
  end
91
103
  end
92
104
  end
@@ -51,7 +51,7 @@ describe Mongo::Grid::File do
51
51
  (1..data_size).each{ |i| data << '1' }
52
52
  end
53
53
 
54
- context 'when provided data and metadata' do
54
+ context 'when provided data and file information' do
55
55
 
56
56
  let(:file) do
57
57
  described_class.new(data, :filename => 'test.txt')
@@ -118,31 +118,31 @@ describe Mongo::Grid::File do
118
118
  end
119
119
  end
120
120
 
121
- context 'when provided chunks and metadata' do
121
+ context 'when provided chunks and file information' do
122
122
 
123
123
  let(:file_id) do
124
124
  BSON::ObjectId.new
125
125
  end
126
126
 
127
- let(:metadata) do
127
+ let(:info) do
128
128
  BSON::Document.new(
129
129
  :_id => file_id,
130
130
  :uploadDate => Time.now.utc,
131
131
  :filename => 'test.txt',
132
132
  :chunkSize => Mongo::Grid::File::Chunk::DEFAULT_SIZE,
133
133
  :length => data.length,
134
- :contentType => Mongo::Grid::File::Metadata::DEFAULT_CONTENT_TYPE
134
+ :contentType => Mongo::Grid::File::Info::DEFAULT_CONTENT_TYPE
135
135
  )
136
136
  end
137
137
 
138
138
  let(:chunks) do
139
139
  Mongo::Grid::File::Chunk.split(
140
- data, Mongo::Grid::File::Metadata.new(metadata)
140
+ data, Mongo::Grid::File::Info.new(info)
141
141
  ).map{ |chunk| chunk.document }
142
142
  end
143
143
 
144
144
  let(:file) do
145
- described_class.new(chunks, metadata)
145
+ described_class.new(chunks, info)
146
146
  end
147
147
 
148
148
  it 'sets the chunks' do
@@ -153,8 +153,8 @@ describe Mongo::Grid::File do
153
153
  expect(file.data).to eq(data)
154
154
  end
155
155
 
156
- it 'sets the metadata' do
157
- expect(file.metadata.id).to eq(metadata[:_id])
156
+ it 'sets the file information' do
157
+ expect(file.info.id).to eq(info[:_id])
158
158
  end
159
159
  end
160
160
  end