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
@@ -48,7 +48,7 @@ describe Mongo::Collection::View::MapReduce do
48
48
  end
49
49
 
50
50
  after do
51
- authorized_collection.find.delete_many
51
+ authorized_collection.delete_many
52
52
  end
53
53
 
54
54
  let(:map_reduce) do
@@ -66,6 +66,39 @@ describe Mongo::Collection::View::MapReduce do
66
66
  end
67
67
  end
68
68
 
69
+ context 'when out is in the options' do
70
+
71
+ after do
72
+ authorized_client['output_collection'].delete_many
73
+ end
74
+
75
+ context 'when out is a string' do
76
+
77
+ let(:options) do
78
+ { :out => 'output_collection' }
79
+ end
80
+
81
+ it 'iterates over the documents in the result' do
82
+ map_reduce.each do |document|
83
+ expect(document[:value]).to_not be_nil
84
+ end
85
+ end
86
+ end
87
+
88
+ context 'when out is a document' do
89
+
90
+ let(:options) do
91
+ { :out => { replace: 'output_collection' } }
92
+ end
93
+
94
+ it 'iterates over the documents in the result' do
95
+ map_reduce.each do |document|
96
+ expect(document[:value]).to_not be_nil
97
+ end
98
+ end
99
+ end
100
+ end
101
+
69
102
  context 'when out is inline' do
70
103
 
71
104
  let(:new_map_reduce) do
@@ -82,7 +115,7 @@ describe Mongo::Collection::View::MapReduce do
82
115
  context 'when out is a collection' do
83
116
 
84
117
  after do
85
- authorized_client['output_collection'].find.delete_many
118
+ authorized_client['output_collection'].delete_many
86
119
  end
87
120
 
88
121
  context 'when the option is to replace' do
@@ -135,6 +168,17 @@ describe Mongo::Collection::View::MapReduce do
135
168
  expect(new_map_reduce.count).to eq(2)
136
169
  end
137
170
  end
171
+
172
+ context 'when the option is a collection name' do
173
+
174
+ let(:new_map_reduce) do
175
+ map_reduce.out('output_collection')
176
+ end
177
+
178
+ it 'fetches the results from the collection' do
179
+ expect(new_map_reduce.count).to eq(2)
180
+ end
181
+ end
138
182
  end
139
183
 
140
184
  context 'when the view has a selector' do
@@ -169,7 +213,7 @@ describe Mongo::Collection::View::MapReduce do
169
213
  end
170
214
 
171
215
  it 'includes the selector in the operation spec' do
172
- expect(map_reduce.send(:map_reduce_spec)[:selector][:query]).to eq(selector[:$query])
216
+ expect(map_reduce.send(:map_reduce_spec)[:selector][:query]).to eq(BSON::Document.new(selector[:$query]))
173
217
  end
174
218
  end
175
219
  end
@@ -250,6 +294,57 @@ describe Mongo::Collection::View::MapReduce do
250
294
  expect(map_reduce.send(:map_reduce_spec)[:selector][:out]).to eq(inline: 1)
251
295
  end
252
296
  end
297
+
298
+ context 'when out is specified in the options' do
299
+
300
+ let(:location) do
301
+ { replace: 'testing' }
302
+ end
303
+
304
+ let(:options) do
305
+ { :out => location }
306
+ end
307
+
308
+ it 'sets the out value' do
309
+ expect(map_reduce.out).to eq(location)
310
+ end
311
+
312
+ it 'includes the out value in the operation spec' do
313
+ expect(map_reduce.send(:map_reduce_spec)[:selector][:out]).to be(location)
314
+ end
315
+ end
316
+
317
+ context 'when out is not inline' do
318
+
319
+ let(:location) do
320
+ { replace: 'testing' }
321
+ end
322
+
323
+ let(:options) do
324
+ { :out => location }
325
+ end
326
+
327
+ it 'does not allow the operation on a secondary' do
328
+ expect(map_reduce.send(:secondary_ok?)).to be(false)
329
+ end
330
+
331
+ context 'when the context is not a valid server for writing' do
332
+
333
+ it 'reroutes the operation to a primary' do
334
+ allow(map_reduce).to receive(:valid_server?).and_return(false)
335
+ expect(Mongo::Logger.logger).to receive(:warn?).and_call_original
336
+ map_reduce.to_a
337
+ end
338
+ end
339
+
340
+ context 'when the context is a valid server for writing' do
341
+
342
+ it 'does not reroute the operation to a primary' do
343
+ expect(Mongo::Logger.logger).not_to receive(:warn?)
344
+ map_reduce.to_a
345
+ end
346
+ end
347
+ end
253
348
  end
