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,48 @@
1
+ require 'spec_helper'
2
+
3
+ describe Mongo::Grid::FSBucket::Stream do
4
+
5
+ let(:fs) do
6
+ authorized_client.database.fs
7
+ end
8
+
9
+ describe '.get' do
10
+
11
+ let(:stream) do
12
+ described_class.get(fs, mode)
13
+ end
14
+
15
+ context 'when mode is read' do
16
+
17
+ let(:mode) do
18
+ Mongo::Grid::FSBucket::Stream::READ_MODE
19
+ end
20
+
21
+ it 'returns a Stream::Read object' do
22
+ expect(stream).to be_a(Mongo::Grid::FSBucket::Stream::Read)
23
+ end
24
+ end
25
+
26
+ context 'when mode is write' do
27
+
28
+ let(:mode) do
29
+ Mongo::Grid::FSBucket::Stream::WRITE_MODE
30
+ end
31
+
32
+ it 'returns a Stream::Write object' do
33
+ expect(stream).to be_a(Mongo::Grid::FSBucket::Stream::Write)
34
+ end
35
+
36
+ context 'when options are provided' do
37
+
38
+ let(:stream) do
39
+ described_class.get(fs, mode, chunk_size: 100)
40
+ end
41
+
42
+ it 'sets the options on the stream object' do
43
+ expect(stream.options[:chunk_size]).to eq(100)
44
+ end
45
+ end
46
+ end
47
+ end
48
+ end
@@ -0,0 +1,50 @@
1
+ require 'spec_helper'
2
+
3
+ describe 'GridFS' do
4
+ include Mongo::GridFS
5
+
6
+ GRIDFS_TESTS.each do |file|
7
+
8
+ spec = Mongo::GridFS::Spec.new(file)
9
+
10
+ context(spec.description) do
11
+
12
+ spec.tests.each do |test|
13
+
14
+ context(test.description) do
15
+
16
+ after do
17
+ fs.files_collection.delete_many
18
+ fs.chunks_collection.delete_many
19
+ test.expected_files_collection.delete_many
20
+ test.expected_chunks_collection.delete_many
21
+ end
22
+
23
+ let!(:result) do
24
+ test.run(fs)
25
+ end
26
+
27
+ let(:fs) do
28
+ authorized_collection.database.fs
29
+ end
30
+
31
+ it "raises the correct error", if: test.error? do
32
+ expect(result).to match_error(test.expected_error)
33
+ end
34
+
35
+ it 'completes successfully', unless: test.error? do
36
+ expect(result).to completes_successfully(test)
37
+ end
38
+
39
+ it 'has the correct documents in the files collection', if: test.assert_data? do
40
+ expect(fs.files_collection).to match_files_collection(test.expected_files_collection)
41
+ end
42
+
43
+ it 'has the correct documents in the chunks collection', if: test.assert_data? do
44
+ expect(fs.chunks_collection).to match_chunks_collection(test.expected_chunks_collection)
45
+ end
46
+ end
47
+ end
48
+ end
49
+ end
50
+ end
@@ -6,38 +6,6 @@ describe Mongo::Logger do
6
6
  described_class.logger
7
7
  end
8
8
 
9
- describe '.debug' do
10
-
11
- it 'logs a debug message' do
12
- expect(logger).to receive(:debug).with("mongo.query | message | runtime: 10ms")
13
- described_class.debug('mongo.query', 'message', '10ms')
14
- end
15
- end
16
-
17
- describe '.error' do
18
-
19
- it 'logs a error message' do
20
- expect(logger).to receive(:error).with("mongo.query | message | runtime: 10ms")
21
- described_class.error('mongo.query', 'message', '10ms')
22
- end
23
- end
24
-
25
- describe '.fatal' do
26
-
27
- it 'logs a fatal message' do
28
- expect(logger).to receive(:fatal).with("mongo.query | message | runtime: 10ms")
29
- described_class.fatal('mongo.query', 'message', '10ms')
30
- end
31
- end
32
-
33
- describe '.info' do
34
-
35
- it 'logs a info message' do
36
- expect(logger).to receive(:info).with("mongo.query | message | runtime: 10ms")
37
- described_class.info('mongo.query', 'message', '10ms')
38
- end
39
- end
40
-
41
9
  describe '.logger' do
