mongo 2.2.7 → 2.3.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 (266) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data.tar.gz.sig +0 -0
  4. data/LICENSE +1 -1
  5. data/README.md +1 -1
  6. data/Rakefile +1 -1
  7. data/lib/mongo.rb +1 -1
  8. data/lib/mongo/address.rb +1 -1
  9. data/lib/mongo/address/ipv4.rb +1 -1
  10. data/lib/mongo/address/ipv6.rb +1 -1
  11. data/lib/mongo/address/unix.rb +1 -1
  12. data/lib/mongo/auth.rb +1 -1
  13. data/lib/mongo/auth/cr.rb +1 -1
  14. data/lib/mongo/auth/ldap.rb +1 -1
  15. data/lib/mongo/auth/roles.rb +1 -1
  16. data/lib/mongo/auth/user.rb +1 -1
  17. data/lib/mongo/auth/user/view.rb +5 -5
  18. data/lib/mongo/auth/x509.rb +1 -1
  19. data/lib/mongo/bson.rb +1 -1
  20. data/lib/mongo/bulk_write.rb +4 -4
  21. data/lib/mongo/bulk_write/combineable.rb +1 -1
  22. data/lib/mongo/bulk_write/ordered_combiner.rb +1 -1
  23. data/lib/mongo/bulk_write/result.rb +1 -1
  24. data/lib/mongo/bulk_write/result_combiner.rb +1 -1
  25. data/lib/mongo/bulk_write/transformable.rb +1 -1
  26. data/lib/mongo/bulk_write/unordered_combiner.rb +1 -1
  27. data/lib/mongo/bulk_write/validatable.rb +1 -1
  28. data/lib/mongo/client.rb +2 -2
  29. data/lib/mongo/cluster.rb +15 -3
  30. data/lib/mongo/cluster/cursor_reaper.rb +174 -0
  31. data/lib/mongo/cluster/topology.rb +1 -1
  32. data/lib/mongo/cluster/topology/replica_set.rb +1 -1
  33. data/lib/mongo/cluster/topology/sharded.rb +1 -1
  34. data/lib/mongo/cluster/topology/single.rb +1 -1
  35. data/lib/mongo/cluster/topology/unknown.rb +1 -1
  36. data/lib/mongo/collection.rb +5 -4
  37. data/lib/mongo/collection/view.rb +4 -4
  38. data/lib/mongo/collection/view/aggregation.rb +2 -2
  39. data/lib/mongo/collection/view/builder.rb +1 -1
  40. data/lib/mongo/collection/view/builder/aggregation.rb +1 -1
  41. data/lib/mongo/collection/view/builder/find_command.rb +1 -1
  42. data/lib/mongo/collection/view/builder/flags.rb +1 -1
  43. data/lib/mongo/collection/view/builder/map_reduce.rb +1 -1
  44. data/lib/mongo/collection/view/builder/modifiers.rb +1 -1
  45. data/lib/mongo/collection/view/builder/op_query.rb +1 -1
  46. data/lib/mongo/collection/view/explainable.rb +1 -1
  47. data/lib/mongo/collection/view/immutable.rb +1 -1
  48. data/lib/mongo/collection/view/iterable.rb +2 -2
  49. data/lib/mongo/collection/view/map_reduce.rb +3 -3
  50. data/lib/mongo/collection/view/readable.rb +23 -6
  51. data/lib/mongo/collection/view/writable.rb +3 -3
  52. data/lib/mongo/cursor.rb +50 -7
  53. data/lib/mongo/cursor/builder.rb +1 -1
  54. data/lib/mongo/cursor/builder/get_more_command.rb +1 -1
  55. data/lib/mongo/cursor/builder/kill_cursors_command.rb +29 -1
  56. data/lib/mongo/cursor/builder/op_get_more.rb +1 -1
  57. data/lib/mongo/cursor/builder/op_kill_cursors.rb +29 -1
  58. data/lib/mongo/database.rb +4 -4
  59. data/lib/mongo/database/view.rb +2 -2
  60. data/lib/mongo/dbref.rb +4 -3
  61. data/lib/mongo/error.rb +1 -1
  62. data/lib/mongo/error/bulk_write_error.rb +1 -1
  63. data/lib/mongo/error/closed_stream.rb +1 -1
  64. data/lib/mongo/error/extra_file_chunk.rb +1 -1
  65. data/lib/mongo/error/file_not_found.rb +1 -1
  66. data/lib/mongo/error/invalid_bulk_operation.rb +1 -1
  67. data/lib/mongo/error/invalid_bulk_operation_type.rb +1 -1
  68. data/lib/mongo/error/invalid_collection_name.rb +1 -1
  69. data/lib/mongo/error/invalid_database_name.rb +1 -1
  70. data/lib/mongo/error/invalid_document.rb +1 -1
  71. data/lib/mongo/error/invalid_file.rb +1 -1
  72. data/lib/mongo/error/invalid_file_revision.rb +1 -1
  73. data/lib/mongo/error/invalid_nonce.rb +1 -1
  74. data/lib/mongo/error/invalid_replacement_document.rb +1 -1
  75. data/lib/mongo/error/invalid_server_preference.rb +1 -1
  76. data/lib/mongo/error/invalid_signature.rb +1 -1
  77. data/lib/mongo/error/invalid_update_document.rb +1 -1
  78. data/lib/mongo/error/invalid_uri.rb +1 -1
  79. data/lib/mongo/error/invalid_write_concern.rb +1 -1
  80. data/lib/mongo/error/max_bson_size.rb +1 -1
  81. data/lib/mongo/error/max_message_size.rb +1 -1
  82. data/lib/mongo/error/missing_file_chunk.rb +1 -1
  83. data/lib/mongo/error/multi_index_drop.rb +1 -1
  84. data/lib/mongo/error/need_primary_server.rb +1 -1
  85. data/lib/mongo/error/no_server_available.rb +4 -2
  86. data/lib/mongo/error/operation_failure.rb +1 -1
  87. data/lib/mongo/error/parser.rb +1 -1
  88. data/lib/mongo/error/socket_error.rb +1 -1
  89. data/lib/mongo/error/socket_timeout_error.rb +1 -1
  90. data/lib/mongo/error/unchangeable_collection_option.rb +1 -1
  91. data/lib/mongo/error/unexpected_chunk_length.rb +1 -1
  92. data/lib/mongo/error/unexpected_response.rb +1 -1
  93. data/lib/mongo/error/unsupported_features.rb +1 -1
  94. data/lib/mongo/event.rb +1 -1
  95. data/lib/mongo/event/description_changed.rb +1 -1
  96. data/lib/mongo/event/publisher.rb +1 -1
  97. data/lib/mongo/event/subscriber.rb +1 -1
  98. data/lib/mongo/grid.rb +1 -1
  99. data/lib/mongo/grid/file.rb +6 -2
  100. data/lib/mongo/grid/file/chunk.rb +6 -4
  101. data/lib/mongo/grid/file/info.rb +7 -3
  102. data/lib/mongo/grid/fs_bucket.rb +12 -6
  103. data/lib/mongo/grid/stream.rb +1 -1
  104. data/lib/mongo/grid/stream/read.rb +2 -4
  105. data/lib/mongo/grid/stream/write.rb +4 -3
  106. data/lib/mongo/index.rb +1 -1
  107. data/lib/mongo/index/view.rb +5 -4
  108. data/lib/mongo/loggable.rb +1 -1
  109. data/lib/mongo/logger.rb +1 -1
  110. data/lib/mongo/monitoring.rb +1 -1
  111. data/lib/mongo/operation.rb +1 -1
  112. data/lib/mongo/operation/commands.rb +1 -1
  113. data/lib/mongo/operation/commands/aggregate.rb +7 -7
  114. data/lib/mongo/operation/commands/aggregate/result.rb +1 -1
  115. data/lib/mongo/operation/commands/collections_info.rb +10 -9
  116. data/lib/mongo/operation/commands/collections_info/result.rb +1 -1
  117. data/lib/mongo/operation/commands/command.rb +1 -1
  118. data/lib/mongo/operation/commands/indexes.rb +12 -11
  119. data/lib/mongo/operation/commands/list_collections.rb +1 -1
  120. data/lib/mongo/operation/commands/list_collections/result.rb +1 -1
  121. data/lib/mongo/operation/commands/list_indexes.rb +1 -1
  122. data/lib/mongo/operation/commands/list_indexes/result.rb +1 -1
  123. data/lib/mongo/operation/commands/map_reduce.rb +1 -1
  124. data/lib/mongo/operation/commands/map_reduce/result.rb +1 -1
  125. data/lib/mongo/operation/commands/user_query.rb +11 -10
  126. data/lib/mongo/operation/commands/users_info.rb +2 -2
  127. data/lib/mongo/operation/commands/users_info/result.rb +1 -1
  128. data/lib/mongo/operation/executable.rb +8 -7
  129. data/lib/mongo/operation/kill_cursors.rb +2 -2
  130. data/lib/mongo/operation/limited.rb +1 -1
  131. data/lib/mongo/operation/read.rb +1 -1
  132. data/lib/mongo/operation/read/get_more.rb +2 -2
  133. data/lib/mongo/operation/read/query.rb +1 -1
  134. data/lib/mongo/operation/read/query/result.rb +1 -1
  135. data/lib/mongo/operation/read_preference.rb +10 -10
  136. data/lib/mongo/operation/result.rb +1 -1
  137. data/lib/mongo/operation/specifiable.rb +2 -2
  138. data/lib/mongo/operation/write.rb +1 -1
  139. data/lib/mongo/operation/write/bulk.rb +1 -1
  140. data/lib/mongo/operation/write/bulk/bulkable.rb +9 -9
  141. data/lib/mongo/operation/write/bulk/delete.rb +3 -3
  142. data/lib/mongo/operation/write/bulk/delete/result.rb +1 -1
  143. data/lib/mongo/operation/write/bulk/insert.rb +5 -5
  144. data/lib/mongo/operation/write/bulk/insert/result.rb +1 -1
  145. data/lib/mongo/operation/write/bulk/legacy_mergable.rb +1 -1
  146. data/lib/mongo/operation/write/bulk/mergable.rb +1 -1
  147. data/lib/mongo/operation/write/bulk/update.rb +3 -3
  148. data/lib/mongo/operation/write/bulk/update/result.rb +1 -1
  149. data/lib/mongo/operation/write/command.rb +1 -1
  150. data/lib/mongo/operation/write/command/create_index.rb +1 -1
  151. data/lib/mongo/operation/write/command/create_user.rb +1 -1
  152. data/lib/mongo/operation/write/command/delete.rb +1 -1
  153. data/lib/mongo/operation/write/command/drop_index.rb +1 -1
  154. data/lib/mongo/operation/write/command/insert.rb +11 -1
  155. data/lib/mongo/operation/write/command/remove_user.rb +1 -1
  156. data/lib/mongo/operation/write/command/update.rb +1 -1
  157. data/lib/mongo/operation/write/command/update_user.rb +1 -1
  158. data/lib/mongo/operation/write/command/writable.rb +7 -6
  159. data/lib/mongo/operation/write/create_index.rb +1 -1
  160. data/lib/mongo/operation/write/create_user.rb +1 -1
  161. data/lib/mongo/operation/write/delete.rb +1 -1
  162. data/lib/mongo/operation/write/delete/result.rb +1 -1
  163. data/lib/mongo/operation/write/drop_index.rb +5 -5
  164. data/lib/mongo/operation/write/gle.rb +3 -3
  165. data/lib/mongo/operation/write/idable.rb +1 -1
  166. data/lib/mongo/operation/write/insert.rb +5 -5
  167. data/lib/mongo/operation/write/insert/result.rb +1 -1
  168. data/lib/mongo/operation/write/remove_user.rb +1 -1
  169. data/lib/mongo/operation/write/update.rb +1 -1
  170. data/lib/mongo/operation/write/update/result.rb +1 -1
  171. data/lib/mongo/operation/write/update_user.rb +1 -1
  172. data/lib/mongo/operation/write/write_command_enabled.rb +10 -9
  173. data/lib/mongo/protocol/bit_vector.rb +2 -2
  174. data/lib/mongo/protocol/delete.rb +1 -1
  175. data/lib/mongo/protocol/get_more.rb +1 -1
  176. data/lib/mongo/protocol/insert.rb +5 -1
  177. data/lib/mongo/protocol/kill_cursors.rb +1 -1
  178. data/lib/mongo/protocol/message.rb +9 -5
  179. data/lib/mongo/protocol/query.rb +1 -1
  180. data/lib/mongo/protocol/reply.rb +1 -1
  181. data/lib/mongo/protocol/serializers.rb +8 -8
  182. data/lib/mongo/protocol/update.rb +1 -1
  183. data/lib/mongo/server.rb +40 -3
  184. data/lib/mongo/server/connectable.rb +1 -1
  185. data/lib/mongo/server/connection.rb +4 -2
  186. data/lib/mongo/server/connection_pool.rb +1 -1
  187. data/lib/mongo/server/connection_pool/queue.rb +1 -1
  188. data/lib/mongo/server/context.rb +3 -1
  189. data/lib/mongo/server/description.rb +1 -1
  190. data/lib/mongo/server/description/inspector/description_changed.rb +1 -1
  191. data/lib/mongo/server/monitor.rb +1 -1
  192. data/lib/mongo/server_selector.rb +2 -1
  193. data/lib/mongo/server_selector/nearest.rb +1 -1
  194. data/lib/mongo/server_selector/primary.rb +1 -1
  195. data/lib/mongo/server_selector/primary_preferred.rb +1 -1
  196. data/lib/mongo/server_selector/secondary.rb +1 -1
  197. data/lib/mongo/server_selector/secondary_preferred.rb +1 -1
  198. data/lib/mongo/server_selector/selectable.rb +12 -7
  199. data/lib/mongo/socket.rb +1 -1
  200. data/lib/mongo/socket/ssl.rb +1 -1
  201. data/lib/mongo/socket/tcp.rb +1 -1
  202. data/lib/mongo/socket/unix.rb +1 -1
  203. data/lib/mongo/uri.rb +1 -1
  204. data/lib/mongo/version.rb +2 -2
  205. data/lib/mongo/write_concern/acknowledged.rb +1 -1
  206. data/lib/mongo/write_concern/normalizable.rb +1 -1
  207. data/lib/mongo/write_concern/unacknowledged.rb +1 -1
  208. data/mongo.gemspec +1 -1
  209. data/spec/mongo/client_spec.rb +2 -2
  210. data/spec/mongo/cluster/cursor_reaper_spec.rb +216 -0
  211. data/spec/mongo/cluster_spec.rb +36 -5
  212. data/spec/mongo/collection/view/aggregation_spec.rb +2 -2
  213. data/spec/mongo/collection/view/map_reduce_spec.rb +2 -2
  214. data/spec/mongo/collection/view/readable_spec.rb +203 -5
  215. data/spec/mongo/collection/view_spec.rb +10 -0
  216. data/spec/mongo/collection_spec.rb +64 -18
  217. data/spec/mongo/cursor_spec.rb +89 -0
  218. data/spec/mongo/database_spec.rb +79 -13
  219. data/spec/mongo/grid/fs_bucket_spec.rb +119 -1
  220. data/spec/mongo/grid/stream/write_spec.rb +63 -12
  221. data/spec/mongo/index/view_spec.rb +19 -0
  222. data/spec/mongo/operation/commands/aggregate_spec.rb +10 -7
  223. data/spec/mongo/operation/commands/collections_info_spec.rb +1 -1
  224. data/spec/mongo/operation/commands/command_spec.rb +3 -3
  225. data/spec/mongo/operation/commands/indexes_spec.rb +1 -1
  226. data/spec/mongo/operation/commands/map_reduce_spec.rb +2 -2
  227. data/spec/mongo/operation/kill_cursors_spec.rb +10 -19
  228. data/spec/mongo/operation/read/get_more_spec.rb +13 -25
  229. data/spec/mongo/operation/read/query_spec.rb +26 -30
  230. data/spec/mongo/operation/read_preference_spec.rb +11 -11
  231. data/spec/mongo/operation/specifiable_spec.rb +31 -0
  232. data/spec/mongo/operation/write/bulk/delete_spec.rb +16 -18
  233. data/spec/mongo/operation/write/bulk/insert_spec.rb +17 -18
  234. data/spec/mongo/operation/write/bulk/update_spec.rb +20 -25
  235. data/spec/mongo/operation/write/command/delete_spec.rb +26 -32
  236. data/spec/mongo/operation/write/command/insert_spec.rb +24 -31
  237. data/spec/mongo/operation/write/command/update_spec.rb +24 -32
  238. data/spec/mongo/operation/write/create_index_spec.rb +4 -4
  239. data/spec/mongo/operation/write/create_user_spec.rb +3 -3
  240. data/spec/mongo/operation/write/delete_spec.rb +51 -22
  241. data/spec/mongo/operation/write/drop_index_spec.rb +2 -2
  242. data/spec/mongo/operation/write/insert_spec.rb +42 -11
  243. data/spec/mongo/operation/write/remove_user_spec.rb +4 -4
  244. data/spec/mongo/operation/write/update_spec.rb +34 -6
  245. data/spec/mongo/operation/write/update_user_spec.rb +1 -1
  246. data/spec/mongo/server/connection_spec.rb +22 -14
  247. data/spec/mongo/server_selection_spec.rb +2 -2
  248. data/spec/mongo/server_selector/nearest_spec.rb +4 -4
  249. data/spec/mongo/server_selector/primary_preferred_spec.rb +4 -4
  250. data/spec/mongo/server_selector/primary_spec.rb +2 -2
  251. data/spec/mongo/server_selector/secondary_preferred_spec.rb +4 -4
  252. data/spec/mongo/server_selector/secondary_spec.rb +3 -3
  253. data/spec/mongo/server_selector_spec.rb +82 -3
  254. data/spec/mongo/server_spec.rb +0 -20
  255. data/spec/support/command_monitoring.rb +1 -1
  256. data/spec/support/connection_string.rb +1 -1
  257. data/spec/support/crud.rb +1 -1
  258. data/spec/support/crud/read.rb +1 -1
  259. data/spec/support/crud/write.rb +1 -1
  260. data/spec/support/gridfs.rb +1 -1
  261. data/spec/support/shared/server_selector.rb +3 -3
  262. metadata +7 -10
  263. metadata.gz.sig +0 -0
  264. data/lib/csasl/csasl.bundle +0 -0
  265. data/spec/mongo/operation/write/response_spec.rb +0 -85
  266. data/spec/support/shared/operation.rb +0 -100