254
349
 
255
350
  describe '#scope' do
@@ -316,7 +411,7 @@ describe Mongo::Collection::View::MapReduce do
316
411
  end
317
412
 
318
413
  it 'includes the sort object in the operation spec' do
319
- expect(map_reduce.send(:map_reduce_spec)[:selector][:sort]).to be(sort)
414
+ expect(map_reduce.send(:map_reduce_spec)[:selector][:sort][:name]).to eq(sort[:name])
320
415
  end
321
416
  end
322
417
 
@@ -15,7 +15,7 @@ describe Mongo::Collection::View::Readable do
15
15
  end
16
16
 
17
17
  after do
18
- authorized_collection.find.delete_many
18
+ authorized_collection.delete_many
19
19
  end
20
20
 
21
21
  describe '#allow_partial_results' do
@@ -75,6 +75,21 @@ describe Mongo::Collection::View::Readable do
75
75
  end
76
76
  end
77
77
  end
78
+
79
+ context 'when options are specified' do
80
+
81
+ let(:agg_options) do
82
+ { :max_time_ms => 500 }
83
+ end
84
+
85
+ let(:aggregation) do
86
+ view.aggregate(pipeline, agg_options)
87
+ end
88
+
89
+ it 'passes the option to the Aggregation object' do
90
+ expect(aggregation.options[:max_time_ms]).to eq(agg_options[:max_time_ms])
91
+ end
92
+ end
78
93
  end
79
94
 
80
95
  describe '#map_reduce' do
@@ -200,7 +215,7 @@ describe Mongo::Collection::View::Readable do
200
215
  end
201
216
 
202
217
  after do
203
- authorized_collection.find.delete_many
218
+ authorized_collection.delete_many
204
219
  end
205
220
 
206
221
  context 'when a selector is provided' do
@@ -224,6 +239,16 @@ describe Mongo::Collection::View::Readable do
224
239
  it 'takes a read preference option' do
225
240
  expect(view.count(read: { mode: :secondary })).to eq(10)
226
241
  end
242
+
243
+ it 'takes a max_time_ms option', if: write_command_enabled? do
244
+ expect {
245
+ view.count(max_time_ms: 0.1)
246
+ }.to raise_error(Mongo::Error::OperationFailure)
247
+ end
248
+
249
+ it 'sets the max_time_ms option on the command', if: write_command_enabled? do
250
+ expect(view.count(max_time_ms: 100)).to eq(10)
251
+ end
227
252
  end
228
253
 
229
254
  describe '#distinct' do
@@ -338,6 +363,27 @@ describe Mongo::Collection::View::Readable do
338
363
  expect(distinct).to eq([ 'test1', 'test2', 'test3' ])
339
364
  end
340
365
  end
366
+
367
+ context 'when a max_time_ms is specified', if: write_command_enabled? do
368
+
369
+ let(:documents) do
370
+ (1..3).map{ |i| { field: "test" }}
371
+ end
372
+
373
+ before do
374
+ authorized_collection.insert_many(documents)
375
+ end
376
+
377
+ it 'sets the max_time_ms option on the command' do
378
+ expect {
379
+ view.distinct(:field, max_time_ms: 0.1)
380
+ }.to raise_error(Mongo::Error::OperationFailure)
381
+ end
382
+
383
+ it 'sets the max_time_ms option on the command' do
384
+ expect(view.distinct(:field, max_time_ms: 100)).to eq([ 'test' ])
385
+ end
386
+ end
341
387
  end
342
388
 
343
389
  describe '#hint' do