42
10
 
43
11
  context 'when no logger has been set' do
@@ -86,12 +54,4 @@ describe Mongo::Logger do
86
54
  end
87
55
  end
88
56
  end
89
-
90
- describe '.warn' do
91
-
92
- it 'logs a warn message' do
93
- expect(logger).to receive(:warn).with("mongo.query | message | runtime: 10ms")
94
- described_class.warn('mongo.query', 'message', '10ms')
95
- end
96
- end
97
57
  end
@@ -0,0 +1,76 @@
1
+ require 'spec_helper'
2
+
3
+ describe Mongo::Monitoring::CommandLogSubscriber do
4
+
5
+ describe '#started' do
6
+
7
+ let(:filter) do
8
+ (1...100).reduce({}) do |hash, i|
9
+ hash[i] = i
10
+ hash
11
+ end
12
+ end
13
+
14
+ let(:command) do
15
+ { find: 'users', filter: filter }
16
+ end
17
+
18
+ let(:event) do
19
+ Mongo::Monitoring::Event::CommandStarted.new(
20
+ 'find',
21
+ 'users',
22
+ Mongo::Address.new('127.0.0.1:27017'),
23
+ 12345,
24
+ 67890,
25
+ command
26
+ )
27
+ end
28
+
29
+ before do
30
+ Mongo::Logger.level = Logger::DEBUG
31
+ end
32
+
33
+ after do
34
+ Mongo::Logger.level = Logger::INFO
35
+ end
36
+
37
+ context 'when truncating the logs' do
38
+
39
+ context 'when no option is provided' do
40
+
41
+ let(:subscriber) do
42
+ described_class.new
43
+ end
44
+
45
+ it 'truncates the logs at 250 characters' do
46
+ expect(subscriber).to receive(:truncate).with(command).and_call_original
47
+ subscriber.started(event)
48
+ end
49
+ end
50
+
51
+ context 'when true option is provided' do
52
+
53
+ let(:subscriber) do
54
+ described_class.new(truncate_logs: true)
55
+ end
56
+
57
+ it 'truncates the logs at 250 characters' do
58
+ expect(subscriber).to receive(:truncate).with(command).and_call_original
59
+ subscriber.started(event)
60
+ end
61
+ end
62
+ end
63
+
64
+ context 'when not truncating the logs' do
65
+
66
+ let(:subscriber) do
67
+ described_class.new(truncate_logs: false)
68
+ end
69
+
70
+ it 'does not truncate the logs' do
71
+ expect(subscriber).to_not receive(:truncate)
72
+ subscriber.started(event)
73
+ end
74
+ end
75
+ end
76
+ end
@@ -0,0 +1,26 @@
1
+ require 'spec_helper'
2
+
3
+ describe Mongo::Monitoring::Event::CommandStarted do
4
+
5
+ describe '#initialize' do
6
+
7
+ let(:address) do
8
+ Mongo::Address.new('127.0.0.1:27017')
9
+ end
10
+
11
+ let(:command) do
12
+ BSON::Document.new(test: 'value')
13
+ end
14
+
15
+ context 'when the command should be redacted' do
16
+
17
+ let(:event) do
18
+ described_class.new('copydb', 'admin', address, 1, 2, command)
19
+ end
20
+
21
+ it 'sets the command to an empty document' do
22
+ expect(event.command).to be_empty
23
+ end
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,26 @@
1
+ require 'spec_helper'
2
+
3
+ describe Mongo::Monitoring::Event::CommandSucceeded do
4
+
5
+ describe '#initialize' do
6
+
7
+ let(:address) do
8
+ Mongo::Address.new('127.0.0.1:27017')
9
+ end
10
+
11
+ let(:reply) do
12
+ BSON::Document.new(test: 'value')
13
+ end
14
+
15
+ context 'when the reply should be redacted' do
16
+
17
+ let(:event) do
18
+ described_class.new('copydb', 'admin', address, 1, 2, reply, 0.5)
19
+ end
20
+
21
+ it 'sets the reply to an empty document' do
22
+ expect(event.reply).to be_empty
23
+ end
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,57 @@
1
+ require 'spec_helper'
2
+
3
+ describe Mongo::Monitoring::Event::Secure do
4
+
5
+ let(:document) do
6
+ BSON::Document.new(test: 'value')
7
+ end
8
+
9
+ let(:klass) do
10
+ Class.new do
11
+ include Mongo::Monitoring::Event::Secure
12
+ end
13
+ end
14
+
15
+ describe '#redacted' do
16
+
17
+ let(:secure) do
18
+ klass.new
19
+ end
20
+
21
+ context 'when the command must be redacted' do
22
+
23
+ context 'when the command name is a string' do
24
+
25
+ let(:redacted) do
26
+ secure.redacted('saslStart', document)
27
+ end
28
+
29
+ it 'returns an empty document' do
30
+ expect(redacted).to be_empty
31
+ end
32
+ end
33
+
34
+ context 'when the command name is a symbol' do
35
+
36
+ let(:redacted) do
37
+ secure.redacted(:saslStart, document)
38
+ end
39
+
40
+ it 'returns an empty document' do
41
+ expect(redacted).to be_empty
42
+ end
43
+ end
44
+ end
45
+
46
+ context 'when the command is not in the redacted list' do
47
+
48
+ let(:redacted) do
49
+ secure.redacted(:find, document)
50
+ end
51
+
52
+ it 'returns the document' do
53
+ expect(redacted).to eq(document)
54
+ end
55
+ end
56
+ end
57
+ end
@@ -0,0 +1,168 @@
1
+ require 'spec_helper'
2
+
3
+ describe Mongo::Monitoring do
4
+
5
+ describe '#dup' do
6
+
7
+ let(:monitoring) do
8
+ described_class.new
9
+ end
10
+
11
+ let(:copy) do
12
+ monitoring.dup
13
+ end
14
+
15
+ it 'dups the subscribers' do
16
+ expect(monitoring.subscribers).to_not equal(copy.subscribers)
17
+ end
18
+
19
+ it 'keeps the same subscriber instances' do
20
+ expect(monitoring.subscribers).to eq(copy.subscribers)
21
+ end
22
+
23
+ context 'when adding to the copy' do
24
+
25
+ let(:subscriber) do
26
+ double('subscriber')
27
+ end
28
+
29
+ before do
30
+ copy.subscribe('topic', subscriber)
31
+ end
32
+
33
+ it 'does not modify the original subscribers' do
34
+ expect(monitoring.subscribers).to_not eq(copy.subscribers)
35
+ end
36
+ end
37
+ end
38
+
39
+ describe '#initialize' do
40
+
41
+ context 'when no monitoring options provided' do
42
+
43
+ let(:monitoring) do
44
+ described_class.new
45
+ end
46
+
47
+ it 'includes the global subscribers' do
48
+ expect(monitoring.subscribers.size).to eq(1)
49
+ end
50
+ end
51
+
52
+ context 'when monitoring options provided' do
53
+
54
+ context 'when monitoring is true' do
55
+
56
+ let(:monitoring) do
57
+ described_class.new(monitoring: true)
58
+ end
59
+
60
+ it 'includes the global subscribers' do
61
+ expect(monitoring.subscribers.size).to eq(1)
62
+ end
63
+ end
64
+
65
+ context 'when monitoring is false' do
66
+
67
+ let(:monitoring) do
68
+ described_class.new(monitoring: false)
69
+ end
70
+
71
+ it 'does not include the global subscribers' do
72
+ expect(monitoring.subscribers).to be_empty
73
+ end
74
+ end
75
+ end
76
+ end
77
+
78
+ describe '#subscribe' do
79
+
80
+ let(:monitoring) do
81
+ described_class.new(monitoring: false)
82
+ end
83
+
84
+ let(:subscriber) do
85
+ double('subscriber')
86
+ end
87
+
88
+ before do
89
+ monitoring.subscribe('topic', subscriber)
90
+ end
91
+
92
+ it 'subscribes to the topic' do
93
+ expect(monitoring.subscribers['topic']).to eq([ subscriber ])
94
+ end
95
+ end
96
+
97
+ describe '#started' do
98
+
99
+ let(:monitoring) do
100
+ described_class.new(monitoring: false)
101
+ end
102
+
103
+ let(:subscriber) do
104
+ double('subscriber')
105
+ end
106
+
107
+ let(:event) do
108
+ double('event')
109
+ end
110
+
111
+ before do
112
+ monitoring.subscribe('topic', subscriber)
113
+ end
114
+
115
+ it 'calls the started method on each subscriber' do
116
+ expect(subscriber).to receive(:started).with(event)
117
+ monitoring.started('topic', event)
118
+ end
119
+ end
120
+
121
+ describe '#succeeded' do
122
+
123
+ let(:monitoring) do
124
+ described_class.new(monitoring: false)
125
+ end
126
+
127
+ let(:subscriber) do
128
+ double('subscriber')
129
+ end
130
+
131
+ let(:event) do
132
+ double('event')
133
+ end
134
+
135
+ before do
136
+ monitoring.subscribe('topic', subscriber)
137
+ end
138
+
139
+ it 'calls the succeeded method on each subscriber' do
140
+ expect(subscriber).to receive(:succeeded).with(event)
141
+ monitoring.succeeded('topic', event)
142
+ end
143
+ end
144
+
145
+ describe '#failed' do
146
+
147
+ let(:monitoring) do
148
+ described_class.new(monitoring: false)
149
+ end
150
+
151
+ let(:subscriber) do
152
+ double('subscriber')
153
+ end
154
+
155
+ let(:event) do
156
+ double('event')
157
+ end
158
+
159
+ before do
160
+ monitoring.subscribe('topic', subscriber)
161
+ end
162
+
163
+ it 'calls the failed method on each subscriber' do
164
+ expect(subscriber).to receive(:failed).with(event)
165
+ monitoring.failed('topic', event)
166
+ end
167
+ end
168
+ end
@@ -0,0 +1,69 @@
1
+ require 'spec_helper'
2
+
3
+ describe Mongo::Operation::Aggregate do
4
+ include_context 'operation'
5
+
6
+ let(:selector) do
7
+ { :aggregate => coll_name,
8
+ :pipeline => [],
9
+ }
10
+ end
11
+ let(:spec) do
12
+ { :selector => selector,
13
+ :options => {},
14
+ :db_name => db_name
15
+ }
16
+ end
17
+ let(:op) { described_class.new(spec) }
18
+
19
+
20
+ describe '#initialize' do
21
+
22
+ context 'spec' do
23
+
24
+ it 'sets the spec' do
25
+ expect(op.spec).to be(spec)
26
+ end
27
+ end
28
+ end
29
+
30
+ describe '#==' do
31
+
32
+ context ' when two ops have different specs' do
33
+ let(:other_selector) do
34
+ { :aggregate => 'another_test_coll',
35
+ :pipeline => [],
36
+ }
37
+ end
38
+ let(:other_spec) do
39
+ { :selector => other_selector,
40
+ :options => options,
41
+ :db_name => db_name,
42
+ }
43
+ end
44
+ let(:other) { described_class.new(other_spec) }
45
+
46
+ it 'returns false' do
47
+ expect(op).not_to eq(other)
48
+ end
49
+ end
50
+ end
51
+
52
+ describe '#execute' do
53
+
54
+ context 'when the aggregation fails' do
55
+
56
+ let(:selector) do
57
+ { :aggregate => coll_name,
58
+ :pipeline => [{ '$invalid' => 'operator' }],
59
+ }
60
+ end
61
+
62
+ it 'raises an exception' do
63
+ expect {
64
+ op.execute(authorized_primary.context)
65
+ }.to raise_error(Mongo::Error::OperationFailure)
66
+ end
67
+ end
68
+ end
69
+ end
@@ -1,6 +1,6 @@
1
1
  require 'spec_helper'
