mongo 2.4.3 → 2.5.0.beta

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 (235) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +3 -2
  3. data.tar.gz.sig +0 -0
  4. data/lib/mongo.rb +3 -2
  5. data/lib/mongo/auth/cr.rb +6 -4
  6. data/lib/mongo/auth/cr/conversation.rb +33 -17
  7. data/lib/mongo/auth/ldap.rb +4 -2
  8. data/lib/mongo/auth/ldap/conversation.rb +19 -9
  9. data/lib/mongo/auth/scram.rb +7 -4
  10. data/lib/mongo/auth/scram/conversation.rb +62 -24
  11. data/lib/mongo/auth/user.rb +10 -0
  12. data/lib/mongo/auth/user/view.rb +44 -22
  13. data/lib/mongo/auth/x509.rb +4 -2
  14. data/lib/mongo/auth/x509/conversation.rb +19 -9
  15. data/lib/mongo/bulk_write.rb +33 -27
  16. data/lib/mongo/bulk_write/combineable.rb +5 -0
  17. data/lib/mongo/bulk_write/transformable.rb +2 -0
  18. data/lib/mongo/bulk_write/validatable.rb +4 -0
  19. data/lib/mongo/client.rb +123 -12
  20. data/lib/mongo/cluster.rb +52 -11
  21. data/lib/mongo/cluster/app_metadata.rb +8 -2
  22. data/lib/mongo/cluster/cursor_reaper.rb +0 -1
  23. data/lib/mongo/cluster/topology.rb +1 -1
  24. data/lib/mongo/collection.rb +114 -27
  25. data/lib/mongo/collection/view.rb +8 -2
  26. data/lib/mongo/collection/view/aggregation.rb +11 -7
  27. data/lib/mongo/collection/view/builder/aggregation.rb +5 -1
  28. data/lib/mongo/collection/view/builder/find_command.rb +5 -3
  29. data/lib/mongo/collection/view/builder/map_reduce.rb +11 -3
  30. data/lib/mongo/collection/view/builder/op_query.rb +1 -1
  31. data/lib/mongo/collection/view/change_stream.rb +160 -0
  32. data/lib/mongo/collection/view/change_stream/retryable.rb +57 -0
  33. data/lib/mongo/collection/view/iterable.rb +11 -10
  34. data/lib/mongo/collection/view/map_reduce.rb +22 -18
  35. data/lib/mongo/collection/view/readable.rb +51 -37
  36. data/lib/mongo/collection/view/writable.rb +72 -40
  37. data/lib/mongo/cursor.rb +25 -4
  38. data/lib/mongo/cursor/builder/get_more_command.rb +4 -2
  39. data/lib/mongo/database.rb +22 -11
  40. data/lib/mongo/database/view.rb +16 -12
  41. data/lib/mongo/error.rb +5 -0
  42. data/lib/mongo/error/invalid_session.rb +36 -0
  43. data/lib/mongo/error/missing_resume_token.rb +39 -0
  44. data/lib/mongo/error/operation_failure.rb +17 -0
  45. data/lib/mongo/error/parser.rb +3 -2
  46. data/lib/mongo/error/unknown_payload_type.rb +41 -0
  47. data/lib/mongo/error/unsupported_array_filters.rb +51 -0
  48. data/lib/mongo/error/unsupported_message_type.rb +23 -0
  49. data/lib/mongo/grid/fs_bucket.rb +5 -4
  50. data/lib/mongo/grid/stream/read.rb +3 -2
  51. data/lib/mongo/grid/stream/write.rb +2 -2
  52. data/lib/mongo/index/view.rb +35 -25
  53. data/lib/mongo/monitoring/event/secure.rb +14 -0
  54. data/lib/mongo/operation.rb +16 -0
  55. data/lib/mongo/operation/commands.rb +1 -0
  56. data/lib/mongo/operation/commands/aggregate.rb +9 -5
  57. data/lib/mongo/operation/commands/aggregate/result.rb +1 -1
  58. data/lib/mongo/operation/commands/collections_info.rb +6 -6
  59. data/lib/mongo/operation/commands/command.rb +2 -1
  60. data/lib/mongo/operation/commands/create.rb +6 -2
  61. data/lib/mongo/operation/commands/drop.rb +6 -2
  62. data/lib/mongo/operation/commands/drop_database.rb +6 -2
  63. data/lib/mongo/operation/commands/explain.rb +27 -0
  64. data/lib/mongo/operation/commands/explain/result.rb +52 -0
  65. data/lib/mongo/operation/commands/indexes.rb +1 -1
  66. data/lib/mongo/operation/commands/list_collections.rb +1 -1
  67. data/lib/mongo/operation/commands/list_collections/result.rb +1 -1
  68. data/lib/mongo/operation/commands/list_indexes.rb +1 -1
  69. data/lib/mongo/operation/commands/list_indexes/result.rb +1 -1
  70. data/lib/mongo/operation/commands/map_reduce.rb +8 -4
  71. data/lib/mongo/operation/commands/map_reduce/result.rb +13 -1
  72. data/lib/mongo/operation/commands/user_query.rb +1 -1
  73. data/lib/mongo/operation/commands/users_info.rb +6 -2
  74. data/lib/mongo/operation/executable.rb +4 -1
  75. data/lib/mongo/operation/read_preference.rb +10 -5
  76. data/lib/mongo/operation/result.rb +26 -2
  77. data/lib/mongo/operation/specifiable.rb +13 -1
  78. data/lib/mongo/operation/uses_command_op_msg.rb +47 -0
  79. data/lib/mongo/operation/write/bulk/bulkable.rb +4 -1
  80. data/lib/mongo/operation/write/bulk/insert/result.rb +4 -4
  81. data/lib/mongo/operation/write/command/create_index.rb +6 -1
  82. data/lib/mongo/operation/write/command/delete.rb +28 -4
  83. data/lib/mongo/operation/write/command/drop_index.rb +6 -1
  84. data/lib/mongo/operation/write/command/insert.rb +22 -18
  85. data/lib/mongo/operation/write/command/update.rb +24 -9
  86. data/lib/mongo/operation/write/command/writable.rb +14 -1
  87. data/lib/mongo/operation/write/insert.rb +4 -1
  88. data/lib/mongo/operation/write/insert/result.rb +2 -2
  89. data/lib/mongo/operation/write/update.rb +7 -1
  90. data/lib/mongo/operation/write/write_command_enabled.rb +20 -3
  91. data/lib/mongo/protocol.rb +3 -0
  92. data/lib/mongo/protocol/bit_vector.rb +2 -2
  93. data/lib/mongo/protocol/compressed.rb +135 -0
  94. data/lib/mongo/protocol/delete.rb +8 -6
  95. data/lib/mongo/protocol/get_more.rb +8 -6
  96. data/lib/mongo/protocol/insert.rb +8 -6
  97. data/lib/mongo/protocol/kill_cursors.rb +8 -6
  98. data/lib/mongo/protocol/message.rb +31 -3
  99. data/lib/mongo/protocol/msg.rb +172 -0
  100. data/lib/mongo/protocol/query.rb +26 -6
  101. data/lib/mongo/protocol/registry.rb +76 -0
  102. data/lib/mongo/protocol/reply.rb +10 -5
  103. data/lib/mongo/protocol/serializers.rb +224 -0
  104. data/lib/mongo/protocol/update.rb +8 -6
  105. data/lib/mongo/retryable.rb +4 -2
  106. data/lib/mongo/server.rb +6 -3
  107. data/lib/mongo/server/connectable.rb +1 -1
  108. data/lib/mongo/server/connection.rb +30 -8
  109. data/lib/mongo/server/description.rb +25 -1
  110. data/lib/mongo/server/description/features.rb +4 -1
  111. data/lib/mongo/server/monitor.rb +5 -0
  112. data/lib/mongo/server/monitor/connection.rb +50 -2
  113. data/lib/mongo/server_selector/nearest.rb +10 -4
  114. data/lib/mongo/server_selector/primary.rb +20 -0
  115. data/lib/mongo/server_selector/primary_preferred.rb +10 -4
  116. data/lib/mongo/server_selector/secondary.rb +10 -4
  117. data/lib/mongo/server_selector/secondary_preferred.rb +24 -4
  118. data/lib/mongo/session.rb +180 -0
  119. data/lib/mongo/session/server_session.rb +73 -0
  120. data/lib/mongo/session/session_pool.rb +161 -0
  121. data/lib/mongo/uri.rb +11 -0
  122. data/lib/mongo/version.rb +1 -1
  123. data/mongo.gemspec +2 -1
  124. data/spec/mongo/auth/cr_spec.rb +12 -0
  125. data/spec/mongo/auth/ldap_spec.rb +2 -0
  126. data/spec/mongo/auth/scram/conversation_spec.rb +6 -6
  127. data/spec/mongo/auth/scram_spec.rb +25 -1
  128. data/spec/mongo/auth/user/view_spec.rb +268 -76
  129. data/spec/mongo/auth/x509_spec.rb +2 -0
  130. data/spec/mongo/bulk_write_spec.rb +435 -5
  131. data/spec/mongo/client_spec.rb +356 -39
  132. data/spec/mongo/cluster/app_metadata_spec.rb +2 -2
  133. data/spec/mongo/cluster_spec.rb +176 -0
  134. data/spec/mongo/collection/view/aggregation_spec.rb +33 -12
  135. data/spec/mongo/collection/view/builder/find_command_spec.rb +46 -6
  136. data/spec/mongo/collection/view/change_stream_spec.rb +814 -0
  137. data/spec/mongo/collection/view/map_reduce_spec.rb +94 -17
  138. data/spec/mongo/collection/view/readable_spec.rb +3 -12
  139. data/spec/mongo/collection_spec.rb +1048 -42
  140. data/spec/mongo/cursor/builder/get_more_command_spec.rb +19 -0
  141. data/spec/mongo/cursor_spec.rb +2 -2
  142. data/spec/mongo/database_spec.rb +50 -1
  143. data/spec/mongo/grid/fs_bucket_spec.rb +225 -137
  144. data/spec/mongo/grid/stream/read_spec.rb +2 -2
  145. data/spec/mongo/index/view_spec.rb +146 -8
  146. data/spec/mongo/monitoring/event/secure_spec.rb +42 -0
  147. data/spec/mongo/operation/read/query_spec.rb +2 -1
  148. data/spec/mongo/operation/specifiable_spec.rb +2 -2
  149. data/spec/mongo/operation/write/command/delete_spec.rb +96 -13
  150. data/spec/mongo/operation/write/command/insert_spec.rb +111 -12
  151. data/spec/mongo/operation/write/command/update_spec.rb +93 -10
  152. data/spec/mongo/operation/write/delete_spec.rb +1 -1
  153. data/spec/mongo/operation/write/insert_spec.rb +1 -1
  154. data/spec/mongo/operation/write/update_spec.rb +1 -1
  155. data/spec/mongo/protocol/compressed_spec.rb +66 -0
  156. data/spec/mongo/protocol/delete_spec.rb +14 -0
  157. data/spec/mongo/protocol/get_more_spec.rb +14 -0
  158. data/spec/mongo/protocol/insert_spec.rb +14 -0
  159. data/spec/mongo/protocol/kill_cursors_spec.rb +14 -0
  160. data/spec/mongo/protocol/msg_spec.rb +499 -0
  161. data/spec/mongo/protocol/query_spec.rb +45 -0
  162. data/spec/mongo/protocol/registry_spec.rb +31 -0
  163. data/spec/mongo/protocol/reply_spec.rb +14 -0
  164. data/spec/mongo/protocol/update_spec.rb +14 -0
  165. data/spec/mongo/retryable_spec.rb +6 -2
  166. data/spec/mongo/sdam_spec.rb +4 -0
  167. data/spec/mongo/server/connection_spec.rb +4 -2
  168. data/spec/mongo/server/description_spec.rb +28 -1
  169. data/spec/mongo/session/server_session_spec.rb +16 -0
  170. data/spec/mongo/session/session_pool_spec.rb +194 -0
  171. data/spec/mongo/uri_spec.rb +31 -2
  172. data/spec/spec_helper.rb +104 -0
  173. data/spec/support/authorization.rb +6 -1
  174. data/spec/support/crud.rb +3 -1
  175. data/spec/support/crud/write.rb +6 -1
  176. data/spec/support/crud_tests/write/findOneAndUpdate-arrayFilters.yml +69 -0
  177. data/spec/support/crud_tests/write/updateMany-arrayFilters.yml +63 -0
  178. data/spec/support/crud_tests/write/updateOne-arrayFilters.yml +109 -0
  179. data/spec/support/sdam/rs/discover_arbiters.yml +1 -1
  180. data/spec/support/sdam/rs/discover_passives.yml +2 -2
  181. data/spec/support/sdam/rs/discover_primary.yml +1 -1
  182. data/spec/support/sdam/rs/discover_secondary.yml +1 -1
  183. data/spec/support/sdam/rs/discovery.yml +4 -4
  184. data/spec/support/sdam/rs/equal_electionids.yml +1 -0
  185. data/spec/support/sdam/rs/ghost_discovered.yml +1 -1
  186. data/spec/support/sdam/rs/hosts_differ_from_seeds.yml +1 -1
  187. data/spec/support/sdam/rs/ls_timeout.yml +88 -0
  188. data/spec/support/sdam/rs/member_reconfig.yml +2 -2
  189. data/spec/support/sdam/rs/member_standalone.yml +2 -2
  190. data/spec/support/sdam/rs/new_primary.yml +2 -2
  191. data/spec/support/sdam/rs/new_primary_new_electionid.yml +3 -0
  192. data/spec/support/sdam/rs/new_primary_new_setversion.yml +3 -0
  193. data/spec/support/sdam/rs/new_primary_wrong_set_name.yml +2 -2
  194. data/spec/support/sdam/rs/non_rs_member.yml +1 -1
  195. data/spec/support/sdam/rs/normalize_case.yml +1 -1
  196. data/spec/support/sdam/rs/null_election_id.yml +4 -0
  197. data/spec/support/sdam/rs/primary_becomes_standalone.yml +2 -2
  198. data/spec/support/sdam/rs/primary_changes_set_name.yml +2 -2
  199. data/spec/support/sdam/rs/primary_disconnect.yml +2 -2
  200. data/spec/support/sdam/rs/primary_disconnect_electionid.yml +5 -0
  201. data/spec/support/sdam/rs/primary_disconnect_setversion.yml +5 -0
  202. data/spec/support/sdam/rs/primary_hint_from_secondary_with_mismatched_me.yml +58 -0
  203. data/spec/support/sdam/rs/primary_reports_new_member.yml +4 -4
  204. data/spec/support/sdam/rs/primary_to_no_primary_mismatched_me.yml +2 -2
  205. data/spec/support/sdam/rs/primary_wrong_set_name.yml +1 -1
  206. data/spec/support/sdam/rs/response_from_removed.yml +2 -2
  207. data/spec/support/sdam/rs/rsother_discovered.yml +1 -1
  208. data/spec/support/sdam/rs/sec_not_auth.yml +1 -1
  209. data/spec/support/sdam/rs/secondary_wrong_set_name.yml +1 -1
  210. data/spec/support/sdam/rs/secondary_wrong_set_name_with_primary.yml +2 -2
  211. data/spec/support/sdam/rs/setversion_without_electionid.yml +2 -0
  212. data/spec/support/sdam/rs/stepdown_change_set_name.yml +2 -2
  213. data/spec/support/sdam/rs/unexpected_mongos.yml +1 -1
  214. data/spec/support/sdam/rs/use_setversion_without_electionid.yml +3 -0
  215. data/spec/support/sdam/rs/wrong_set_name.yml +1 -1
  216. data/spec/support/sdam/sharded/ls_timeout_mongos.yml +97 -0
  217. data/spec/support/sdam/sharded/mongos_disconnect.yml +3 -3
  218. data/spec/support/sdam/sharded/multiple_mongoses.yml +1 -1
  219. data/spec/support/sdam/sharded/non_mongos_removed.yml +1 -1
  220. data/spec/support/sdam/sharded/normalize_uri_case.yml +1 -1
  221. data/spec/support/sdam/single/direct_connection_external_ip.yml +1 -1
  222. data/spec/support/sdam/single/direct_connection_mongos.yml +1 -1
  223. data/spec/support/sdam/single/direct_connection_rsarbiter.yml +1 -1
  224. data/spec/support/sdam/single/direct_connection_rsprimary.yml +1 -1
  225. data/spec/support/sdam/single/direct_connection_rssecondary.yml +1 -1
  226. data/spec/support/sdam/single/direct_connection_slave.yml +1 -1
  227. data/spec/support/sdam/single/direct_connection_standalone.yml +1 -1
  228. data/spec/support/sdam/single/ls_timeout_standalone.yml +35 -0
  229. data/spec/support/sdam/single/not_ok_response.yml +1 -1
  230. data/spec/support/sdam/single/standalone_removed.yml +1 -1
  231. data/spec/support/sdam/single/unavailable_seed.yml +1 -1
  232. data/spec/support/server_discovery_and_monitoring.rb +4 -0
  233. data/spec/support/shared/session.rb +236 -0
  234. metadata +53 -15
  235. metadata.gz.sig +0 -0