@@ -63,6 +63,25 @@ describe Mongo::Database do
63
63
  end.to raise_error(Mongo::Error::InvalidCollectionName)
64
64
  end
65
65
  end
66
+
67
+ context 'when the client has options' do
68
+
69
+ let(:client) do
70
+ Mongo::Client.new([default_address.host], read: { mode: :secondary })
71
+ end
72
+
73
+ let(:database) do
74
+ client.database
75
+ end
76
+
77
+ let(:collection) do
78
+ database[:with_read_pref]
79
+ end
80
+
81
+ it 'applies the options to the collection' do
82
+ expect(collection.read_preference).to eq(Mongo::ServerSelector.get(mode: :secondary))
83
+ end
84
+ end
66
85
  end
67
86
 
68
87
  describe '#collection_names' do
@@ -225,40 +244,87 @@ describe Mongo::Database do
225
244
  end
226
245
  end
227
246
 
228
- context 'when an alternate read preference is specified' do
247
+ context 'when no read preference is provided', unless: sharded? do
248
+
249
+ let!(:primary_server) do
250
+ database.cluster.next_primary
251
+ end
229
252
 
230
253
  before do
231
- allow(database.cluster).to receive(:single?).and_return(false)
254
+ expect(primary_server).to receive(:with_connection).at_least(:once).and_call_original
255
+ end
256
+
257
+ it 'uses read preference of primary' do
258
+ expect(database.command(ping: 1)).to be_successful
259
+ end
260
+ end
261
+
262
+ context 'when the client has a read preference set', unless: sharded? do
263
+
264
+ let!(:primary_server) do
265
+ database.cluster.next_primary
232
266
  end
