mongo 1.8.0 → 1.8.2

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 (80) hide show
  1. data/README.md +14 -29
  2. data/VERSION +1 -1
  3. data/lib/mongo.rb +3 -0
  4. data/lib/mongo/collection.rb +99 -49
  5. data/lib/mongo/cursor.rb +17 -17
  6. data/lib/mongo/db.rb +30 -14
  7. data/lib/mongo/gridfs/grid.rb +5 -3
  8. data/lib/mongo/gridfs/grid_file_system.rb +5 -3
  9. data/lib/mongo/gridfs/grid_io.rb +5 -3
  10. data/lib/mongo/legacy.rb +9 -2
  11. data/lib/mongo/mongo_client.rb +100 -72
  12. data/lib/mongo/mongo_replica_set_client.rb +46 -60
  13. data/lib/mongo/mongo_sharded_client.rb +5 -66
  14. data/lib/mongo/networking.rb +2 -1
  15. data/lib/mongo/util/node.rb +41 -42
  16. data/lib/mongo/util/pool.rb +15 -43
  17. data/lib/mongo/util/pool_manager.rb +16 -65
  18. data/lib/mongo/util/read_preference.rb +82 -0
  19. data/lib/mongo/util/sharding_pool_manager.rb +0 -86
  20. data/lib/mongo/util/ssl_socket.rb +2 -1
  21. data/lib/mongo/util/support.rb +8 -18
  22. data/lib/mongo/util/tcp_socket.rb +5 -4
  23. data/lib/mongo/util/thread_local_variable_manager.rb +29 -0
  24. data/lib/mongo/util/unix_socket.rb +23 -0
  25. data/lib/mongo/util/uri_parser.rb +31 -18
  26. data/lib/mongo/util/write_concern.rb +7 -2
  27. data/mongo.gemspec +1 -1
  28. data/test/auxillary/repl_set_auth_test.rb +2 -2
  29. data/test/bson/bson_test.rb +1 -1
  30. data/test/bson/byte_buffer_test.rb +24 -26
  31. data/test/bson/hash_with_indifferent_access_test.rb +11 -1
  32. data/test/functional/collection_test.rb +16 -16
  33. data/test/functional/connection_test.rb +1 -4
  34. data/test/functional/db_api_test.rb +14 -10
  35. data/test/functional/pool_test.rb +23 -31
  36. data/test/functional/timeout_test.rb +3 -5
  37. data/test/functional/uri_test.rb +10 -5
  38. data/test/replica_set/basic_test.rb +3 -8
  39. data/test/replica_set/client_test.rb +47 -31
  40. data/test/replica_set/complex_connect_test.rb +12 -10
  41. data/test/replica_set/connection_test.rb +8 -151
  42. data/test/replica_set/count_test.rb +9 -5
  43. data/test/replica_set/cursor_test.rb +17 -27
  44. data/test/replica_set/insert_test.rb +5 -10
  45. data/test/replica_set/query_test.rb +4 -9
  46. data/test/replica_set/read_preference_test.rb +200 -0
  47. data/test/replica_set/refresh_test.rb +54 -65
  48. data/test/replica_set/replication_ack_test.rb +16 -14
  49. data/test/sharded_cluster/basic_test.rb +30 -0
  50. data/test/test_helper.rb +33 -15
  51. data/test/threading/basic_test.rb +79 -0
  52. data/test/tools/mongo_config.rb +62 -22
  53. data/test/unit/client_test.rb +36 -14
  54. data/test/unit/collection_test.rb +23 -0
  55. data/test/unit/connection_test.rb +30 -14
  56. data/test/unit/cursor_test.rb +137 -7
  57. data/test/unit/db_test.rb +17 -4
  58. data/test/unit/grid_test.rb +2 -2
  59. data/test/unit/node_test.rb +2 -1
  60. data/test/unit/pool_manager_test.rb +29 -1
  61. data/test/unit/read_test.rb +15 -15
  62. data/test/unit/safe_test.rb +4 -4
  63. data/test/unit/write_concern_test.rb +4 -4
  64. metadata +134 -143
  65. data/examples/admin.rb +0 -43
  66. data/examples/capped.rb +0 -22
  67. data/examples/cursor.rb +0 -48
  68. data/examples/gridfs.rb +0 -44
  69. data/examples/index_test.rb +0 -126
  70. data/examples/info.rb +0 -31
  71. data/examples/queries.rb +0 -74
  72. data/examples/replica_set.rb +0 -26
  73. data/examples/simple.rb +0 -25
  74. data/examples/strict.rb +0 -35
  75. data/examples/types.rb +0 -36
  76. data/examples/web/thin/load.rb +0 -23
  77. data/examples/web/unicorn/load.rb +0 -25
  78. data/test/support/hash_with_indifferent_access.rb +0 -186
  79. data/test/support/keys.rb +0 -45
  80. data/test/threading/threading_with_large_pool_test.rb +0 -90