@@ -28,6 +28,25 @@ describe Mongo::Cursor::Builder::GetMoreCommand do
28
28
  specification[:selector]
29
29
  end
30
30
 
31
+ context 'when the operation has a session' do
32
+
33
+ let(:view) do
34
+ Mongo::Collection::View.new(authorized_collection)
35
+ end
36
+
37
+ let(:session) do
38
+ double('session')
39
+ end
40
+
41
+ let(:builder) do
42
+ described_class.new(cursor, session)
43
+ end
44
+
45
+ it 'adds the session to the specification' do
46
+ expect(builder.specification[:session]).to be(session)
47
+ end
48
+ end
49
+
31
50
  shared_examples_for 'a getmore command builder' do
32
51
 
33
52
  it 'includes the database name' do
@@ -5,7 +5,7 @@ describe Mongo::Cursor do
5
5
  describe '#each' do
6
6
 
7
7
  let(:server) do
8
- view.read.select_server(authorized_client.cluster)
8
+ view.send(:server_selector).select_server(authorized_client.cluster)
9
9
  end
10
10
 
11
11
  let(:reply) do
@@ -22,7 +22,7 @@ describe Mongo::Cursor do
22
22
  Mongo::Collection::View.new(authorized_collection)
23
23
  end
24
24
 