@@ -419,6 +465,28 @@ describe Mongo::Collection::View::Readable do
419
465
  end
420
466
  end
421
467
 
468
+ describe '#max_value' do
469
+
470
+ let(:new_view) do
471
+ view.max_value(_id: 1)
472
+ end
473
+
474
+ it 'sets the value in the options' do
475
+ expect(new_view.max_value).to eq('_id' => 1)
476
+ end
477
+ end
478
+
479
+ describe '#min_value' do
480
+
481
+ let(:new_view) do
482
+ view.min_value(_id: 1)
483
+ end
484
+
485
+ it 'sets the value in the options' do
486
+ expect(new_view.min_value).to eq('_id' => 1)
487
+ end
488
+ end
489
+
422
490
  describe '#no_cursor_timeout' do
423
491
 
424
492
  let(:new_view) do
@@ -479,6 +547,15 @@ describe Mongo::Collection::View::Readable do
479
547
 
480
548
  describe '#read' do
481
549
 
550
+ context 'when providing a hash' do
551
+
552
+ it 'converts to a read preference' do
553
+ expect(view.read(:mode => :primary_preferred).read).to be_a(
554
+ Mongo::ServerSelector::PrimaryPreferred
555
+ )
556
+ end
557
+ end
558
+
482
559
  context 'when a read pref is specified' do
483
560
 
484
561
  let(:options) do
@@ -524,12 +601,91 @@ describe Mongo::Collection::View::Readable do
524
601
 
525
602
  describe '#show_disk_loc' do
526
603
 
527
- let(:new_view) do
528
- view.show_disk_loc(true)
604
+ let(:options) do
605
+ { :show_disk_loc => true }
529
606
  end
530
607
 
531
- it 'sets the value in the options' do
532
- expect(new_view.show_disk_loc).to be true
608
+ context 'when show_disk_loc is specified' do
609
+
610
+ let(:new_show_disk_loc) do
611
+ false
612
+ end
613
+
614
+ it 'sets the show_disk_loc value' do
615
+ new_view = view.show_disk_loc(new_show_disk_loc)
616
+ expect(new_view.show_disk_loc).to eq(new_show_disk_loc)
617
+ end
618
+
619
+ it 'returns a new View' do
620
+ expect(view.show_disk_loc(new_show_disk_loc)).not_to be(view)
621
+ end
622
+ end
623
+
624
+ context 'when show_disk_loc is not specified' do
625
+
626
+ it 'returns the show_disk_loc value' do
627
+ expect(view.show_disk_loc).to eq(options[:show_disk_loc])
628
+ end
629
+ end
630
+ end
631
+
632
+ describe '#modifiers' do
633
+
634
+ let(:options) do
635
+ { :modifiers => { :$orderby => Mongo::Index::ASCENDING } }
636
+ end
637
+
638
+ context 'when a modifiers document is specified' do
639
+
640
+ let(:new_modifiers) do
641
+ { :modifiers => { :$orderby => Mongo::Index::DESCENDING } }
642
+ end
643
+
644
+ it 'sets the new_modifiers document' do
645
+ new_view = view.modifiers(new_modifiers)
646
+ expect(new_view.modifiers).to eq(new_modifiers)
647
+ end
648
+
649
+ it 'returns a new View' do
650
+ expect(view.modifiers(new_modifiers)).not_to be(view)
651
+ end
652
+ end
653
+
654
+ context 'when a modifiers document is not specified' do
655
+
656
+ it 'returns the modifiers value' do
657
+ expect(view.modifiers).to eq(options[:modifiers])
658
+ end
659
+ end
660
+ end
661
+
662
+ describe '#max_time_ms' do
663
+
664
+ let(:options) do
665
+ { :max_time_ms => 200 }
666
+ end
667
+
668
+ context 'when max_time_ms is specified' do
669
+
670
+ let(:new_max_time_ms) do
671
+ 300
672
+ end
673
+
674
+ it 'sets the max_time_ms value' do
675
+ new_view = view.max_time_ms(new_max_time_ms)
676
+ expect(new_view.max_time_ms).to eq(new_max_time_ms)
677
+ end
678
+
679
+ it 'returns a new View' do
680
+ expect(view.max_time_ms(new_max_time_ms)).not_to be(view)
681
+ end
682
+ end
683
+
684
+ context 'when max_time_ms is not specified' do
685
+
686
+ it 'returns the max_time_ms value' do
687
+ expect(view.max_time_ms).to eq(options[:max_time_ms])
688
+ end
533
689
  end
