mongo 2.0.6 → 2.1.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 (119) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data.tar.gz.sig +0 -0
  4. data/lib/mongo.rb +2 -0
  5. data/lib/mongo/bulk_write.rb +1 -0
  6. data/lib/mongo/bulk_write/bulk_writable.rb +87 -31
  7. data/lib/mongo/bulk_write/deletable.rb +8 -7
  8. data/lib/mongo/bulk_write/insertable.rb +4 -3
  9. data/lib/mongo/bulk_write/ordered_bulk_write.rb +6 -6
  10. data/lib/mongo/bulk_write/replacable.rb +4 -3
  11. data/lib/mongo/bulk_write/result.rb +138 -0
  12. data/lib/mongo/bulk_write/unordered_bulk_write.rb +5 -8
  13. data/lib/mongo/bulk_write/updatable.rb +8 -7
  14. data/lib/mongo/client.rb +36 -4
  15. data/lib/mongo/cluster.rb +39 -4
  16. data/lib/mongo/cluster/topology/replica_set.rb +20 -4
  17. data/lib/mongo/cluster/topology/sharded.rb +1 -1
  18. data/lib/mongo/collection.rb +282 -29
  19. data/lib/mongo/collection/view/aggregation.rb +32 -4
  20. data/lib/mongo/collection/view/iterable.rb +2 -1
  21. data/lib/mongo/collection/view/map_reduce.rb +3 -1
  22. data/lib/mongo/collection/view/readable.rb +89 -14
  23. data/lib/mongo/collection/view/writable.rb +11 -5
  24. data/lib/mongo/cursor.rb +11 -3
  25. data/lib/mongo/dbref.rb +113 -0
  26. data/lib/mongo/error.rb +6 -2
  27. data/lib/mongo/error/parser.rb +1 -1
  28. data/lib/mongo/event/description_changed.rb +1 -1
  29. data/lib/mongo/grid/file.rb +1 -1
  30. data/lib/mongo/grid/fs.rb +2 -5
  31. data/lib/mongo/monitoring.rb +199 -0
  32. data/lib/mongo/monitoring/command_log_subscriber.rb +88 -0
  33. data/lib/mongo/monitoring/event.rb +17 -0
  34. data/lib/mongo/monitoring/event/command_failed.rb +96 -0
  35. data/lib/mongo/monitoring/event/command_started.rb +88 -0
  36. data/lib/mongo/monitoring/event/command_succeeded.rb +96 -0
  37. data/lib/mongo/monitoring/publishable.rb +96 -0
  38. data/lib/mongo/operation.rb +1 -0
  39. data/lib/mongo/operation/executable.rb +1 -1
  40. data/lib/mongo/operation/parallel_scan.rb +76 -0
  41. data/lib/mongo/operation/parallel_scan/result.rb +72 -0
  42. data/lib/mongo/operation/specifiable.rb +18 -0
  43. data/lib/mongo/operation/write/bulk/bulk_delete.rb +1 -1
  44. data/lib/mongo/operation/write/bulk/bulk_insert.rb +1 -1
  45. data/lib/mongo/operation/write/bulk/bulk_mergable.rb +2 -2
  46. data/lib/mongo/operation/write/bulk/bulk_update.rb +1 -1
  47. data/lib/mongo/operation/write/bulk/bulk_update/result.rb +13 -1
  48. data/lib/mongo/protocol/delete.rb +8 -13
  49. data/lib/mongo/protocol/get_more.rb +13 -13
  50. data/lib/mongo/protocol/insert.rb +8 -13
  51. data/lib/mongo/protocol/kill_cursors.rb +7 -11
  52. data/lib/mongo/protocol/query.rb +58 -20
  53. data/lib/mongo/protocol/reply.rb +12 -0
  54. data/lib/mongo/protocol/update.rb +13 -14
  55. data/lib/mongo/server.rb +23 -2
  56. data/lib/mongo/server/connectable.rb +0 -22
  57. data/lib/mongo/server/connection.rb +29 -0
  58. data/lib/mongo/server/description.rb +23 -1
  59. data/lib/mongo/server/monitor.rb +17 -1
  60. data/lib/mongo/server/monitor/connection.rb +24 -0
  61. data/lib/mongo/socket/ssl.rb +28 -16
  62. data/lib/mongo/socket/tcp.rb +1 -1
  63. data/lib/mongo/socket/unix.rb +1 -1
  64. data/lib/mongo/uri.rb +12 -5
  65. data/lib/mongo/version.rb +1 -1
  66. data/spec/mongo/auth/cr_spec.rb +9 -1
  67. data/spec/mongo/auth/ldap_spec.rb +9 -1
  68. data/spec/mongo/auth/scram_spec.rb +9 -1
  69. data/spec/mongo/auth/x509_spec.rb +9 -1
  70. data/spec/mongo/{bulk/bulk_write_spec.rb → bulk_write_spec.rb} +15 -15
  71. data/spec/mongo/client_spec.rb +42 -0
  72. data/spec/mongo/cluster/topology/replica_set_spec.rb +16 -9
  73. data/spec/mongo/cluster/topology/sharded_spec.rb +11 -3
  74. data/spec/mongo/cluster/topology/single_spec.rb +12 -4
  75. data/spec/mongo/cluster_spec.rb +55 -10
  76. data/spec/mongo/collection/view/aggregation_spec.rb +123 -1
  77. data/spec/mongo/collection/view/explainable_spec.rb +1 -1
  78. data/spec/mongo/collection/view/map_reduce_spec.rb +1 -1
  79. data/spec/mongo/collection/view/readable_spec.rb +251 -6
  80. data/spec/mongo/collection/view/writable_spec.rb +4 -4
  81. data/spec/mongo/collection/view_spec.rb +233 -71
  82. data/spec/mongo/collection_spec.rb +905 -9
  83. data/spec/mongo/crud_spec.rb +2 -2
  84. data/spec/mongo/cursor_spec.rb +3 -3
  85. data/spec/mongo/dbref_spec.rb +149 -0
  86. data/spec/mongo/monitoring_spec.rb +168 -0
  87. data/spec/mongo/operation/map_reduce_spec.rb +1 -1
  88. data/spec/mongo/operation/write/bulk/bulk_delete_spec.rb +1 -1
  89. data/spec/mongo/operation/write/bulk/bulk_insert_spec.rb +2 -2
  90. data/spec/mongo/operation/write/bulk/bulk_update_spec.rb +1 -1
  91. data/spec/mongo/operation/write/delete_spec.rb +1 -1
  92. data/spec/mongo/operation/write/insert_spec.rb +2 -2
  93. data/spec/mongo/operation/write/update_spec.rb +1 -1
  94. data/spec/mongo/protocol/query_spec.rb +0 -29
  95. data/spec/mongo/server/connection_pool_spec.rb +18 -6
  96. data/spec/mongo/server/connection_spec.rb +12 -4
  97. data/spec/mongo/server/description_spec.rb +7 -3
  98. data/spec/mongo/server/monitor_spec.rb +30 -0
  99. data/spec/mongo/server_discovery_and_monitoring_spec.rb +11 -4
  100. data/spec/mongo/server_selection_spec.rb +14 -6
  101. data/spec/mongo/server_spec.rb +27 -8
  102. data/spec/mongo/socket/ssl_spec.rb +94 -8
  103. data/spec/mongo/uri_spec.rb +25 -9
  104. data/spec/spec_helper.rb +29 -20
  105. data/spec/support/authorization.rb +19 -4
  106. data/spec/support/certificates/client.pem +4 -4
  107. data/spec/support/crud/read.rb +9 -10
  108. data/spec/support/crud/write.rb +24 -20
  109. data/spec/support/sdam/rs/equal_electionids.yml +45 -0
  110. data/spec/support/sdam/rs/new_primary_new_electionid.yml +98 -0
  111. data/spec/support/sdam/rs/null_election_id.yml +144 -0
  112. data/spec/support/sdam/rs/primary_disconnect_electionid.yml +124 -0
  113. data/spec/support/sdam/sharded/mongos_disconnect.yml +104 -0
  114. data/spec/support/server_discovery_and_monitoring.rb +19 -2
  115. data/spec/support/shared/bulk_write.rb +26 -22
  116. data/spec/support/shared/server_selector.rb +2 -1
  117. metadata +31 -7
  118. metadata.gz.sig +0 -0
  119. data/lib/mongo/error/invalid_uri_option.rb +0 -38