25
- context 'when the initial query retieves all documents' do
25
+ context 'when the initial query retrieves all documents' do
26
26
 
27
27
  let(:documents) do
28
28
  (1..10).map{ |i| { field: "test#{i}" }}
@@ -79,7 +79,8 @@ describe Mongo::Database do
79
79
  end
80
80
 
81
81
  it 'applies the options to the collection' do
82
- expect(collection.read_preference).to eq(Mongo::ServerSelector.get(mode: :secondary))
82
+ expect(collection.server_selector).to eq(Mongo::ServerSelector.get(mode: :secondary))
83
+ expect(collection.read_preference).to eq(BSON::Document.new(mode: :secondary))
83
84
  end
84
85
  end
85
86
  end
@@ -106,6 +107,19 @@ describe Mongo::Database do
106
107
  expect(database.collection_names).to_not include('system.indexes')
107
108
  end
108
109
 
110
+ context 'when provided a session' do
111
+
112
+ let(:operation) do
113
+ database.collection_names(session: session)
114
+ end
115
+
116
+ let(:client) do
117
+ authorized_client
118
+ end
119
+
120
+ it_behaves_like 'an operation using a session'
121
+ end
122
+
109
123
  context 'when specifying a batch size' do
110
124
 
111
125
  it 'returns the stripped names of the collections' do