233
267
 
234
- let(:read) do
268
+ let(:read_preference) do
235
269
  { :mode => :secondary, :tag_sets => [{ 'non' => 'existent' }] }
236
270
  end
237
271
 
238
272
  let(:client) do
239
- authorized_client.with(server_selection_timeout: 0.1)
273
+ authorized_client.with(read: read_preference)
240
274
  end
241
275
 
242
276
  let(:database) do
243
277
  described_class.new(client, TEST_DB, client.options)
244
278
  end
245
279
 
246
- it 'uses that read preference', unless: sharded? do
247
- expect do
248
- database.command({ ping: 1 }, { read: read })
249
- end.to raise_error(Mongo::Error::NoServerAvailable)
280
+ before do
281
+ expect(primary_server).to receive(:with_connection).at_least(:once).and_call_original
282
+ end
283
+
284
+ it 'does not use the client read preference 'do
285
+ expect(database.command(ping: 1)).to be_successful
250
286
  end
251
287
  end
252
288
 
253
- context 'when there is a read preference set on the client' do
289
+ context 'when there is a read preference argument provided', unless: sharded? do
290
+
291
+ let(:read_preference) do
292
+ { :mode => :secondary, :tag_sets => [{ 'non' => 'existent' }] }
293
+ end
294
+
295
+ let(:client) do
296
+ authorized_client.with(server_selection_timeout: 0.2)
297
+ end
254
298
 