@@ -2,7 +2,7 @@ require 'test_helper'
2
2
  include Mongo
3
3
 
4
4
  class ClientTest < Test::Unit::TestCase
5
- context "Mongo::MongoClient intialization " do
5
+ context "Mongo::MongoClient initialization " do
6
6
  context "given a single node" do
7
7
  setup do
8
8
  @client = MongoClient.new('localhost', 27017, :connect => false)
@@ -31,12 +31,12 @@ class ClientTest < Test::Unit::TestCase
31
31
  assert !@client.slave_ok?
32
32
  end
33
33
 
34
- should "raise exception for invalid host or port" do
35
- assert_raise MongoArgumentError do
36
- MongoClient.new(:w => 1)
34
+ should "not raise error if no host or port is supplied" do
35
+ assert_nothing_raised do
36
+ MongoClient.new(:w => 1, :connect => false)
37
37
  end
38
- assert_raise MongoArgumentError do
39
- MongoClient.new('localhost', :w => 1)
38
+ assert_nothing_raised do
39
+ MongoClient.new('localhost', :w => 1, :connect=> false)
40
40
  end
41
41
  end
42
42
 
@@ -67,25 +67,47 @@ class ClientTest < Test::Unit::TestCase
67
67
  args = [['localhost:27017'], opts]
68
68
  client.send(:initialize, *args)
69
69
  end
70
+
71
+ should "throw error if superflous arguments are specified" do
72
+ assert_raise MongoArgumentError do
73
+ MongoReplicaSetClient.new(['localhost:27017'], ['localhost:27018'], {:connect => false})
74
+ end
75
+ end
76
+ end
77
+ end
78
+
79
+ context "initializing with a unix socket" do
80
+ setup do
81
+ @connection = Mongo::Connection.new('/tmp/mongod.sock', :safe => true, :connect => false)
82
+ UNIXSocket.stubs(:new).returns(new_mock_unix_socket)
83
+ end
84
+ should "parse a unix socket" do
85
+ assert_equal "/tmp/mongod.sock", @connection.host_port.first
70
86
  end
71
87
  end
72
88
 
73
89
  context "initializing with a mongodb uri" do
74
90
  should "parse a simple uri" do
75
91
  @client = MongoClient.from_uri("mongodb://localhost", :connect => false)
76
- assert_equal ['localhost', 27017], @client.host_to_try
92
+ assert_equal ['localhost', 27017], @client.host_port
77
93
  end
78
94
 
95
+ #should "parse a unix socket" do
96
+ # socket_address = "/tmp/mongodb-27017.sock"
97
+ # @client = MongoClient.from_uri("mongodb://#{socket_address}")
98
+ # assert_equal socket_address, @client.host_port.first
99
+ #end
100
+
79
101
  should "allow a complex host names" do
80
102
  host_name = "foo.bar-12345.org"
81
103
  @client = MongoClient.from_uri("mongodb://#{host_name}", :connect => false)
82
- assert_equal [host_name, 27017], @client.host_to_try
104
+ assert_equal [host_name, 27017], @client.host_port
83
105
  end
84
106
 
85
107
  should "allow db without username and password" do
86
108
  host_name = "foo.bar-12345.org"
87
109
  @client = MongoClient.from_uri("mongodb://#{host_name}/foo", :connect => false)
88
- assert_equal [host_name, 27017], @client.host_to_try
110
+ assert_equal [host_name, 27017], @client.host_port
89
111
  end
90
112
 
91
113
  should "set write concern options on connection" do
@@ -105,7 +127,7 @@ class ClientTest < Test::Unit::TestCase
105
127
 