@@ -223,6 +237,28 @@ describe Mongo::Database do
223
237
  expect(database.command(:ismaster => 1).written_count).to eq(0)
224
238
  end
225
239
 
240
+ it 'does not mutate the command selector' do
241
+ expect(database.command({:ismaster => 1}.freeze).written_count).to eq(0)
242
+ end
243
+
244
+ context 'when provided a session' do
245
+
246
+ let(:operation) do
247
+ database.command({ :ismaster => 1 }, session: session)
248
+ end
249
+
250
+ let(:failed_operation) do
251
+ database.command({ :invalid => 1 }, session: session)
252
+ end
253
+
254
+ let(:client) do
255
+ authorized_client
256
+ end
257
+
258
+ it_behaves_like 'an operation using a session'
259
+ it_behaves_like 'a failed operation using a session'
260
+ end
261
+
226
262
  context 'when a read concern is provided', if: find_command_enabled? do
227
263
 
228
264
  context 'when the read concern is valid' do
@@ -409,6 +445,19 @@ describe Mongo::Database do
409
445
  }.to raise_error(Mongo::Error::OperationFailure)
410
446
  end
411
447
 
448
+ context 'when provided a session' do
449
+
450
+ let(:operation) do
451
+ database.drop(session: session)
452
+ end
453
+
454
+ let(:client) do
455
+ authorized_client
456
+ end
457
+
458
+ it_behaves_like 'an operation using a session'
459
+ end
460
+
412
461
  context 'when the client/database has a write concern' do