@@ -448,6 +448,17 @@ describe Mongo::Client do
448
448
 
449
449
  describe '#with' do
450
450
 
451
+ let(:client) do
452
+ described_class.new(['127.0.0.1:27017'], :database => TEST_DB)
453
+ end
454
+
455
+ context 'when providing nil' do
456
+
457
+ it 'returns the cloned client' do
458
+ expect(client.with(nil)).to eq(client)
459
+ end
460
+ end
461
+
451
462
  context 'when the write concern is not changed' do
452
463
 
453
464
  let(:client) do
@@ -592,4 +603,35 @@ describe Mongo::Client do
592
603
  end).to include('admin')
593
604
  end
594
605
  end
606
+
607
+ describe '#close' do
608
+
609
+ let(:client) do
610
+ described_class.new(['127.0.0.1:27017'])
611
+ end
612
+
613
+ before do
614
+ expect(client.cluster).to receive(:disconnect!).and_call_original
615
+ end
616
+
617
+ it 'disconnects the cluster and returns true' do
618
+ expect(client.close).to be(true)
619
+ end
620
+ end
621
+
622
+ describe '#reconnect' do
623
+
624
+ let(:client) do
625
+ described_class.new(['127.0.0.1:27017'])
626
+ end
627
+
628
+ before do
629
+ expect(client.cluster).to receive(:reconnect!).and_call_original
630
+ end
631
+
632
+ it 'reconnects the cluster and returns true' do
633
+ expect(client.reconnect).to be(true)
634
+ sleep(2)
635
+ end
636
+ end
595
637
  end