106
128
  should "parse a uri with a hyphen & underscore in the username or password" do
107
129
  @client = MongoClient.from_uri("mongodb://hyphen-user_name:p-s_s@localhost:27017/db", :connect => false)
108
- assert_equal ['localhost', 27017], @client.host_to_try
130
+ assert_equal ['localhost', 27017], @client.host_port
109
131
  auth_hash = { 'db_name' => 'db', 'username' => 'hyphen-user_name', "password" => 'p-s_s' }
110
132
  assert_equal auth_hash, @client.auths[0]
111
133
  end
@@ -151,21 +173,21 @@ class ClientTest < Test::Unit::TestCase
151
173
  should "parse a simple uri" do
152
174
  ENV['MONGODB_URI'] = "mongodb://localhost?connect=false"
153
175
  @client = MongoClient.new
154
- assert_equal ['localhost', 27017], @client.host_to_try
176
+ assert_equal ['localhost', 27017], @client.host_port
155
177
  end
156
178
 
157
179
  should "allow a complex host names" do
158
180
  host_name = "foo.bar-12345.org"
159
181
  ENV['MONGODB_URI'] = "mongodb://#{host_name}?connect=false"
160
182
  @client = MongoClient.new
161
- assert_equal [host_name, 27017], @client.host_to_try
183
+ assert_equal [host_name, 27017], @client.host_port
162
184
  end
163
185
 
164
186
  should "allow db without username and password" do
165
187
  host_name = "foo.bar-12345.org"
166
188
  ENV['MONGODB_URI'] = "mongodb://#{host_name}/foo?connect=false"
167
189
  @client = MongoClient.new
168
- assert_equal [host_name, 27017], @client.host_to_try
190
+ assert_equal [host_name, 27017], @client.host_port
169
191
  end
170
192
 
171
193
  should "set write concern options on connection" do
@@ -188,7 +210,7 @@ class ClientTest < Test::Unit::TestCase
188
210
  should "parse a uri with a hyphen & underscore in the username or password" do
189
211
  ENV['MONGODB_URI'] = "mongodb://hyphen-user_name:p-s_s@localhost:27017/db?connect=false"
190
212
  @client = MongoClient.new
191
- assert_equal ['localhost', 27017], @client.host_to_try
213
+ assert_equal ['localhost', 27017], @client.host_port
192
214
  auth_hash = { 'db_name' => 'db', 'username' => 'hyphen-user_name', "password" => 'p-s_s' }
193
215
  assert_equal auth_hash, @client.auths[0]
194
216
  end
@@ -140,6 +140,29 @@ class CollectionTest < Test::Unit::TestCase
140
140
  @coll.ensure_index [["x", Mongo::DESCENDING], ["y", Mongo::DESCENDING]]
141
141
  end
142
142
 
143
+ should "call generate_indexes for each key when calling ensure_indexes with a hash" do
144
+ @client = MongoClient.new('localhost', 27017, :logger => @logger, :connect => false)
145
+ @db = @client['testing']
146
+ @db.cache_time = 300
147
+ @coll = @db.collection('books')
148
+ oh = BSON::OrderedHash.new
149
+ oh['x'] = Mongo::DESCENDING
150
+ oh['y'] = Mongo::DESCENDING
151
+ @coll.expects(:generate_indexes).once.with do |a, b, c|
152
+ a == oh
153
+ end
154
+
155
+ if RUBY_VERSION > '1.9'
156
+ @coll.ensure_index({"x" => Mongo::DESCENDING, "y" => Mongo::DESCENDING})
157
+ else
158
+ ordered_hash = BSON::OrderedHash.new
159
+ ordered_hash['x'] = Mongo::DESCENDING
160
+ ordered_hash['y'] = Mongo::DESCENDING
161
+ @coll.ensure_index(ordered_hash)
162
+ end
163
+ end
164
+
165
+
143
166
  should "use the connection's logger" do
144
167
  @client = MongoClient.new('localhost', 27017, :logger => @logger, :connect => false)
145
168
  @db = @client['testing']
@@ -1,7 +1,7 @@
1
1
  require 'test_helper'
2
2
 
3
3
  class ConnectionTest < Test::Unit::TestCase