413
462
 
414
463
  let(:client_options) do
@@ -3,7 +3,11 @@ require 'spec_helper'
3
3
  describe Mongo::Grid::FSBucket do
4
4
 
5
5
  let(:fs) do
6
- described_class.new(authorized_client.database, options)
6
+ described_class.new(client.database, options)
7
+ end
8
+
9
+ let(:client) do
10
+ authorized_client
7
11
  end
8
12
 
9
13
  let(:options) do
@@ -54,12 +58,8 @@ describe Mongo::Grid::FSBucket do
54
58
  { read: { mode: :secondary } }
55
59
  end
56
60
 
57
- let(:read_pref) do
58
- Mongo::ServerSelector.get(Mongo::Options::Redacted.new(options[:read].merge(authorized_client.options)))
59
- end
60
-
61
61
  it 'sets the read preference' do
62
- expect(fs.send(:read_preference)).to eq(read_pref)
62
+ expect(fs.send(:read_preference)).to eq(options[:read])
63
63
  end
64
64
  end
65
65
 
@@ -486,7 +486,7 @@ describe Mongo::Grid::FSBucket do
486
486
  context 'when a read stream is opened' do
487
487
 
488
488
  let(:fs) do
489
- described_class.new(authorized_client.database)
489
+ described_class.new(authorized_client.database, options)
490
490
  end
491
491
 
492
492
  let(:io) do
@@ -594,6 +594,29 @@ describe Mongo::Grid::FSBucket do
594
594
 
595
595
  describe '#download_to_stream' do
596
596
 
597
+ context 'sessions' do
598
+
599
+ let(:options) do
600
+ { session: session }
601
+ end
602
+
603
+ let(:file_id) do
604
+ fs.open_upload_stream(filename) do |stream|
605
+ stream.write(file)
606
+ end.file_id
607
+ end
608
+
609
+ let(:operation) do
610
+ fs.download_to_stream(file_id, io)
611
+ end
612
+
613
+ let(:client) do
614
+ authorized_client
615
+ end
616
+
617
+ it_behaves_like 'an operation using a session'
618
+ end
619
+
597
620
  context 'when the file is found' do
598
621
 
599
622
  let!(:file_id) do
@@ -678,12 +701,13 @@ describe Mongo::Grid::FSBucket do
678
701
  end
679
702
 
680
703
  it 'sets the read preference on the Stream::Read object' do
