Skip to content

Commit a8f91b8

Browse files
committed
RUBY-899 Return empty list instead of nil from cluster#servers and test server selector
1 parent 5b64dac commit a8f91b8

File tree

4 files changed

+113
-1
lines changed

4 files changed

+113
-1
lines changed

lib/mongo/cluster.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -181,7 +181,7 @@ def scan!
181181
#
182182
# @since 2.0.0
183183
def servers
184-
topology.servers(@servers)
184+
topology.servers(@servers.compact).compact
185185
end
186186

187187
# Create a cluster for the provided client, for use when we don't want the

lib/mongo/cluster/topology/unknown.rb

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -106,6 +106,7 @@ def replica_set_name; nil; end
106106
#
107107
# @since 2.0.0
108108
def servers(servers)
109+
[]
109110
end
110111

111112
# An unknown topology is not sharded.

spec/mongo/cluster_spec.rb

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -149,5 +149,65 @@
149149
end
150150
end
151151
end
152+
153+
context 'when the cluster has no servers' do
154+
155+
let(:cluster) do
156+
described_class.new(ADDRESSES)
157+
end
158+
159+
let(:servers) do
160+
[nil,nil]
161+
end
162+
163+
before do
164+
cluster.instance_variable_set(:@servers, servers)
165+
cluster.instance_variable_set(:@topology, topology)
166+
end
167+
168+
context 'when topology is Single' do
169+
170+
let(:topology) do
171+
Mongo::Cluster::Topology::Single.new({})
172+
end
173+
174+
it 'returns an empty array' do
175+
expect(cluster.servers).to eq([])
176+
end
177+
end
178+
179+
context 'when topology is ReplicaSet' do
180+
181+
let(:topology) do
182+
Mongo::Cluster::Topology::ReplicaSet.new({})
183+
end
184+
185+
it 'returns an empty array' do
186+
expect(cluster.servers).to eq([])
187+
end
188+
end
189+
190+
context 'when topology is Sharded' do
191+
192+
let(:topology) do
193+
Mongo::Cluster::Topology::Sharded.new({})
194+
end
195+
196+
it 'returns an empty array' do
197+
expect(cluster.servers).to eq([])
198+
end
199+
end
200+
201+
context 'when topology is Unknown' do
202+
203+
let(:topology) do
204+
Mongo::Cluster::Topology::Unknown.new({})
205+
end
206+
207+
it 'returns an empty array' do
208+
expect(cluster.servers).to eq([])
209+
end
210+
end
211+
end
152212
end
153213
end

spec/mongo/server_selector_spec.rb

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -98,4 +98,55 @@
9898
end
9999
end
100100
end
101+
102+
shared_context 'a ServerSelector' do
103+
104+
context 'when cluster#servers is empty' do
105+
106+
let(:servers) { [] }
107+
108+
let(:cluster) do
109+
double('cluster').tap do |c|
110+
allow(c).to receive(:servers).and_return(servers)
111+
allow(c).to receive(:single?).and_return(single)
112+
allow(c).to receive(:sharded?).and_return(sharded)
113+
allow(c).to receive(:scan!).and_return(true)
114+
end
115+
end
116+
117+
let(:read_pref) do
118+
described_class.get({ mode: :primary }, server_selection_timeout: 1)
119+
end
120+
121+
it 'raises a NoServerAvailable error' do
122+
expect do
123+
read_pref.select_server(cluster)
124+
end.to raise_exception(Mongo::ServerSelector::NoServerAvailable)
125+
end
126+
end
127+
end
128+
129+
context 'when the cluster has a Single topology' do
130+
131+
let(:single) { true }
132+
let(:sharded) { false }
133+
134+
it_behaves_like 'a ServerSelector'
135+
end
136+
137+
context 'when the cluster has a ReplicaSet topology' do
138+
139+
let(:single) { false }
140+
let(:sharded) { false }
141+
142+
it_behaves_like 'a ServerSelector'
143+
end
144+
145+
context 'when the cluster has a Sharded topology' do
146+
147+
let(:single) { false }
148+
let(:sharded) { true }
149+
150+
it_behaves_like 'a ServerSelector'
151+
end
101152
end

0 commit comments

Comments
 (0)