4
- context "Mongo::MongoClient intialization " do
4
+ context "Mongo::MongoClient initialization " do
5
5
  context "given a single node" do
6
6
  setup do
7
7
  @connection = Mongo::Connection.new('localhost', 27017, :safe => true, :connect => false)
@@ -30,12 +30,12 @@ class ConnectionTest < Test::Unit::TestCase
30
30
  assert !@connection.slave_ok?
31
31
  end
32
32
 
33
- should "raise exception for invalid host or port" do
34
- assert_raise MongoArgumentError do
35
- Mongo::Connection.new(:safe => true)
33
+ should "not raise error if no host or port is supplied" do
34
+ assert_nothing_raised do
35
+ Mongo::Connection.new(:safe => true, :connect => false)
36
36
  end
37
- assert_raise MongoArgumentError do
38
- Mongo::Connection.new('localhost', :safe => true)
37
+ assert_nothing_raised do
38
+ Mongo::Connection.new('localhost', :safe => true, :connect => false)
39
39
  end
40
40
  end
41
41
 
@@ -70,22 +70,38 @@ class ConnectionTest < Test::Unit::TestCase
70
70
  end
71
71
  end
72
72
 
73
+ context "initializing with a unix socket" do
74
+ setup do
75
+ @connection = Mongo::Connection.new('/tmp/mongod.sock', :safe => true, :connect => false)
76
+ UNIXSocket.stubs(:new).returns(new_mock_unix_socket)
77
+ end
78
+ should "parse a unix socket" do
79
+ assert_equal "/tmp/mongod.sock", @connection.host_port.first
80
+ end
81
+ end
82
+
73
83
  context "initializing with a mongodb uri" do
74
84
  should "parse a simple uri" do
75
85
  @connection = Mongo::Connection.from_uri("mongodb://localhost", :connect => false)
76
- assert_equal ['localhost', 27017], @connection.host_to_try
86
+ assert_equal ['localhost', 27017], @connection.host_port
77
87
  end
78
88
 
89
+ #should "parse a unix socket" do
90
+ # socket_address = "/tmp/mongodb-27017.sock"
91
+ # @client = MongoClient.from_uri("mongodb://#{socket_address}")
92
+ # assert_equal socket_address, @client.host_port.first
93
+ #end
94
+
79
95
  should "allow a complex host names" do
80
96
  host_name = "foo.bar-12345.org"
81
97
  @connection = Mongo::Connection.from_uri("mongodb://#{host_name}", :connect => false)
82
- assert_equal [host_name, 27017], @connection.host_to_try
98
+ assert_equal [host_name, 27017], @connection.host_port
83
99
  end
84
100
 
85
101
  should "allow db without username and password" do
86
102
  host_name = "foo.bar-12345.org"
87
103
  @connection = Mongo::Connection.from_uri("mongodb://#{host_name}/foo", :connect => false)
88
- assert_equal [host_name, 27017], @connection.host_to_try
104
+ assert_equal [host_name, 27017], @connection.host_port
89
105
  end
90
106
 
91
107
  should "set safe options on connection" do
@@ -105,7 +121,7 @@ class ConnectionTest < Test::Unit::TestCase
105
121
 
106
122
  should "parse a uri with a hyphen & underscore in the username or password" do
107
123
  @connection = Mongo::Connection.from_uri("mongodb://hyphen-user_name:p-s_s@localhost:27017/db", :connect => false)
108
- assert_equal ['localhost', 27017], @connection.host_to_try
124
+ assert_equal ['localhost', 27017], @connection.host_port
109
125
  auth_hash = { 'db_name' => 'db', 'username' => 'hyphen-user_name', "password" => 'p-s_s' }
110
126
  assert_equal auth_hash, @connection.auths[0]
111
127
  end
@@ -151,21 +167,21 @@ class ConnectionTest < Test::Unit::TestCase
151
167
  should "parse a simple uri" do
152
168
  ENV['MONGODB_URI'] = "mongodb://localhost?connect=false"
153
169
  @connection = Mongo::Connection.new
154
- assert_equal ['localhost', 27017], @connection.host_to_try
170
+ assert_equal ['localhost', 27017], @connection.host_port
155
171
  end
156
172
 
157
173
  should "allow a complex host names" do
158
174
  host_name = "foo.bar-12345.org"