681
- expect(stream.read_preference).to eq(Mongo::ServerSelector.get(options[:read]))
704
+ expect(stream.read_preference).to eq(options[:read])
682
705
  end
683
706
  end
684
707
 
685
708
  describe '#download_to_stream_by_name' do
686
709
 
710
+
687
711
  let(:files) do
688
712
  [
689
713
  StringIO.new('hello 1'),
@@ -693,75 +717,105 @@ describe Mongo::Grid::FSBucket do
693
717
  ]
694
718
  end
695
719
 
696
- before do
697
- files.each do |file|
698
- fs.upload_from_stream('test.txt', file)
720
+ context ' when using a session' do
721
+
722
+ let(:options) do
723
+ { session: session }
699
724
  end
700
- end
701
725
 
702
- let(:io) do
703
- StringIO.new
704
- end
726
+ let(:operation) do
727
+ fs.download_to_stream_by_name('test.txt', io)
728
+ end
705
729
 
706
- context 'when revision is not specified' do
730
+ let(:client) do
731
+ authorized_client
732
+ end
707
733
 
708
- let!(:result) do
709
- fs.download_to_stream_by_name('test.txt', io)
734
+ before do
735
+ files.each do |file|
736
+ authorized_client.database.fs.upload_from_stream('test.txt', file)
737
+ end
710
738
  end
711
739
 
712
- it 'returns the most recent version' do
713
- expect(io.string).to eq('hello 4')
740
+ let(:io) do
741
+ StringIO.new
714
742
  end
743
+
744
+ it_behaves_like 'an operation using a session'
715
745
  end
716
746
 
717
- context 'when revision is 0' do
747
+ context 'when not using a session' do
718
748
 
719
- let!(:result) do
720
- fs.download_to_stream_by_name('test.txt', io, revision: 0)
749
+ before do
750
+ files.each do |file|
751
+ fs.upload_from_stream('test.txt', file)
752
+ end
721
753
  end
722
754
 
723
- it 'returns the original stored file' do
724
- expect(io.string).to eq('hello 1')
755
+ let(:io) do
756
+ StringIO.new
725
757
  end
726
- end
727
758
 
728
- context 'when revision is negative' do
759
+ context 'when revision is not specified' do
760
+
761
+ let!(:result) do
762
+ fs.download_to_stream_by_name('test.txt', io)
763
+ end
729
764
 
730
- let!(:result) do
731
- fs.download_to_stream_by_name('test.txt', io, revision: -2)
765
+ it 'returns the most recent version' do
766
+ expect(io.string).to eq('hello 4')
767
+ end
732
768
  end
733
769
 
734
- it 'returns that number of versions from the most recent' do
735
- expect(io.string).to eq('hello 3')
770
+ context 'when revision is 0' do
771
+
772
+ let!(:result) do
773
+ fs.download_to_stream_by_name('test.txt', io, revision: 0)
774
+ end
775
+
776
+ it 'returns the original stored file' do
777
+ expect(io.string).to eq('hello 1')
778
+ end
736
779
  end
737
- end
738
780
 
739
- context 'when revision is positive' do
781
+ context 'when revision is negative' do
782
+
783
+ let!(:result) do
784
+ fs.download_to_stream_by_name('test.txt', io, revision: -2)
785
+ end
740
786
 
741
- let!(:result) do
742
- fs.download_to_stream_by_name('test.txt', io, revision: 1)
787
+ it 'returns that number of versions from the most recent' do
788
+ expect(io.string).to eq('hello 3')
789
+ end
743
790
  end
744
791
 
745
- it 'returns that number revision' do
746
- expect(io.string).to eq('hello 2')
792
+ context 'when revision is positive' do
793
+
794
+ let!(:result) do
795
+ fs.download_to_stream_by_name('test.txt', io, revision: 1)
796
+ end
797
+
798
+ it 'returns that number revision' do
799
+ expect(io.string).to eq('hello 2')
800
+ end
747
801
  end
748
- end
749
802
 
750
- context 'when the file revision is not found' do
803
+ context 'when the file revision is not found' do
751
804
 
752
- it 'raises a FileNotFound error' do
753
- expect {
754
- fs.download_to_stream_by_name('test.txt', io, revision: 100)
755
- }.to raise_exception(Mongo::Error::InvalidFileRevision)
805
+ it 'raises a FileNotFound error' do
806
+ expect {
807
+ fs.download_to_stream_by_name('test.txt', io, revision: 100)
808
+ }.to raise_exception(Mongo::Error::InvalidFileRevision)
809
+ end
756
810
  end
757
- end
758
811
 
759
- context 'when the file is not found' do
812
+ context 'when the file is not found' do
760
813
 
761
- it 'raises a FileNotFound error' do
762
- expect {
763
- fs.download_to_stream_by_name('non-existent.txt', io)
764
- }.to raise_exception(Mongo::Error::FileNotFound)
814
+ it 'raises a FileNotFound error' do
815
+ expect {
816
+ fs.download_to_stream_by_name('non-existent.txt', io)
817
+ }.to raise_exception(Mongo::Error::FileNotFound)
818
+ end
765
819
  end
