beaneater 0.3.1 → 1.1.1
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.
- checksums.yaml +5 -5
- data/.travis.yml +15 -0
- data/CHANGELOG.md +30 -1
- data/Gemfile +5 -1
- data/README.md +45 -24
- data/Rakefile +3 -1
- data/beaneater.gemspec +1 -0
- data/examples/demo.rb +1 -2
- data/lib/beaneater.rb +57 -4
- data/lib/beaneater/configuration.rb +3 -1
- data/lib/beaneater/connection.rb +128 -29
- data/lib/beaneater/errors.rb +2 -2
- data/lib/beaneater/job/collection.rb +67 -37
- data/lib/beaneater/job/record.rb +42 -30
- data/lib/beaneater/stats.rb +28 -5
- data/lib/beaneater/stats/fast_struct.rb +1 -1
- data/lib/beaneater/stats/stat_struct.rb +8 -2
- data/lib/beaneater/tube/collection.rb +67 -26
- data/lib/beaneater/tube/record.rb +45 -27
- data/lib/beaneater/version.rb +2 -2
- data/test/beaneater_test.rb +5 -11
- data/test/connection_test.rb +55 -1
- data/test/errors_test.rb +1 -1
- data/test/job_test.rb +8 -12
- data/test/jobs_test.rb +15 -43
- data/test/prompt_regexp_test.rb +14 -2
- data/test/stat_struct_test.rb +12 -2
- data/test/stats_test.rb +9 -9
- data/test/test_helper.rb +33 -7
- data/test/tube_test.rb +12 -23
- data/test/tubes_test.rb +61 -56
- metadata +23 -29
- data/lib/beaneater/pool.rb +0 -166
- data/lib/beaneater/pool_command.rb +0 -79
- data/test/pool_command_test.rb +0 -90
- data/test/pool_test.rb +0 -185
metadata
CHANGED
@@ -1,83 +1,83 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: beaneater
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 1.1.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Nico Taing
|
8
|
-
autorequire:
|
8
|
+
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2021-04-27 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: minitest
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
|
-
- - ~>
|
17
|
+
- - "~>"
|
18
18
|
- !ruby/object:Gem::Version
|
19
19
|
version: 4.1.0
|
20
20
|
type: :development
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
|
-
- - ~>
|
24
|
+
- - "~>"
|
25
25
|
- !ruby/object:Gem::Version
|
26
26
|
version: 4.1.0
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: rake
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
|
-
- -
|
31
|
+
- - ">="
|
32
32
|
- !ruby/object:Gem::Version
|
33
33
|
version: '0'
|
34
34
|
type: :development
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
|
-
- -
|
38
|
+
- - ">="
|
39
39
|
- !ruby/object:Gem::Version
|
40
40
|
version: '0'
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
42
|
name: mocha
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
44
44
|
requirements:
|
45
|
-
- -
|
45
|
+
- - ">="
|
46
46
|
- !ruby/object:Gem::Version
|
47
47
|
version: '0'
|
48
48
|
type: :development
|
49
49
|
prerelease: false
|
50
50
|
version_requirements: !ruby/object:Gem::Requirement
|
51
51
|
requirements:
|
52
|
-
- -
|
52
|
+
- - ">="
|
53
53
|
- !ruby/object:Gem::Version
|
54
54
|
version: '0'
|
55
55
|
- !ruby/object:Gem::Dependency
|
56
56
|
name: term-ansicolor
|
57
57
|
requirement: !ruby/object:Gem::Requirement
|
58
58
|
requirements:
|
59
|
-
- -
|
59
|
+
- - ">="
|
60
60
|
- !ruby/object:Gem::Version
|
61
61
|
version: '0'
|
62
62
|
type: :development
|
63
63
|
prerelease: false
|
64
64
|
version_requirements: !ruby/object:Gem::Requirement
|
65
65
|
requirements:
|
66
|
-
- -
|
66
|
+
- - ">="
|
67
67
|
- !ruby/object:Gem::Version
|
68
68
|
version: '0'
|
69
69
|
- !ruby/object:Gem::Dependency
|
70
70
|
name: json
|
71
71
|
requirement: !ruby/object:Gem::Requirement
|
72
72
|
requirements:
|
73
|
-
- -
|
73
|
+
- - ">="
|
74
74
|
- !ruby/object:Gem::Version
|
75
75
|
version: '0'
|
76
76
|
type: :development
|
77
77
|
prerelease: false
|
78
78
|
version_requirements: !ruby/object:Gem::Requirement
|
79
79
|
requirements:
|
80
|
-
- -
|
80
|
+
- - ">="
|
81
81
|
- !ruby/object:Gem::Version
|
82
82
|
version: '0'
|
83
83
|
description: Simple beanstalkd client for ruby
|
@@ -87,8 +87,9 @@ executables: []
|
|
87
87
|
extensions: []
|
88
88
|
extra_rdoc_files: []
|
89
89
|
files:
|
90
|
-
- .gitignore
|
91
|
-
- .
|
90
|
+
- ".gitignore"
|
91
|
+
- ".travis.yml"
|
92
|
+
- ".yardopts"
|
92
93
|
- CHANGELOG.md
|
93
94
|
- Gemfile
|
94
95
|
- LICENSE.txt
|
@@ -104,8 +105,6 @@ files:
|
|
104
105
|
- lib/beaneater/job.rb
|
105
106
|
- lib/beaneater/job/collection.rb
|
106
107
|
- lib/beaneater/job/record.rb
|
107
|
-
- lib/beaneater/pool.rb
|
108
|
-
- lib/beaneater/pool_command.rb
|
109
108
|
- lib/beaneater/stats.rb
|
110
109
|
- lib/beaneater/stats/fast_struct.rb
|
111
110
|
- lib/beaneater/stats/stat_struct.rb
|
@@ -118,8 +117,6 @@ files:
|
|
118
117
|
- test/errors_test.rb
|
119
118
|
- test/job_test.rb
|
120
119
|
- test/jobs_test.rb
|
121
|
-
- test/pool_command_test.rb
|
122
|
-
- test/pool_test.rb
|
123
120
|
- test/prompt_regexp_test.rb
|
124
121
|
- test/stat_struct_test.rb
|
125
122
|
- test/stats_test.rb
|
@@ -127,26 +124,26 @@ files:
|
|
127
124
|
- test/tube_test.rb
|
128
125
|
- test/tubes_test.rb
|
129
126
|
homepage: ''
|
130
|
-
licenses:
|
127
|
+
licenses:
|
128
|
+
- MIT
|
131
129
|
metadata: {}
|
132
|
-
post_install_message:
|
130
|
+
post_install_message:
|
133
131
|
rdoc_options: []
|
134
132
|
require_paths:
|
135
133
|
- lib
|
136
134
|
required_ruby_version: !ruby/object:Gem::Requirement
|
137
135
|
requirements:
|
138
|
-
- -
|
136
|
+
- - ">="
|
139
137
|
- !ruby/object:Gem::Version
|
140
138
|
version: '0'
|
141
139
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
142
140
|
requirements:
|
143
|
-
- -
|
141
|
+
- - ">="
|
144
142
|
- !ruby/object:Gem::Version
|
145
143
|
version: '0'
|
146
144
|
requirements: []
|
147
|
-
|
148
|
-
|
149
|
-
signing_key:
|
145
|
+
rubygems_version: 3.0.8
|
146
|
+
signing_key:
|
150
147
|
specification_version: 4
|
151
148
|
summary: Simple beanstalkd client for ruby.
|
152
149
|
test_files:
|
@@ -155,12 +152,9 @@ test_files:
|
|
155
152
|
- test/errors_test.rb
|
156
153
|
- test/job_test.rb
|
157
154
|
- test/jobs_test.rb
|
158
|
-
- test/pool_command_test.rb
|
159
|
-
- test/pool_test.rb
|
160
155
|
- test/prompt_regexp_test.rb
|
161
156
|
- test/stat_struct_test.rb
|
162
157
|
- test/stats_test.rb
|
163
158
|
- test/test_helper.rb
|
164
159
|
- test/tube_test.rb
|
165
160
|
- test/tubes_test.rb
|
166
|
-
has_rdoc:
|
data/lib/beaneater/pool.rb
DELETED
@@ -1,166 +0,0 @@
|
|
1
|
-
# Simple ruby client for interacting with beanstalkd.
|
2
|
-
module Beaneater
|
3
|
-
# Represents collection of beanstalkd connections.
|
4
|
-
class Pool
|
5
|
-
# Default number of retries to send a command to a connection
|
6
|
-
MAX_RETRIES = 3
|
7
|
-
|
8
|
-
# @!attribute connections
|
9
|
-
# @return [Array<Beaneater::Connection>] returns Collection of connections
|
10
|
-
attr_reader :connections
|
11
|
-
|
12
|
-
# Initialize new connection
|
13
|
-
#
|
14
|
-
# @param [Array<String>] addresses Array of beanstalkd server addresses
|
15
|
-
# @example
|
16
|
-
# Beaneater::Pool.new(['localhost:11300', '127.0.0.1:11300'])
|
17
|
-
#
|
18
|
-
# ENV['BEANSTALKD_URL'] = 'localhost:11300,127.0.0.1:11300'
|
19
|
-
# @bp = Beaneater::Pool.new
|
20
|
-
# @bp.connections.first.host # => 'localhost'
|
21
|
-
# @bp.connections.last.host # => '127.0.0.1'
|
22
|
-
#
|
23
|
-
def initialize(addresses=nil)
|
24
|
-
addresses = addresses || host_from_env || Beaneater.configuration.beanstalkd_url
|
25
|
-
@connections = Array(addresses).map { |a| Connection.new(a) }
|
26
|
-
end
|
27
|
-
|
28
|
-
# Returns Beaneater::Stats object for accessing beanstalk stats.
|
29
|
-
#
|
30
|
-
# @return [Beaneater::Stats] stats object
|
31
|
-
# @api public
|
32
|
-
def stats
|
33
|
-
@stats ||= Stats.new(self)
|
34
|
-
end
|
35
|
-
|
36
|
-
# Returns Beaneater::Jobs object for accessing job related functions.
|
37
|
-
#
|
38
|
-
# @return [Beaneater::Jobs] jobs object
|
39
|
-
# @api public
|
40
|
-
def jobs
|
41
|
-
@jobs ||= Jobs.new(self)
|
42
|
-
end
|
43
|
-
|
44
|
-
# Returns Beaneater::Tubes object for accessing tube related functions.
|
45
|
-
#
|
46
|
-
# @return [Beaneater::Tubes] tubes object
|
47
|
-
# @api public
|
48
|
-
def tubes
|
49
|
-
@tubes ||= Tubes.new(self)
|
50
|
-
end
|
51
|
-
|
52
|
-
# Sends command to every beanstalkd server set in the pool.
|
53
|
-
#
|
54
|
-
# @param [String] command Beanstalkd command
|
55
|
-
# @param [Hash{String => String, Boolean}] options socket connections options
|
56
|
-
# @param [Proc] block Block passed to socket connection during transmit
|
57
|
-
# @return [Array<Hash{String => String, Number}>] Beanstalkd command response from each instance
|
58
|
-
# @example
|
59
|
-
# @pool.transmit_to_all("stats")
|
60
|
-
#
|
61
|
-
def transmit_to_all(command, options={}, &block)
|
62
|
-
res_exception = nil
|
63
|
-
res = connections.map { |conn|
|
64
|
-
begin
|
65
|
-
safe_transmit { conn.transmit(command, options, &block) }
|
66
|
-
rescue UnexpectedResponse => ex # not the correct status
|
67
|
-
res_exception = ex
|
68
|
-
nil
|
69
|
-
end
|
70
|
-
}.compact
|
71
|
-
raise res_exception if res.none? && res_exception
|
72
|
-
res
|
73
|
-
end
|
74
|
-
|
75
|
-
# Send command to each beanstalkd servers until getting response expected
|
76
|
-
#
|
77
|
-
# @param [String] command Beanstalkd command
|
78
|
-
# @param [Hash{String => String, Boolean}] options socket connections options
|
79
|
-
# @param [Proc] block Block passed in socket connection object
|
80
|
-
# @return [Array<Hash{String => String, Number}>] Beanstalkd command response from the instance
|
81
|
-
# @example
|
82
|
-
# @pool.transmit_until_res('peek-ready', :status => "FOUND", &block)
|
83
|
-
#
|
84
|
-
def transmit_until_res(command, options={}, &block)
|
85
|
-
status_expected = options.delete(:status)
|
86
|
-
res_exception = nil
|
87
|
-
connections.each do |conn|
|
88
|
-
begin
|
89
|
-
res = safe_transmit { conn.transmit(command, options, &block) }
|
90
|
-
return res if res[:status] == status_expected
|
91
|
-
rescue UnexpectedResponse => ex # not the correct status
|
92
|
-
res_exception = ex
|
93
|
-
next
|
94
|
-
end
|
95
|
-
end
|
96
|
-
raise res_exception if res_exception
|
97
|
-
end
|
98
|
-
|
99
|
-
# Sends command to a random beanstalkd server in the pool.
|
100
|
-
#
|
101
|
-
# @param [String] command Beanstalkd command
|
102
|
-
# @param [Hash{String => String,Boolean}] options socket connections options
|
103
|
-
# @param [Proc] block Block passed in socket connection object
|
104
|
-
# @return [Array<Hash{String => String, Number}>] Beanstalkd command response from the instance
|
105
|
-
# @example
|
106
|
-
# @pool.transmit_to_rand("stats", :match => /\n/)
|
107
|
-
#
|
108
|
-
def transmit_to_rand(command, options={}, &block)
|
109
|
-
safe_transmit do
|
110
|
-
conn = connections.respond_to?(:sample) ? connections.sample : connections.choice
|
111
|
-
conn.transmit(command, options, &block)
|
112
|
-
end
|
113
|
-
end
|
114
|
-
|
115
|
-
# Closes all connections within the pool.
|
116
|
-
#
|
117
|
-
# @example
|
118
|
-
# @pool.close
|
119
|
-
#
|
120
|
-
def close
|
121
|
-
while @connections.any?
|
122
|
-
conn = @connections.pop
|
123
|
-
conn.close
|
124
|
-
end
|
125
|
-
end
|
126
|
-
|
127
|
-
protected
|
128
|
-
|
129
|
-
# Transmit command to beanstalk connections safely handling failed connections
|
130
|
-
#
|
131
|
-
# @param [Proc] block The command to execute.
|
132
|
-
# @return [Object] Result of the block passed
|
133
|
-
# @raise [Beaneater::DrainingError,Beaneater::NotConnected] Could not connect to Beanstalk client
|
134
|
-
# @example
|
135
|
-
# safe_transmit { conn.transmit('foo') }
|
136
|
-
# # => "result of foo command from beanstalk"
|
137
|
-
#
|
138
|
-
def safe_transmit(&block)
|
139
|
-
retries = 1
|
140
|
-
begin
|
141
|
-
yield
|
142
|
-
rescue DrainingError, EOFError, Errno::ECONNRESET, Errno::EPIPE => ex
|
143
|
-
# TODO remove faulty connections from pool?
|
144
|
-
# https://github.com/kr/beanstalk-client-ruby/blob/master/lib/beanstalk-client/connection.rb#L405-410
|
145
|
-
if retries < MAX_RETRIES
|
146
|
-
retries += 1
|
147
|
-
retry
|
148
|
-
else # finished retrying, fail out
|
149
|
-
ex.is_a?(DrainingError) ? raise(ex) : raise(NotConnected, "Could not connect!")
|
150
|
-
end
|
151
|
-
end
|
152
|
-
end # transmit_call
|
153
|
-
|
154
|
-
# The hosts provided by BEANSTALKD_URL environment variable, if available.
|
155
|
-
#
|
156
|
-
# @return [Array] Set of beanstalkd host addresses
|
157
|
-
# @example
|
158
|
-
# ENV['BEANSTALKD_URL'] = "localhost:1212,localhost:2424"
|
159
|
-
# # => ['localhost:1212', 'localhost:2424']
|
160
|
-
#
|
161
|
-
def host_from_env
|
162
|
-
ENV['BEANSTALKD_URL'].respond_to?(:length) && ENV['BEANSTALKD_URL'].length > 0 && ENV['BEANSTALKD_URL'].split(',').map(&:strip)
|
163
|
-
end
|
164
|
-
|
165
|
-
end # Pool
|
166
|
-
end # Beaneater
|
@@ -1,79 +0,0 @@
|
|
1
|
-
require 'set'
|
2
|
-
|
3
|
-
module Beaneater
|
4
|
-
# Represents collection of pool related commands.
|
5
|
-
class PoolCommand
|
6
|
-
# @!attribute pool
|
7
|
-
# @return [Beaneater::Pool] returns Pool object
|
8
|
-
attr_reader :pool
|
9
|
-
|
10
|
-
# Initialize new connection
|
11
|
-
#
|
12
|
-
# @param [Beaneater::Pool] pool Pool object
|
13
|
-
def initialize(pool)
|
14
|
-
@pool = pool
|
15
|
-
end
|
16
|
-
|
17
|
-
# Delegate to Pool#transmit_to_all and if needed will merge responses from beanstalkd.
|
18
|
-
#
|
19
|
-
# @param [String] body Beanstalkd command
|
20
|
-
# @param [Hash{String => String, Boolean}] options socket connections options
|
21
|
-
# @option options [Boolean] merge Ask for merging responses or not
|
22
|
-
# @param [Proc] block Block passed in socket connection object
|
23
|
-
# @example
|
24
|
-
# @pool.transmit_to_all("stats")
|
25
|
-
#
|
26
|
-
def transmit_to_all(body, options={}, &block)
|
27
|
-
merge = options.delete(:merge)
|
28
|
-
res = pool.transmit_to_all(body, options, &block)
|
29
|
-
first = res.find { |r| r && r[:status] }
|
30
|
-
if first && merge
|
31
|
-
res = { :status => first[:status], :body => sum_items(res.map { |r| r[:body] }) }
|
32
|
-
end
|
33
|
-
res
|
34
|
-
end
|
35
|
-
|
36
|
-
# Delegate missing methods to pool
|
37
|
-
# @api public
|
38
|
-
def method_missing(name, *args, &block)
|
39
|
-
if pool.respond_to?(name)
|
40
|
-
pool.send(name, *args, &block)
|
41
|
-
else # not a known pool command
|
42
|
-
super
|
43
|
-
end
|
44
|
-
end
|
45
|
-
|
46
|
-
protected
|
47
|
-
|
48
|
-
# Selects items from collection and then merges the individual values
|
49
|
-
# Supports array of hashes or array of arrays
|
50
|
-
#
|
51
|
-
# @param [Array<Hash, Array>] hs Collection of responses returned from beanstalkd
|
52
|
-
# @return [Hash{Symbol => String}] Merged responses combining values from all the hash bodies
|
53
|
-
# @example
|
54
|
-
# self.sum_items([{ :foo => 1, :bar => 5 }, { :foo => 2, :bar => 3 }])
|
55
|
-
# => { :foo => 3, :bar => 8 }
|
56
|
-
# self.sum_items([['foo', 'bar'], ['foo', 'bar', 'baz']])
|
57
|
-
# => ['foo', 'bar', 'baz']
|
58
|
-
#
|
59
|
-
def sum_items(items)
|
60
|
-
if items.first.is_a?(Hash)
|
61
|
-
items.select { |h| h.is_a?(Hash) }.
|
62
|
-
inject({}) { |a,b| a.merge(b) { |k,o,n| combine_stats(k, o, n) } }
|
63
|
-
elsif items.first.is_a?(Array)
|
64
|
-
items.flatten.uniq
|
65
|
-
end
|
66
|
-
end
|
67
|
-
|
68
|
-
# Combine two values for given key
|
69
|
-
#
|
70
|
-
# @param [String] k key name within response hash
|
71
|
-
# @return [Set,Integer] combined value for stat
|
72
|
-
# @example
|
73
|
-
# self.combine_stats('total_connections', 4, 5) # => 9
|
74
|
-
#
|
75
|
-
def combine_stats(k, a, b)
|
76
|
-
['name', 'version', 'pid'].include?(k) ? Set[a] + Set[b] : a + b
|
77
|
-
end
|
78
|
-
end # PoolCommand
|
79
|
-
end # Beaneater
|
data/test/pool_command_test.rb
DELETED
@@ -1,90 +0,0 @@
|
|
1
|
-
# test/connection_test.rb
|
2
|
-
|
3
|
-
require File.expand_path('../test_helper', __FILE__)
|
4
|
-
|
5
|
-
describe Beaneater::PoolCommand do
|
6
|
-
|
7
|
-
describe 'for #new' do
|
8
|
-
before do
|
9
|
-
@pool = stub
|
10
|
-
@command = Beaneater::PoolCommand.new(@pool)
|
11
|
-
end
|
12
|
-
|
13
|
-
it "should store pool" do
|
14
|
-
assert_equal @pool, @command.pool
|
15
|
-
end
|
16
|
-
end #new
|
17
|
-
|
18
|
-
describe 'for #transmit_to_all' do
|
19
|
-
describe 'for regular command' do
|
20
|
-
before do
|
21
|
-
@pool = stub(:transmit_to_all => [{ :body => "foo", :status => "OK" }])
|
22
|
-
@command = Beaneater::PoolCommand.new(@pool)
|
23
|
-
end
|
24
|
-
|
25
|
-
it "can run regular command" do
|
26
|
-
res = @command.transmit_to_all("foo")
|
27
|
-
assert_equal "OK", res[0][:status]
|
28
|
-
assert_equal "foo", res[0][:body]
|
29
|
-
end
|
30
|
-
end # regular command
|
31
|
-
|
32
|
-
describe 'for merge command with hashes' do
|
33
|
-
before do
|
34
|
-
@pool = stub(:transmit_to_all => [
|
35
|
-
{ :body => { 'x' => 1, 'version' => 1.1 }, :status => "OK"},
|
36
|
-
{ :body => { 'x' => 3,'version' => 1.2 }, :status => "OK" }
|
37
|
-
])
|
38
|
-
@command = Beaneater::PoolCommand.new(@pool)
|
39
|
-
end
|
40
|
-
|
41
|
-
it "can run merge command " do
|
42
|
-
cmd = @command.transmit_to_all("bar", :merge => true)
|
43
|
-
assert_equal "OK", cmd[:status]
|
44
|
-
assert_equal 4, cmd[:body]['x']
|
45
|
-
assert_equal Set[1.1, 1.2], cmd[:body]['version']
|
46
|
-
end
|
47
|
-
end # merged command
|
48
|
-
|
49
|
-
describe 'for merge command with arrays' do
|
50
|
-
before do
|
51
|
-
@pool = stub(:transmit_to_all => [
|
52
|
-
{ :body => ['foo', 'bar'], :status => "OK"},
|
53
|
-
{ :body => ['foo', 'bar', 'baz'], :status => "OK" }
|
54
|
-
])
|
55
|
-
@command = Beaneater::PoolCommand.new(@pool)
|
56
|
-
end
|
57
|
-
|
58
|
-
it "can run merge command " do
|
59
|
-
cmd = @command.transmit_to_all("bar", :merge => true)
|
60
|
-
assert_equal "OK", cmd[:status]
|
61
|
-
assert_equal ['foo', 'bar', 'baz'].sort, cmd[:body].sort
|
62
|
-
end
|
63
|
-
end # merged command
|
64
|
-
end # transmit_to_all
|
65
|
-
|
66
|
-
describe 'for #method_missing' do
|
67
|
-
describe '#transmit_to_rand' do
|
68
|
-
before do
|
69
|
-
@pool = stub
|
70
|
-
@pool.expects(:transmit_to_rand).with('foo').returns('OK')
|
71
|
-
@command = Beaneater::PoolCommand.new(@pool)
|
72
|
-
end
|
73
|
-
|
74
|
-
it 'delegates to connection' do
|
75
|
-
assert_equal 'OK', @command.transmit_to_rand('foo')
|
76
|
-
end
|
77
|
-
end # transmit_to_rand
|
78
|
-
|
79
|
-
describe 'invalid method' do
|
80
|
-
before do
|
81
|
-
@pool = stub
|
82
|
-
@command = Beaneater::PoolCommand.new(@pool)
|
83
|
-
end
|
84
|
-
|
85
|
-
it 'raises no method error' do
|
86
|
-
assert_raises(NoMethodError) { @command.foo('foo') }
|
87
|
-
end
|
88
|
-
end # transmit_to_rand
|
89
|
-
end
|
90
|
-
end # Beaneater::PoolCommand
|