@@ -6,22 +6,30 @@ describe Mongo::Cluster::Topology::ReplicaSet do
6
6
  Mongo::Address.new('127.0.0.1:27017')
7
7
  end
8
8
 
9
+ let(:listeners) do
10
+ Mongo::Event::Listeners.new
11
+ end
12
+
13
+ let(:monitoring) do
14
+ Mongo::Monitoring.new
15
+ end
16
+
9
17
  describe '#servers' do
10
18
 
11
19
  let(:mongos) do
12
- Mongo::Server.new(address, double('cluster'), Mongo::Event::Listeners.new, TEST_OPTIONS)
20
+ Mongo::Server.new(address, double('cluster'), monitoring, listeners, TEST_OPTIONS)
13
21
  end
14
22
 
15
23
  let(:standalone) do
16
- Mongo::Server.new(address, double('cluster'), Mongo::Event::Listeners.new, TEST_OPTIONS)
24
+ Mongo::Server.new(address, double('cluster'), monitoring, listeners, TEST_OPTIONS)
17
25
  end
18
26
 
19
27
  let(:replica_set) do
20
- Mongo::Server.new(address, double('cluster'), Mongo::Event::Listeners.new, TEST_OPTIONS)
28
+ Mongo::Server.new(address, double('cluster'), monitoring, listeners, TEST_OPTIONS)
21
29
  end
22
30
 
23
31
  let(:replica_set_two) do
24
- Mongo::Server.new(address, double('cluster'), Mongo::Event::Listeners.new, TEST_OPTIONS)
32
+ Mongo::Server.new(address, double('cluster'), monitoring, listeners, TEST_OPTIONS)
25
33
  end