766
820
  end
767
821
  end
@@ -777,124 +831,154 @@ describe Mongo::Grid::FSBucket do
777
831
  ]
778
832
  end
779
833
 
780
- before do
781
- files.each do |file|
782
- fs.upload_from_stream('test.txt', file)
783
- end
784
- end
785
-
786
834
  let(:io) do
787
835
  StringIO.new
788
836
  end
789
837
 
790
- context 'when a block is provided' do
838
+ context ' when using a session' do
791
839
 
792
- let(:stream) do
793
- fs.open_download_stream_by_name('test.txt') do |stream|
794
- io.write(stream.read)
795
- end
840
+ let(:options) do
841
+ { session: session }
796
842
  end
797
843
 
798
- it 'returns a Stream::Read object' do
799
- expect(stream).to be_a(Mongo::Grid::FSBucket::Stream::Read)
844
+ let(:operation) do
845
+ fs.download_to_stream_by_name('test.txt', io)
800
846
  end
801
847
 
802
- it 'closes the stream after the block completes' do
803
- expect(stream.closed?).to be(true)
848
+ let(:client) do
849
+ authorized_client
804
850
  end
805
851
 
806
- it 'yields the stream to the block' do
807
- stream
808
- expect(io.size).to eq(files[0].size)
852
+ before do
853
+ files.each do |file|
854
+ authorized_client.database.fs.upload_from_stream('test.txt', file)
855
+ end
809
856
  end
810
857
 
811
- context 'when revision is not specified' do
858
+ let(:io) do
859
+ StringIO.new
860
+ end
812
861
 
813
- let!(:result) do
814
- fs.open_download_stream_by_name('test.txt') do |stream|
815
- io.write(stream.read)
816
- end
817
- end
862
+ it_behaves_like 'an operation using a session'
863
+ end
818
864
 
819
- it 'returns the most recent version' do
820
- expect(io.string).to eq('hello 4')
865
+ context 'when not using a session' do
866
+
867
+ before do
868
+ files.each do |file|
869
+ fs.upload_from_stream('test.txt', file)
821
870
  end
822
871
  end
823
872
 
824
- context 'when revision is 0' do
873
+ context 'when a block is provided' do
825
874
 
826
- let!(:result) do
827
- fs.open_download_stream_by_name('test.txt', revision: 0) do |stream|
875
+ let(:stream) do
876
+ fs.open_download_stream_by_name('test.txt') do |stream|
828
877
  io.write(stream.read)
829
878
  end
830
879
  end
831
880
 
832
- it 'returns the original stored file' do
833
- expect(io.string).to eq('hello 1')
881
+ it 'returns a Stream::Read object' do
882
+ expect(stream).to be_a(Mongo::Grid::FSBucket::Stream::Read)
834
883
  end
835
- end
836
884
 
837
- context 'when revision is negative' do
885
+ it 'closes the stream after the block completes' do
886
+ expect(stream.closed?).to be(true)
887
+ end
838
888
 
839
- let!(:result) do
840
- fs.open_download_stream_by_name('test.txt', revision: -2) do |stream|
841
- io.write(stream.read)
889
+ it 'yields the stream to the block' do
890
+ stream
891
+ expect(io.size).to eq(files[0].size)
892
+ end
893
+
894
+ context 'when revision is not specified' do
895
+
896
+ let!(:result) do
897
+ fs.open_download_stream_by_name('test.txt') do |stream|
898
+ io.write(stream.read)
899
+ end
900
+ end
901
+
902
+ it 'returns the most recent version' do
903
+ expect(io.string).to eq('hello 4')
842
904
  end
843
905
  end
844
906
 
845
- it 'returns that number of versions from the most recent' do
846
- expect(io.string).to eq('hello 3')
907
+ context 'when revision is 0' do
908
+
909
+ let!(:result) do
910
+ fs.open_download_stream_by_name('test.txt', revision: 0) do |stream|
911
+ io.write(stream.read)
912
+ end
913
+ end
914
+
915
+ it 'returns the original stored file' do
916
+ expect(io.string).to eq('hello 1')
917
+ end
847
918
  end
848
- end
849
919
 
850
- context 'when revision is positive' do
920
+ context 'when revision is negative' do
851
921
 
852
- let!(:result) do
853
- fs.open_download_stream_by_name('test.txt', revision: 1) do |stream|
854
- io.write(stream.read)
922
+ let!(:result) do
923
+ fs.open_download_stream_by_name('test.txt', revision: -2) do |stream|
924
+ io.write(stream.read)
925
+ end
926
+ end
927
+
928
+ it 'returns that number of versions from the most recent' do
929
+ expect(io.string).to eq('hello 3')
855
930
  end