534
690
  end
535
691
 
@@ -610,5 +766,81 @@ describe Mongo::Collection::View::Readable do
610
766
  expect(view.sort).to eq(options[:sort])
611
767
  end
612
768
  end
769
+
770
+ context 'when an option is a cursor flag' do
771
+
772
+ let(:query_spec_options) do
773
+ view.send(:query_spec)[:options]
774
+ end
775
+
776
+ context 'when allow_partial_results is set as an option' do
777
+
778
+ let(:options) do
779
+ { :allow_partial_results => true }
780
+ end
781
+
782
+ it 'sets the cursor flag' do
783
+ expect(query_spec_options[:flags]).to eq([:partial])
784
+ end
785
+
786
+ context 'when allow_partial_results is also called as a method' do
787
+
788
+ before do
789
+ view.allow_partial_results
790
+ end
791
+
792
+ it 'sets only one cursor flag' do
793
+ expect(query_spec_options[:flags]).to eq([:partial])
794
+ end
795
+ end
796
+ end
797
+
798
+ context 'when oplog_replay is set as an option' do
799
+
800
+ let(:options) do
801
+ { :oplog_replay => true }
802
+ end
803
+
804
+ it 'sets the cursor flag' do
805
+ expect(query_spec_options[:flags]).to eq([:oplog_replay])
806
+ end
807
+ end
808
+
809
+ context 'when no_cursor_timeout is set as an option' do
810
+
811
+ let(:options) do
812
+ { :no_cursor_timeout => true }
813
+ end
814
+
815
+ it 'sets the cursor flag' do
816
+ expect(query_spec_options[:flags]).to eq([:no_cursor_timeout])
817
+ end
818
+ end
819
+
820
+ context 'when cursor_type is set as an option' do
821
+
822
+ context 'when :tailable is the cursor type' do
823
+
824
+ let(:options) do
825
+ { :cursor_type => :tailable }
826
+ end
827
+
828
+ it 'sets the cursor flag' do
829
+ expect(query_spec_options[:flags]).to eq([:tailable_cursor])
830
+ end
831
+ end
832
+
833
+ context 'when :tailable_await is the cursor type' do
834
+
835
+ let(:options) do
836
+ { :cursor_type => :tailable_await }
837
+ end
838
+
839
+ it 'sets the cursor flags' do
840
+ expect(query_spec_options[:flags]).to eq([:await_data, :tailable_cursor])
841
+ end
842
+ end
843
+ end
844
+ end
613
845
  end
614
846
  end
@@ -15,7 +15,7 @@ describe Mongo::Collection::View::Writable do
15
15
  end
16
16
 
17
17
  after do
18
- authorized_collection.find.delete_many
18
+ authorized_collection.delete_many
19
19
  end
20
20
 
21
21
  describe '#find_one_and_delete' do
@@ -456,11 +456,11 @@ describe Mongo::Collection::View::Writable do
456
456
  context 'when a selector was provided' do
457
457
 
458
458
  let(:selector) do
459
- { field: 'test1' }
459
+ { field: 'test' }
460
460
  end
461
461
 
462
462
  before do
463
- authorized_collection.insert_many([{ field: 'test1' }, { field: 'test2' }])
463
+ authorized_collection.insert_many([{ field: 'test' }, { field: 'test' }])
464
464
  end
465
465
 
466
466
  let!(:response) do
@@ -472,7 +472,7 @@ describe Mongo::Collection::View::Writable do
472
472
  end
473
473
 
474
474
  it 'returns the number updated' do
475
- expect(response.written_count).to eq(1)
475
+ expect(response.written_count).to eq(2)
476
476
  end
477
477
 
478
478
  it 'updates the documents in the collection' do