159
175
  ENV['MONGODB_URI'] = "mongodb://#{host_name}?connect=false"
160
176
  @connection = Mongo::Connection.new
161
- assert_equal [host_name, 27017], @connection.host_to_try
177
+ assert_equal [host_name, 27017], @connection.host_port
162
178
  end
163
179
 
164
180
  should "allow db without username and password" do
165
181
  host_name = "foo.bar-12345.org"
166
182
  ENV['MONGODB_URI'] = "mongodb://#{host_name}/foo?connect=false"
167
183
  @connection = Mongo::Connection.new
168
- assert_equal [host_name, 27017], @connection.host_to_try
184
+ assert_equal [host_name, 27017], @connection.host_port
169
185
  end
170
186
 
171
187
  should "set safe options on connection" do
@@ -188,7 +204,7 @@ class ConnectionTest < Test::Unit::TestCase
188
204
  should "parse a uri with a hyphen & underscore in the username or password" do
189
205
  ENV['MONGODB_URI'] = "mongodb://hyphen-user_name:p-s_s@localhost:27017/db?connect=false"
190
206
  @connection = Mongo::Connection.new
191
- assert_equal ['localhost', 27017], @connection.host_to_try
207
+ assert_equal ['localhost', 27017], @connection.host_port
192
208
  auth_hash = { 'db_name' => 'db', 'username' => 'hyphen-user_name', "password" => 'p-s_s' }
193
209
  assert_equal auth_hash, @connection.auths[0]
194
210
  end
@@ -1,18 +1,22 @@
1
1
  require 'test_helper'
2
2
 
3
3
  class CursorTest < Test::Unit::TestCase
4
+ class Mongo::Cursor
5
+ public :construct_query_spec
6
+ end
7
+
4
8
  context "Cursor options" do
5
9
  setup do
6
10
  @logger = mock()
7
11
  @logger.stubs(:debug)
8
12
  @connection = stub(:class => MongoClient, :logger => @logger,
9
- :slave_ok? => false, :read_preference => :primary, :log_duration => false,
10
- :tag_sets => {}, :acceptable_latency => 10)
13
+ :slave_ok? => false, :read => :primary, :log_duration => false,
14
+ :tag_sets => [], :acceptable_latency => 10)
11
15
  @db = stub(:name => "testing", :slave_ok? => false,
12
- :connection => @connection, :read_preference => :primary,
13
- :tag_sets => {}, :acceptable_latency => 10)
14
- @collection = stub(:db => @db, :name => "items", :read_preference => :primary,
15
- :tag_sets => {}, :acceptable_latency => 10)
16
+ :connection => @connection, :read => :primary,
17
+ :tag_sets => [], :acceptable_latency => 10)
18
+ @collection = stub(:db => @db, :name => "items", :read => :primary,
19
+ :tag_sets => [], :acceptable_latency => 10)
16
20
  @cursor = Cursor.new(@collection)
17
21
  end
18
22
 
@@ -107,6 +111,105 @@ class CursorTest < Test::Unit::TestCase
107
111
  @cursor.batch_size(100)
108
112
  assert_equal 100, @cursor.batch_size
109
113
  end