26
34
 
27
35
  let(:mongos_description) do
@@ -102,11 +110,11 @@ describe Mongo::Cluster::Topology::ReplicaSet do
102
110
  describe '#add_hosts?' do
103
111
 
104
112
  let(:primary) do
105
- Mongo::Server.new(address, double('cluster'), Mongo::Event::Listeners.new, TEST_OPTIONS)
113
+ Mongo::Server.new(address, double('cluster'), monitoring, listeners, TEST_OPTIONS)
106
114
  end
107
115
 
108
116
  let(:secondary) do
109
- Mongo::Server.new(address, double('cluster'), Mongo::Event::Listeners.new, TEST_OPTIONS)
117
+ Mongo::Server.new(address, double('cluster'), monitoring, listeners, TEST_OPTIONS)
110
118
  end
111
119
 
112
120
  let(:primary_description) do
@@ -183,7 +191,7 @@ describe Mongo::Cluster::Topology::ReplicaSet do
183
191
  describe '#remove_hosts?' do
184
192
 
185
193
  let(:primary) do
186
- Mongo::Server.new(address, double('cluster'), Mongo::Event::Listeners.new, TEST_OPTIONS)
194
+ Mongo::Server.new(address, double('cluster'), monitoring, listeners, TEST_OPTIONS)
187
195
  end
188
196
 
189
197
  let(:primary_description) do
@@ -262,7 +270,7 @@ describe Mongo::Cluster::Topology::ReplicaSet do
262
270
  describe '#remove_server?' do
263
271
 
264
272
  let(:secondary) do
265
- Mongo::Server.new(address, double('cluster'), Mongo::Event::Listeners.new, TEST_OPTIONS)
273
+ Mongo::Server.new(address, double('cluster'), monitoring, listeners, TEST_OPTIONS)
266
274
  end
267
275
 
268
276
  let(:secondary_description) do
@@ -346,6 +354,5 @@ describe Mongo::Cluster::Topology::ReplicaSet do
346
354
  expect(topology.remove_server?(description, secondary)).to eq(false)
347
355
  end
348
356
  end
349
-
350
357
  end
351
358
  end
@@ -10,17 +10,24 @@ describe Mongo::Cluster::Topology::Sharded do
10
10
  described_class.new({})
11
11
  end
12
12
 
13
+ let(:monitoring) do
14
+ Mongo::Monitoring.new
15
+ end
16
+
17
+ let(:listeners) do
18
+ Mongo::Event::Listeners.new
19
+ end
13
20
 
14
21
  let(:mongos) do
15
- Mongo::Server.new(address, double('cluster'), Mongo::Event::Listeners.new, TEST_OPTIONS)
22
+ Mongo::Server.new(address, double('cluster'), monitoring, listeners, TEST_OPTIONS)
16
23
  end
17
24
 
18
25
  let(:standalone) do
19
- Mongo::Server.new(address, double('cluster'), Mongo::Event::Listeners.new, TEST_OPTIONS)
26
+ Mongo::Server.new(address, double('cluster'), monitoring, listeners, TEST_OPTIONS)
20
27
  end
21
28
 
22
29
  let(:replica_set) do
23
- Mongo::Server.new(address, double('cluster'), Mongo::Event::Listeners.new, TEST_OPTIONS)
30
+ Mongo::Server.new(address, double('cluster'), monitoring, listeners, TEST_OPTIONS)
24
31
  end
25
32
 
26
33
  let(:mongos_description) do
@@ -99,6 +106,7 @@ describe Mongo::Cluster::Topology::Sharded do
99
106
  let(:description) do
100
107
  double('description').tap do |d|
101
108
  allow(d).to receive(:mongos?).and_return(false)
109
+ allow(d).to receive(:unknown?).and_return(false)
102
110
  allow(d).to receive(:is_server?).and_return(true)