2
2
 
3
- describe Mongo::Operation::Read::CollectionsInfo do
3
+ describe Mongo::Operation::CollectionsInfo do
4
4
 
5
5
  let(:spec) do
6
6
  { :db_name => TEST_DB }
@@ -38,24 +38,6 @@ describe Mongo::Operation::Command do
38
38
  end
39
39
  end
40
40
 
41
- context '#merge' do
42
-
43
- let(:other_op) { described_class.new(spec) }
44
-
45
- it 'raises an exception' do
46
- expect{ op.merge(other_op) }.to raise_exception
47
- end
48
- end
49
-
50
- context '#merge!' do
51
-
52
- let(:other_op) { described_class.new(spec) }
53
-
54
- it 'raises an exception' do
55
- expect{ op.merge!(other_op) }.to raise_exception
56
- end
57
- end
58
-
59
41
  describe '#execute' do
60
42
 
61
43
  context 'when the command succeeds' do
@@ -1,6 +1,6 @@
1
1
  require 'spec_helper'
2
2
 
3
- describe Mongo::Operation::Read::Indexes do
3
+ describe Mongo::Operation::Indexes do
4
4
 
5
5
  describe '#execute' do
6
6
 
@@ -77,24 +77,6 @@ describe Mongo::Operation::MapReduce do
77
77
  end