114
+
115
+ context "conected to mongos" do
116
+ setup do
117
+ @connection.stubs(:mongos?).returns(true)
118
+ @tag_sets = [{:dc => "ny"}]
119
+ end
120
+
121
+ should "set $readPreference" do
122
+ # secondary
123
+ cursor = Cursor.new(@collection, { :read => :secondary })
124
+
125
+ spec = cursor.construct_query_spec
126
+ assert spec.has_key?('$readPreference')
127
+ assert_equal :secondary, spec['$readPreference'][:mode]
128
+ assert !spec['$readPreference'].has_key?(:tags)
129
+
130
+ # secondary preferred with tags
131
+ cursor = Cursor.new(@collection, { :read => :secondary_preferred, :tag_sets => @tag_sets })
132
+
133
+ spec = cursor.construct_query_spec
134
+ assert spec.has_key?('$readPreference')
135
+ assert_equal :secondaryPreferred, spec['$readPreference'][:mode]
136
+ assert_equal @tag_sets, spec['$readPreference'][:tags]
137
+
138
+ # primary preferred
139
+ cursor = Cursor.new(@collection, { :read => :primary_preferred })
140
+
141
+ spec = cursor.construct_query_spec
142
+ assert spec.has_key?('$readPreference')
143
+ assert_equal :primaryPreferred, spec['$readPreference'][:mode]
144
+ assert !spec['$readPreference'].has_key?(:tags)
145
+
146
+ # primary preferred with tags
147
+ cursor = Cursor.new(@collection, { :read => :primary_preferred, :tag_sets => @tag_sets })
148
+
149
+ spec = cursor.construct_query_spec
150
+ assert spec.has_key?('$readPreference')
151
+ assert_equal :primaryPreferred, spec['$readPreference'][:mode]
152
+ assert_equal @tag_sets, spec['$readPreference'][:tags]
153
+
154
+ # nearest
155
+ cursor = Cursor.new(@collection, { :read => :nearest })
156
+
157
+ spec = cursor.construct_query_spec
158
+ assert spec.has_key?('$readPreference')
159
+ assert_equal :nearest, spec['$readPreference'][:mode]
160
+ assert !spec['$readPreference'].has_key?(:tags)
161
+
162
+ # nearest with tags
163
+ cursor = Cursor.new(@collection, { :read => :nearest, :tag_sets => @tag_sets })
164
+
165
+ spec = cursor.construct_query_spec
166
+ assert spec.has_key?('$readPreference')
167
+ assert_equal :nearest, spec['$readPreference'][:mode]
168
+ assert_equal @tag_sets, spec['$readPreference'][:tags]
169
+ end
170
+
171
+ should "not set $readPreference" do
172
+ # for primary
173
+ cursor = Cursor.new(@collection, { :read => :primary, :tag_sets => @tag_sets })
174
+ assert !cursor.construct_query_spec.has_key?('$readPreference')
175
+
176
+ # for secondary_preferred with no tags
177
+ cursor = Cursor.new(@collection, { :read => :secondary_preferred })
178
+ assert !cursor.construct_query_spec.has_key?('$readPreference')
179
+
180
+ cursor = Cursor.new(@collection, { :read => :secondary_preferred, :tag_sets => [] })
181
+ assert !cursor.construct_query_spec.has_key?('$readPreference')
182
+
183
+ cursor = Cursor.new(@collection, { :read => :secondary_preferred, :tag_sets => nil })
184
+ assert !cursor.construct_query_spec.has_key?('$readPreference')
185
+ end
186
+ end
187
+
188
+ context "not conected to mongos" do
189
+ setup do
190
+ @connection.stubs(:mongos?).returns(false)
191
+ end
192
+
193
+ should "not set $readPreference" do
194
+ cursor = Cursor.new(@collection, { :read => :primary })
195
+ assert !cursor.construct_query_spec.has_key?('$readPreference')
196
+
197
+ cursor = Cursor.new(@collection, { :read => :primary_preferred })
198
+ assert !cursor.construct_query_spec.has_key?('$readPreference')
199
+
200
+ cursor = Cursor.new(@collection, { :read => :secondary })
201
+ assert !cursor.construct_query_spec.has_key?('$readPreference')
202
+
203
+ cursor = Cursor.new(@collection, { :read => :secondary_preferred })
204
+ assert !cursor.construct_query_spec.has_key?('$readPreference')
205
+
206
+ cursor = Cursor.new(@collection, { :read => :nearest })
207
+ assert !cursor.construct_query_spec.has_key?('$readPreference')
208
+
209
+ cursor = Cursor.new(@collection, { :read => :secondary , :tag_sets => @tag_sets})
210
+ assert !cursor.construct_query_spec.has_key?('$readPreference')
211
+ end
212
+ end
110
213
  end
111
214
 
112
215
  context "Query fields" do
@@ -117,7 +220,7 @@ class CursorTest < Test::Unit::TestCase
117
220
  :log_duration => false, :tag_sets =>{}, :acceptable_latency => 10)
118
221
  @db = stub(:slave_ok? => true, :name => "testing", :connection => @connection,
119
222
  :tag_sets => {}, :acceptable_latency => 10)