103
111
  end
104
112
  end
@@ -10,22 +10,30 @@ describe Mongo::Cluster::Topology::Single do
10
10
  described_class.new({})
11
11
  end
12
12
 
13
+ let(:monitoring) do
14
+ Mongo::Monitoring.new
15
+ end
16
+
17
+ let(:listeners) do
18
+ Mongo::Event::Listeners.new
19
+ end
20
+
13
21
  describe '.servers' do
14
22
 
15
23
  let(:mongos) do
16
- Mongo::Server.new(address, double('cluster'), Mongo::Event::Listeners.new, TEST_OPTIONS)
24
+ Mongo::Server.new(address, double('cluster'), monitoring, listeners, TEST_OPTIONS)
17
25
  end
18
26
 
19
27
  let(:standalone) do
20
- Mongo::Server.new(address, double('cluster'), Mongo::Event::Listeners.new, TEST_OPTIONS)
28
+ Mongo::Server.new(address, double('cluster'), monitoring, listeners, TEST_OPTIONS)
21
29
  end
22
30
 
23
31
  let(:standalone_two) do
24
- Mongo::Server.new(address, double('cluster'), Mongo::Event::Listeners.new, TEST_OPTIONS)
32
+ Mongo::Server.new(address, double('cluster'), monitoring, listeners, TEST_OPTIONS)
25
33
  end
26
34
 
27
35
  let(:replica_set) do
28
- Mongo::Server.new(address, double('cluster'), Mongo::Event::Listeners.new, TEST_OPTIONS)
36
+ Mongo::Server.new(address, double('cluster'), monitoring, listeners, TEST_OPTIONS)
29
37
  end
30
38
 
31
39
  let(:mongos_description) do
@@ -2,8 +2,12 @@ require 'spec_helper'
2
2
 
3
3
  describe Mongo::Cluster do
4
4
 
5
+ let(:monitoring) do
6
+ Mongo::Monitoring.new
7
+ end
8
+
5
9
  let(:cluster) do
6
- described_class.new(ADDRESSES, TEST_OPTIONS)
10
+ described_class.new(ADDRESSES, monitoring, TEST_OPTIONS)
7
11
  end
8
12
 
9
13
  describe '#==' do
@@ -15,7 +19,7 @@ describe Mongo::Cluster do
15
19
  context 'when the options are the same' do
16
20
 
17
21
  let(:other) do
18
- described_class.new(ADDRESSES, TEST_OPTIONS)
22
+ described_class.new(ADDRESSES, monitoring, TEST_OPTIONS)
19
23
  end
20
24
 
21
25
  it 'returns true' do
@@ -26,7 +30,7 @@ describe Mongo::Cluster do
26
30
  context 'when the options are not the same' do
27
31
 
28
32
  let(:other) do
29
- described_class.new([ '127.0.0.1:27017' ], TEST_OPTIONS.merge(:replica_set => 'test'))
33
+ described_class.new([ '127.0.0.1:27017' ], monitoring, TEST_OPTIONS.merge(:replica_set => 'test'))
30
34
  end
31
35
 
32
36
  it 'returns false' do
@@ -38,7 +42,7 @@ describe Mongo::Cluster do
38
42
  context 'when the addresses are not the same' do
39
43
 
40
44
  let(:other) do
41
- described_class.new([ '127.0.0.1:27018' ], TEST_OPTIONS)
45
+ described_class.new([ '127.0.0.1:27018' ], monitoring, TEST_OPTIONS)
42
46
  end
43
47
 
44
48
  it 'returns false' do
@@ -76,8 +80,11 @@ describe Mongo::Cluster do
76
80
  context 'when the option is provided' do
77
81
 
78
82
  let(:cluster) do