255
299
  let(:database) do
256
- described_class.new(authorized_client.with(read: { mode: :secondary }), TEST_DB)
300
+ described_class.new(client, TEST_DB, client.options)
301
+ end
302
+
303
+ before do
304
+ allow(database.cluster).to receive(:single?).and_return(false)
257
305
  end
258
306
 
259
- it 'does not use the read preference' do
260
- expect(database.client.cluster).to receive(:next_primary).and_call_original
261
- database.command(ping: 1)
307
+ it 'uses the read preference argument' do
308
+ expect {
309
+ database.command({ ping: 1 }, read: read_preference)
310
+ }.to raise_error(Mongo::Error::NoServerAvailable)
311
+ end
312
+ end
313
+
314
+ context 'when the client has a server_selection_timeout set', unless: sharded? do
315
+
316
+ let(:client) do
317
+ authorized_client.with(server_selection_timeout: 0)
318
+ end
319
+
320
+ let(:database) do
321
+ described_class.new(client, TEST_DB, client.options)
322
+ end
323
+
324
+ it 'uses the client server_selection_timeout' do
325
+ expect {
326
+ database.command(ping: 1)
327
+ }.to raise_error(Mongo::Error::NoServerAvailable)
262
328
  end
263
329
  end
264
330
  end
@@ -51,7 +51,7 @@ describe Mongo::Grid::FSBucket do
51
51
  context 'when a read preference is set' do