856
931
  end
857
932
 
858
- it 'returns that number revision' do
859
- expect(io.string).to eq('hello 2')
933
+ context 'when revision is positive' do
934
+
935
+ let!(:result) do
936
+ fs.open_download_stream_by_name('test.txt', revision: 1) do |stream|
937
+ io.write(stream.read)
938
+ end
939
+ end
940
+
941
+ it 'returns that number revision' do
942
+ expect(io.string).to eq('hello 2')
943
+ end
860
944
  end
861
- end
862
945
 
863
- context 'when the file revision is not found' do
946
+ context 'when the file revision is not found' do
864
947
 
865
- it 'raises a FileNotFound error' do
866
- expect {
867
- fs.open_download_stream_by_name('test.txt', revision: 100)
868
- }.to raise_exception(Mongo::Error::InvalidFileRevision)
948
+ it 'raises a FileNotFound error' do
949
+ expect {
950
+ fs.open_download_stream_by_name('test.txt', revision: 100)
951
+ }.to raise_exception(Mongo::Error::InvalidFileRevision)
952
+ end
869
953
  end
870
- end
871
954
 
872
- context 'when the file is not found' do
955
+ context 'when the file is not found' do
873
956
 
874
- it 'raises a FileNotFound error' do
875
- expect {
876
- fs.open_download_stream_by_name('non-existent.txt')
877
- }.to raise_exception(Mongo::Error::FileNotFound)
957
+ it 'raises a FileNotFound error' do
958
+ expect {
959
+ fs.open_download_stream_by_name('non-existent.txt')
960
+ }.to raise_exception(Mongo::Error::FileNotFound)
961
+ end
878
962
  end
879
963
  end
880
- end
881
964
 
882
- context 'when a block is not provided' do
965
+ context 'when a block is not provided' do
883
966
 
884
- let!(:stream) do
885
- fs.open_download_stream_by_name('test.txt')
886
- end
967
+ let!(:stream) do
968
+ fs.open_download_stream_by_name('test.txt')
969
+ end
887
970
 
888
- it 'returns a Stream::Read object' do
889
- expect(stream).to be_a(Mongo::Grid::FSBucket::Stream::Read)
890
- end
971
+ it 'returns a Stream::Read object' do
972
+ expect(stream).to be_a(Mongo::Grid::FSBucket::Stream::Read)
973
+ end
891
974
 
892
- it 'does not close the stream' do
893
- expect(stream.closed?).to be(false)
894
- end
975
+ it 'does not close the stream' do
976
+ expect(stream.closed?).to be(false)
977
+ end
895
978
 
896
- it 'does not yield the stream to the block' do
897
- expect(io.size).to eq(0)
979
+ it 'does not yield the stream to the block' do
980
+ expect(io.size).to eq(0)
981
+ end
898
982
  end
899
983
  end
900
984
  end
@@ -941,32 +1025,36 @@ describe Mongo::Grid::FSBucket do
941
1025
 
942
1026
  context 'when a block is provided' do
943
1027
 
944
- let!(:stream) do
945
- fs.open_upload_stream(filename) do |stream|
946
- stream.write(file)
1028
+ context 'when a session is not used' do
1029
+
1030
+ let!(:stream) do
1031
+ fs.open_upload_stream(filename) do |stream|
1032
+ stream.write(file)
1033
+ end
947
1034
  end
948
- end
949
1035
 
950
- let(:result) do
951
- fs.find_one(filename: filename)
952
- end
1036
+ let(:result) do
1037
+ fs.find_one(filename: filename)
1038
+ end
953
1039
 
954
- it 'returns the stream' do
955
- expect(stream).to be_a(Mongo::Grid::FSBucket::Stream::Write)
956
- end
1040
+ it 'returns the stream' do
1041
+ expect(stream).to be_a(Mongo::Grid::FSBucket::Stream::Write)
1042
+ end
957
1043
 
958
- it 'creates an ObjectId for the file' do
959
- expect(stream.file_id).to be_a(BSON::ObjectId)
960
- end
1044
+ it 'creates an ObjectId for the file' do
1045
+ expect(stream.file_id).to be_a(BSON::ObjectId)
1046
+ end
961
1047
 
962
- it 'yields the stream to the block' do
963
- expect(result.data.size).to eq(file.size)
964
- end
1048
+ it 'yields the stream to the block' do
1049
+ expect(result.data.size).to eq(file.size)
1050
+ end
965
1051
 
966
- it 'closes the stream when the block completes' do
967
- expect(stream.closed?).to be(true)
1052
+ it 'closes the stream when the block completes' do
1053
+ expect(stream.closed?).to be(true)
1054
+ end
968
1055
  end
969
1056
  end
1057
+
970
1058
  end
971
1059
 
972
1060
  describe '#upload_from_stream' do