79
- described_class.new([ '127.0.0.1:27017' ], TEST_OPTIONS.merge(:connect => :replica_set,
80
- :replica_set => 'testing'))
83
+ described_class.new(
84
+ [ '127.0.0.1:27017' ],
85
+ monitoring,
86
+ TEST_OPTIONS.merge(:connect => :replica_set, :replica_set => 'testing')
87
+ )
81
88
  end
82
89
 
83
90
  it 'returns the name' do
@@ -88,7 +95,7 @@ describe Mongo::Cluster do
88
95
  context 'when the option is not provided' do
89
96
 
90
97
  let(:cluster) do
91
- described_class.new([ '127.0.0.1:27017' ], TEST_OPTIONS.dup.delete_if { |k| k == :replica_set })
98
+ described_class.new([ '127.0.0.1:27017' ], monitoring, TEST_OPTIONS.dup.delete_if { |k| k == :replica_set })
92
99
  end
93
100
 
94
101
  it 'returns nil' do
@@ -210,6 +217,36 @@ describe Mongo::Cluster do
210
217
  end
211
218
  end
212
219
 
220
+ describe '#disconnect!' do
221
+
222
+ let(:known_servers) do
223
+ cluster.instance_variable_get(:@servers)
224
+ end
225
+
226
+ before do
227
+ known_servers.each do |server|
228
+ expect(server).to receive(:disconnect!).and_call_original
229
+ end
230
+ end
231
+
232
+ it 'disconnects each server and returns true' do
233
+ expect(cluster.disconnect!).to be(true)
234
+ end
235
+ end
236
+
237
+ describe '#reconnect!' do
238
+
239
+ before do
240
+ cluster.servers.each do |server|
241
+ expect(server).to receive(:reconnect!).and_call_original
242
+ end
243
+ end
244
+
245
+ it 'reconnects each server and returns true' do
246
+ expect(cluster.reconnect!).to be(true)
247
+ end
248
+ end
249
+
213
250
  describe '#remove' do
214
251
 
215
252
  let(:address_a) do
@@ -220,12 +257,16 @@ describe Mongo::Cluster do
220
257
  Mongo::Address.new('127.0.0.1:27018')
221
258
  end
222
259
 
260
+ let(:monitoring) do
261
+ Mongo::Monitoring.new
262
+ end
263
+
223
264
  let(:server_a) do
224
- Mongo::Server.new(address_a, cluster, Mongo::Event::Listeners.new)
265
+ Mongo::Server.new(address_a, cluster, monitoring, Mongo::Event::Listeners.new)
225
266
  end
226
267
 
227
268
  let(:server_b) do
228
- Mongo::Server.new(address_b, cluster, Mongo::Event::Listeners.new)
269
+ Mongo::Server.new(address_b, cluster, monitoring, Mongo::Event::Listeners.new)
229
270
  end
230
271
 
231
272
  let(:servers) do
@@ -309,8 +350,12 @@ describe Mongo::Cluster do
309
350
  Mongo::Address.new('127.0.0.1:27017')
310
351
  end
311
352
 
353
+ let(:monitoring) do
354
+ Mongo::Monitoring.new
355
+ end
356
+
312
357
  let(:server) do
313
- Mongo::Server.new(address, cluster, listeners)
358
+ Mongo::Server.new(address, cluster, monitoring, listeners)
314
359
  end
315
360
 
316
361
  let(:servers) do
@@ -61,7 +61,7 @@ describe Mongo::Collection::View::Aggregation do
61
61
  end
62
62
 
63
63
  after do
64
- authorized_collection.find.delete_many
64
+ authorized_collection.delete_many
65
65
  end
66
66
 
67
67
  context 'when a block is provided' do
@@ -176,6 +176,128 @@ describe Mongo::Collection::View::Aggregation do
176
176
  it 'includes the option in the spec' do
177
177
  expect(aggregation.send(:aggregate_spec)[:selector][:allowDiskUse]).to eq(true)
178
178
  end