52
52
 
53
53
  let(:options) do
54
- { read: { mode: :secondary, server_selection_timeout: 0.1 } }
54
+ { read: { mode: :secondary } }
55
55
  end
56
56
 
57
57
  let(:read_pref) do
@@ -63,6 +63,21 @@ describe Mongo::Grid::FSBucket do
63
63
  end
64
64
  end
65
65
 
66
+ context 'when a read preference is not set' do
67
+
68
+ let(:database) do
69
+ authorized_client.with(read: { mode: :secondary }).database
70
+ end
71
+
72
+ let(:fs) do
73
+ described_class.new(database, options)
74
+ end
75
+
76
+ it 'uses the read preference of the database' do
77
+ expect(fs.read_preference).to be(database.read_preference)
78
+ end
79
+ end
80
+
66
81
  context 'when a write stream is opened' do
67
82
 
68
83
  let(:stream) do
@@ -221,9 +236,22 @@ describe Mongo::Grid::FSBucket do
221
236
  fs.find_one(:filename => 'test.txt')
222
237
  end
223
238
 
239
+ let(:from_db_upload_date) do
240
+ from_db.info.upload_date.strftime("%Y-%m-%d %H:%M:%S")
241
+ end
242
+
243
+ let(:file_info_upload_date) do
244
+ file.info.upload_date.strftime("%Y-%m-%d %H:%M:%S")
245
+ end
246
+
224
247
  it 'returns the assembled file from the db' do