120
- @collection = stub(:db => @db, :name => "items", :read_preference => :primary,
223
+ @collection = stub(:db => @db, :name => "items", :read => :primary,
121
224
  :tag_sets => {}, :acceptable_latency => 10)
122
225
  end
123
226
 
@@ -140,4 +243,31 @@ class CursorTest < Test::Unit::TestCase
140
243
  assert_nil @cursor.fields
141
244
  end
142
245
  end
246
+
247
+ context "counts" do
248
+ setup do
249
+ @logger = mock()
250
+ @logger.stubs(:debug)
251
+ @connection = stub(:class => Connection, :logger => @logger,
252
+ :slave_ok? => false, :read => :primary, :log_duration => false,
253
+ :tag_sets => {}, :acceptable_latency => 10)
254
+ @db = stub(:name => "testing", :slave_ok? => false,
255
+ :connection => @connection, :read => :primary,
256
+ :tag_sets => {}, :acceptable_latency => 10)
257
+ @collection = stub(:db => @db, :name => "items", :read => :primary,
258
+ :tag_sets => {}, :acceptable_latency => 10)
259
+ @cursor = Cursor.new(@collection)
260
+ end
261
+
262
+ should "pass the comment parameter" do
263
+ query = {:field => 7}
264
+ @db.expects(:command).with({ 'count' => "items",
265
+ 'query' => query,
266
+ 'fields' => nil},
267
+ { :read => :primary,
268
+ :comment => "my comment"}).
269
+ returns({'ok' => 1, 'n' => 1})
270
+ assert_equal(1, Cursor.new(@collection, :selector => query, :comment => 'my comment').count())
271
+ end
272
+ end
143
273
  end
@@ -15,12 +15,12 @@ class DBTest < Test::Unit::TestCase
15
15
  setup do
16
16
  @client = stub()
17
17
  @client.stubs(:write_concern).returns({})
18
- @client.stubs(:read_preference)
18
+ @client.stubs(:read).returns(:primary)
19
19
  @client.stubs(:tag_sets)
20
20
  @client.stubs(:acceptable_latency)
21
21
  @db = DB.new("testing", @client)
22
22
  @db.stubs(:safe)
23
- @db.stubs(:read_preference)
23
+ @db.stubs(:read)
24
24
  @db.stubs(:tag_sets)
25
25
  @db.stubs(:acceptable_latency)
26
26
  @collection = mock()
@@ -44,7 +44,8 @@ class DBTest < Test::Unit::TestCase
44
44
  should "create the proper cursor" do
45
45
  @cursor = mock(:next_document => {"ok" => 1})
46
46
  Cursor.expects(:new).with(@collection,
47
- :limit => -1, :selector => {:buildinfo => 1}, :socket => nil).returns(@cursor)
47
+ :limit => -1, :selector => {:buildinfo => 1},
48
+ :socket => nil, :read => nil, :comment => nil).returns(@cursor)
48
49
  command = {:buildinfo => 1}
49
50
  @db.command(command, :check_response => true)
50
51
  end
@@ -52,13 +53,25 @@ class DBTest < Test::Unit::TestCase
52
53
  should "raise an error when the command fails" do
53
54
  @cursor = mock(:next_document => {"ok" => 0})
54
55
  Cursor.expects(:new).with(@collection,
55
- :limit => -1, :selector => {:buildinfo => 1}, :socket => nil).returns(@cursor)
56
+ :limit => -1, :selector => {:buildinfo => 1},
57
+ :socket => nil, :read => nil, :comment => nil).returns(@cursor)
56
58
  assert_raise OperationFailure do
57
59
  command = {:buildinfo => 1}
58
60
  @db.command(command, :check_response => true)
59
61
  end
60
62
  end
61
63
 
64
+ should "pass on the comment" do
65
+ @cursor = mock(:next_document => {"ok" => 0})
66
+ Cursor.expects(:new).with(@collection,
67
+ :limit => -1, :selector => {:buildinfo => 1},
68
+ :socket => nil, :read => nil, :comment => "my comment").returns(@cursor)
69
+ assert_raise OperationFailure do
70
+ command = {:buildinfo => 1}
71
+ @db.command(command, :check_response => true, :comment => 'my comment')
72
+ end
73
+ end
74
+
62
75
  should "raise an error if logging out fails" do
63
76
  @db.expects(:command).returns({})
64
77
  @client.expects(:pool_size).returns(1)