179
+
180
+ context 'when allow_disk_use is specified as an option' do
181
+
182
+ let(:options) do
183
+ { :allow_disk_use => true }
184
+ end
185
+
186
+ let(:aggregation) do
187
+ described_class.new(view, pipeline, options)
188
+ end
189
+
190
+ it 'includes the option in the spec' do
191
+ expect(aggregation.send(:aggregate_spec)[:selector][:allowDiskUse]).to eq(true)
192
+ end
193
+
194
+ context 'when #allow_disk_use is also called' do
195
+
196
+ let(:options) do
197
+ { :allow_disk_use => true }
198
+ end
199
+
200
+ let(:aggregation) do
201
+ described_class.new(view, pipeline, options).allow_disk_use(false)
202
+ end
203
+
204
+ it 'overrides the first option with the second' do
205
+ expect(aggregation.send(:aggregate_spec)[:selector][:allowDiskUse]).to eq(false)
206
+ end
207
+ end
208
+ end
209
+ end
210
+
211
+ context 'when max_time_ms is an option' do
212
+
213
+ let(:options) do
214
+ { :max_time_ms => 100 }
215
+ end
216
+
217
+ it 'includes the option in the spec' do
218
+ expect(aggregation.send(:aggregate_spec)[:selector][:maxTimeMS]).to eq(options[:max_time_ms])
219
+ end
220
+ end
221
+
222
+ context 'when batch_size is set' do
223
+
224
+ context 'when batch_size is set on the view' do
225
+
226
+ let(:view_options) do
227
+ { :batch_size => 10 }
228
+ end
229
+
230
+ it 'uses the batch_size on the view' do
231
+ expect(aggregation.send(:aggregate_spec)[:selector][:cursor][:batchSize]).to eq(view_options[:batch_size])
232
+ end
233
+ end
234
+
235
+ context 'when batch_size is provided in the options' do
236
+
237
+ let(:options) do
238
+ { :batch_size => 20 }
239
+ end
240
+
241
+ it 'includes the option in the spec' do
242
+ expect(aggregation.send(:aggregate_spec)[:selector][:cursor][:batchSize]).to eq(options[:batch_size])
243
+ end
244
+
245
+ context 'when batch_size is also set on the view' do
246
+
247
+ let(:view_options) do
248
+ { :batch_size => 10 }
249
+ end
250
+
251
+ it 'overrides the view batch_size with the option batch_size' do
252
+ expect(aggregation.send(:aggregate_spec)[:selector][:cursor][:batchSize]).to eq(options[:batch_size])
253
+ end
254
+ end
255
+ end
256
+ end
257
+
258
+ context 'when use_cursor is set' do
259
+
260
+ context 'when use_cursor is true' do
261
+
262
+ context 'when batch_size is set' do
263
+
264
+ let(:options) do
265
+ { :use_cursor => true,
266
+ :batch_size => 10
267
+ }
268
+ end
269
+
270
+ it 'sets a batch size document in the spec' do
271
+ expect(aggregation.send(:aggregate_spec)[:selector][:cursor][:batchSize]).to eq(options[:batch_size])
272
+ end
273
+ end
274
+
275
+ context 'when batch_size is not set' do
276
+
277
+ let(:options) do
278
+ { :use_cursor => true }
279
+ end
280
+
281
+ it 'sets an empty document in the spec' do
282
+ expect(aggregation.send(:aggregate_spec)[:selector][:cursor]).to eq({})
283
+ end
284
+ end
285
+
286
+ end
287
+
288
+ context 'when use_cursor is false' do
289
+
290
+ let(:options) do
291
+ { :use_cursor => false }
292
+ end
293
+
294
+ context 'when batch_size is set' do
295
+
296
+ it 'does not set the cursor option in the spec' do
297
+ expect(aggregation.send(:aggregate_spec)[:selector][:cursor]).to be_nil
298
+ end
299
+ end
300
+ end
179
301
  end
180
302
  end
181
303
  end