225
248
  expect(from_db.filename).to eq(file.info.filename)
226
249
  end
250
+
251
+ it 'maps the file info correctly' do
252
+ expect(from_db.info.length).to eq(file.info.length)
253
+ expect(from_db_upload_date).to eq(file_info_upload_date)
254
+ end
227
255
  end
228
256
 
229
257
  describe '#insert_one' do
@@ -434,6 +462,25 @@ describe Mongo::Grid::FSBucket do
434
462
  it 'removes the file from the db' do
435
463
  expect(from_db).to be_nil
436
464
  end
465
+
466
+ context 'when a custom file id is used' do
467
+
468
+ let(:custom_file_id) do
469
+ fs.upload_from_stream(filename, file, file_id: 'Custom ID')
470
+ end
471
+
472
+ before do
473
+ fs.delete(custom_file_id)
474
+ end
475
+
476
+ let(:from_db) do
477
+ fs.find_one(:filename => filename)
478
+ end
479
+
480
+ it 'removes the file from the db' do
481
+ expect(from_db).to be_nil
482
+ end
483
+ end
437
484
  end
438
485
 
439
486
  context 'when a read stream is opened' do
@@ -498,6 +545,51 @@ describe Mongo::Grid::FSBucket do
498
545
  expect(io.size).to eq(0)