78
78
  end
79
79
 
80
- describe '#merge' do
81
-
82
- let(:other_op) { described_class.new(spec) }
83
-
84
- it 'is not allowed' do
85
- expect{ op.merge(other_op) }.to raise_exception
86
- end
87
- end
88
-
89
- describe '#merge!' do
90
-
91
- let(:other_op) { described_class.new(spec) }
92
-
93
- it 'is not allowed' do
94
- expect{ op.merge!(other_op) }.to raise_exception
95
- end
96
- end
97
-
98
80
  describe '#execute' do
99
81
 
100
82
  let(:documents) do
@@ -109,7 +91,7 @@ describe Mongo::Operation::MapReduce do
109
91
  end
110
92
 
111
93
  after do
112
- authorized_collection.find.delete_many
94
+ authorized_collection.delete_many
113
95
  end
114
96
 
115
97
  context 'when the map/reduce succeeds' do
@@ -27,28 +27,12 @@ describe Mongo::Operation::KillCursors do
27
27
  end
28
28
  end
29
29
 
30
- context '#merge' do
31
- let(:other_op) { described_class.new(spec) }
32
-
33
- it 'is not allowed' do
34
- expect{ op.merge(other_op) }.to raise_exception
35
- end
36
- end
37
-
38
- context '#merge!' do
39
- let(:other_op) { described_class.new(spec) }
40
-
41
- it 'is not allowed' do
42
- expect{ op.merge!(other_op) }.to raise_exception
43
- end
44
- end
45
-
46
30
  describe '#execute' do
47
31
 
48
32
  context 'message' do
49
33
 
50
34
  it 'creates a kill cursors wire protocol message with correct specs' do
51
- expect(Mongo::Protocol::KillCursors).to receive(:new) do |ids|
35
+ expect(Mongo::Protocol::KillCursors).to receive(:new) do |collection, database, ids|
52
36
  expect(ids).to eq(spec[:cursor_ids])
53
37
  end
54
38
  op.execute(primary_context)
@@ -39,22 +39,6 @@ describe Mongo::Operation::Read::GetMore do
39
39
  end
40
40
  end
41
41
 
42
- context '#merge' do
43
- let(:other_op) { described_class.new(spec) }
44
-
45
- it 'is not allowed' do
46
- expect{ op.merge(other_op) }.to raise_exception
47
- end
48
- end
49
-
50
- context '#merge!' do
51
- let(:other_op) { described_class.new(spec) }
52
-
53
- it 'is not allowed' do
54
- expect{ op.merge!(other_op) }.to raise_exception
55
- end
56
- end
57
-
58
42
  describe '#execute' do
59
43
 
60
44
  context 'message' do