499
546
  end
500
547
  end
548
+
549
+ context 'when a custom file id is provided' do
550
+
551
+ let(:file) do
552
+ File.open(__FILE__)
553
+ end
554
+
555
+ let!(:file_id) do
556
+ fs.open_upload_stream(filename, file_id: 'Custom ID') do |stream|
557
+ stream.write(file)
558
+ end.file_id
559
+ end
560
+
561
+ context 'when a block is provided' do
562
+
563
+ let!(:stream) do
564
+ fs.open_download_stream(file_id) do |stream|
565
+ io.write(stream.read)
566
+ end
567
+ end
568
+
569
+ it 'yields the stream to the block' do
570
+ expect(io.size).to eq(file.size)
571
+ end
572
+ end
573
+
574
+ context 'when a block is not provided' do
575
+
576
+ let!(:stream) do
577
+ fs.open_download_stream(file_id)
578
+ end
579
+
580
+ it 'returns a Stream::Read object' do
581
+ expect(stream).to be_a(Mongo::Grid::FSBucket::Stream::Read)
582
+ end
583
+
584
+ it 'does not close the stream' do
585
+ expect(stream.closed?).to be(false)
586
+ end
587
+
588
+ it 'does not yield the stream to the block' do
589
+ expect(io.size).to eq(0)
590
+ end
591
+ end
592
+ end
501
593
  end
502
594
 
503
595
  describe '#download_to_stream' do
@@ -830,6 +922,21 @@ describe Mongo::Grid::FSBucket do
830
922
  it 'creates an ObjectId for the file' do
831
923
  expect(stream.file_id).to be_a(BSON::ObjectId)
832
924
  end
925
+
926
+ context 'when a custom file ID is provided' do
927
+
928
+ let(:stream) do
929
+ fs.open_upload_stream(filename, file_id: 'Custom ID')
930
+ end
931
+
932
+ it 'returns a Stream::Write object' do
933
+ expect(stream).to be_a(Mongo::Grid::FSBucket::Stream::Write)
934
+ end
935
+
936
+ it 'creates an ObjectId for the file' do
937
+ expect(stream.file_id).to eq('Custom ID')
938
+ end
939
+ end
833
940
  end
834
941
 
835
942
  context 'when a block is provided' do
@@ -930,6 +1037,17 @@ describe Mongo::Grid::FSBucket do
930
1037
  fs.open_upload_stream(filename, stream_options)
931
1038
  end
932
1039
 
1040
+ context 'when a custom file id is provided' do
1041
+
1042
+ let(:stream_options) do
1043
+ { file_id: 'Custom ID' }
1044
+ end
1045
+
1046
+ it 'sets the file id on the stream' do
1047
+ expect(stream.file_id).to eq('Custom ID')
1048
+ end
1049
+ end
1050
+
933
1051
  context 'when a write option is specified' do
934
1052
 
935
1053
  let(:stream_options) do
@@ -83,7 +83,7 @@ describe Mongo::Grid::FSBucket::Stream::Write do
83
83
 
84
84
  let(:extra_options) do
85
85
  {
86
- write: { w: (WRITE_CONCERN[:w] + 1) }
86
+ write: { w: (WRITE_CONCERN[:w] + 1) }
87
87
  }
88
88
  end
89
89
 
@@ -174,6 +174,19 @@ describe Mongo::Grid::FSBucket::Stream::Write do
174
174
  expect(stream.send(:file_info).document[:aliases]).to eq(options[:aliases])
175
175
  end
176
176
  end
177
+
178
+ context 'when provided a file_id option' do
179
+
180
+ let(:options) do
181
+ {
182
+ file_id: 'Custom ID'
183
+ }
184
+ end
185
+
186
+ it 'assigns the stream the file id' do
187
+ expect(stream.file_id).to eq(options[:file_id])
188
+ end
189
+ end
177
190
  end
178
191
  end
179
192
 
@@ -285,25 +298,63 @@ describe Mongo::Grid::FSBucket::Stream::Write do
285
298
 
286
299
  context 'when provided an io stream' do
287
300
 
288
- before do
289
- stream.write(file)
290
- stream.close
291
- end
301
+ context 'when no file id is specified' do
292
302
 
293
- it 'writes the contents of the stream' do
294
- expect(file_from_db.data.size).to eq(file.size)
295
- end
303
+ before do
304
+ stream.write(file)
305
+ stream.close
306
+ end
296
307
 
297
- it 'updates the length written' do
298
- expect(stream.send(:file_info).document['length']).to eq(file.size)
308
+ it 'writes the contents of the stream' do
309
+ expect(file_from_db.data.size).to eq(file.size)
310
+ end
311
+
312
+ it 'updates the length written' do
313
+ expect(stream.send(:file_info).document['length']).to eq(file.size)
314
+ end
315
+
316
+ it 'updates the position (n)' do
317
+ expect(stream.instance_variable_get(:@n)).to eq(1)
318
+ end
299
319
  end
300
320
 
301
- it 'updates the position (n)' do
302
- expect(stream.instance_variable_get(:@n)).to eq(1)
321
+ context 'when a custom file id is provided' do
322
+
323
+ let(:extra_options) do
324
+ {
325
+ file_id: 'Custom ID'
326
+ }
327
+ end
328
+
329
+ let!(:id) do
330
+ stream.write(file)
331
+ stream.close
332
+ end
333
+
334
+ it 'writes the contents of the stream' do
335
+ expect(file_from_db.data.size).to eq(file.size)
336
+ end
337
+
338
+ it 'updates the length written' do
339
+ expect(stream.send(:file_info).document['length']).to eq(file.size)
340
+ end
341
+
342
+ it 'updates the position (n)' do
343
+ expect(stream.instance_variable_get(:@n)).to eq(1)
344
+ end
345
+
346
+ it 'uses the custom file id' do
347
+ expect(id).to eq(options[:file_id])
348
+ end
303
349
  end
304
350
 
305
351
  context 'when the user file contains no data' do
306
352
 
353
+ before do
354
+ stream.write(file)
355
+ stream.close
356
+ end
357
+
307
358
  let(:file) do
308
359
  StringIO.new('')
309
360
  end
@@ -366,6 +366,25 @@ describe Mongo::Index::View do
366
366
  it 'maps the ruby options to the server options' do
367
367
  expect(models).to eq([ expected ])
368
368
  end
369
+
370
+ context 'when using alternate names' do
371
+
372
+ let(:extended_options) do
373
+ options.merge!(expire_after_seconds: 5)
374
+ end
375
+
376
+ let(:extended_expected) do
377
+ expected.tap { |exp| exp[:expireAfterSeconds] = 5 }
378
+ end
379
+
380
+ let(:models) do
381
+ view.send(:normalize_models, [ extended_options ])
382
+ end
383
+
384
+ it 'maps the ruby options to the server options' do
385
+ expect(models).to eq([ extended_expected ])
386
+ end
387
+ end
369
388
  end
370
389
  end
371
390
  end
@@ -1,17 +1,20 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe Mongo::Operation::Commands::Aggregate do
4
- include_context 'operation'
4
+
5
+ let(:options) do
6
+ {}
7
+ end
5
8
 
6
9
  let(:selector) do
7
- { :aggregate => coll_name,
10
+ { :aggregate => TEST_COLL,
8
11
  :pipeline => [],
9
12
  }
10
13
  end
11
14
  let(:spec) do
12
15
  { :selector => selector,
13
- :options => {},
14
- :db_name => db_name
16
+ :options => options,
17
+ :db_name => TEST_DB
15
18
  }
16
19
  end
17
20
  let(:op) { described_class.new(spec) }
@@ -38,7 +41,7 @@ describe Mongo::Operation::Commands::Aggregate do
38
41
  let(:other_spec) do
39
42
  { :selector => other_selector,
40
43
  :options => options,
41
- :db_name => db_name,
44
+ :db_name => TEST_DB,
42
45
  }
43
46
  end
44
47
  let(:other) { described_class.new(other_spec) }
@@ -54,14 +57,14 @@ describe Mongo::Operation::Commands::Aggregate do
54
57
  context 'when the aggregation fails' do
55
58
 
56
59
  let(:selector) do
57
- { :aggregate => coll_name,
60
+ { :aggregate => TEST_COLL,
58
61
  :pipeline => [{ '$invalid' => 'operator' }],
59
62
  }
60
63
  end
61
64
 
62
65
  it 'raises an exception' do
63
66
  expect {
64
- op.execute(authorized_primary.context)
67
+ op.execute(authorized_primary)
65
68
  }.to raise_error(Mongo::Error::OperationFailure)
66
69
  end
67
70
  end