mock_beaneater 0.0.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.
- data/.gitignore +17 -0
- data/Gemfile +4 -0
- data/LICENSE.txt +22 -0
- data/README.md +27 -0
- data/Rakefile +16 -0
- data/lib/mock_beaneater.rb +5 -0
- data/lib/mock_beaneater/job.rb +2 -0
- data/lib/mock_beaneater/job/collection.rb +8 -0
- data/lib/mock_beaneater/job/record.rb +40 -0
- data/lib/mock_beaneater/pool.rb +7 -0
- data/lib/mock_beaneater/tube.rb +2 -0
- data/lib/mock_beaneater/tube/collection.rb +49 -0
- data/lib/mock_beaneater/tube/record.rb +65 -0
- data/lib/mock_beaneater/version.rb +3 -0
- data/mock_beaneater.gemspec +25 -0
- data/spec/job/record_spec.rb +88 -0
- data/spec/pool_spec.rb +16 -0
- data/spec/spec_helper.rb +3 -0
- data/spec/tube/collection_spec.rb +83 -0
- data/spec/tube/record_spec.rb +138 -0
- metadata +136 -0
data/.gitignore
ADDED
data/Gemfile
ADDED
data/LICENSE.txt
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
Copyright (c) 2013 Sean Xie
|
2
|
+
|
3
|
+
MIT License
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
6
|
+
a copy of this software and associated documentation files (the
|
7
|
+
"Software"), to deal in the Software without restriction, including
|
8
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
9
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
10
|
+
permit persons to whom the Software is furnished to do so, subject to
|
11
|
+
the following conditions:
|
12
|
+
|
13
|
+
The above copyright notice and this permission notice shall be
|
14
|
+
included in all copies or substantial portions of the Software.
|
15
|
+
|
16
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
17
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
18
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
19
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
20
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
21
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
22
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,27 @@
|
|
1
|
+
MockBeaneater
|
2
|
+
==================
|
3
|
+
|
4
|
+
Mock beaneater that goes AH-HEE-OH-HEE-AH-HEE\*. Intended for use in tests.
|
5
|
+
|
6
|
+
\*sound a beaneater makes
|
7
|
+
|
8
|
+
Usage
|
9
|
+
-----
|
10
|
+
|
11
|
+
Use a mock beaneater like you would a beaneater!
|
12
|
+
|
13
|
+
>> require 'mock_beaneater'
|
14
|
+
>> mbp = MockBeaneater::Pool.new
|
15
|
+
>> mtube = mbp.tubes.find('my-tube')
|
16
|
+
>> mtube.put('my-msg')
|
17
|
+
=> {:status=>"INSERTED", :body=>nil, :id=>1}
|
18
|
+
>> mjob = mtube.reserve
|
19
|
+
=> #<MockBeaneater::Job id=1 body="msg">
|
20
|
+
>> mjob.delete
|
21
|
+
|
22
|
+
TODO
|
23
|
+
-----
|
24
|
+
|
25
|
+
* stats
|
26
|
+
* ttr
|
27
|
+
* ...
|
data/Rakefile
ADDED
@@ -0,0 +1,16 @@
|
|
1
|
+
require "rubygems"
|
2
|
+
require "bundler"
|
3
|
+
Bundler.setup
|
4
|
+
|
5
|
+
require "rake"
|
6
|
+
require "rspec"
|
7
|
+
require "rspec/core/rake_task"
|
8
|
+
|
9
|
+
$:.push File.expand_path("../lib", __FILE__)
|
10
|
+
require "mock_beaneater"
|
11
|
+
|
12
|
+
task :default => :spec
|
13
|
+
|
14
|
+
RSpec::Core::RakeTask.new(:spec) do |t|
|
15
|
+
t.pattern = 'spec/**/*_spec.rb'
|
16
|
+
end
|
@@ -0,0 +1,40 @@
|
|
1
|
+
module MockBeaneater
|
2
|
+
class Job
|
3
|
+
attr_reader :id, :body, :connection, :reserved, :tube, :visible_at, :pri
|
4
|
+
|
5
|
+
def initialize(body, tube, visible_at = Time.now.to_i, pri = 65536)
|
6
|
+
@id = (Jobs.count += 1)
|
7
|
+
@body = body
|
8
|
+
@tube = tube
|
9
|
+
@visible_at = visible_at
|
10
|
+
@pri = pri
|
11
|
+
@reserved = false
|
12
|
+
end
|
13
|
+
|
14
|
+
def release(options={})
|
15
|
+
@reserved = false
|
16
|
+
@tube.release(self)
|
17
|
+
{:status => "RELEASED",
|
18
|
+
:body => nil}
|
19
|
+
end
|
20
|
+
|
21
|
+
def delete
|
22
|
+
@reserved = false
|
23
|
+
@tube.delete(self)
|
24
|
+
{:status => "DELETED",
|
25
|
+
:body => nil}
|
26
|
+
end
|
27
|
+
|
28
|
+
def reserved?
|
29
|
+
@reserved
|
30
|
+
end
|
31
|
+
|
32
|
+
def ==(other_job)
|
33
|
+
@id == other_job.id
|
34
|
+
end
|
35
|
+
|
36
|
+
def to_s
|
37
|
+
"#<MockBeaneater::Job id=#{@id} body=#{@body.inspect}>"
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
@@ -0,0 +1,49 @@
|
|
1
|
+
module MockBeaneater
|
2
|
+
class Tubes
|
3
|
+
attr_reader :pool, :all, :watched, :used
|
4
|
+
|
5
|
+
def initialize(pool)
|
6
|
+
@pool = pool
|
7
|
+
@all = [Tube.new(@pool, 'default')]
|
8
|
+
@watched = [find('default')]
|
9
|
+
@used = find('default')
|
10
|
+
end
|
11
|
+
|
12
|
+
def find(tube_name)
|
13
|
+
first_or_create(tube_name)
|
14
|
+
end
|
15
|
+
alias_method :[], :find
|
16
|
+
|
17
|
+
def reserve(timeout=nil)
|
18
|
+
job = nil
|
19
|
+
@all.each do |t|
|
20
|
+
if t.peek('ready')
|
21
|
+
job = t.reserve(timeout)
|
22
|
+
break
|
23
|
+
end
|
24
|
+
end
|
25
|
+
job
|
26
|
+
end
|
27
|
+
|
28
|
+
def watch(*names)
|
29
|
+
names.each do |n|
|
30
|
+
@watched << first_or_create(n)
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
def watch!(*names)
|
35
|
+
@watched = []
|
36
|
+
names.each do |n|
|
37
|
+
@watched << first_or_create(n)
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
def use(tube_name)
|
42
|
+
@used = first_or_create(tube_name)
|
43
|
+
end
|
44
|
+
|
45
|
+
def first_or_create(tube_name)
|
46
|
+
@all.find { |t| t.name == tube_name } || (@all << Tube.new(@pool, tube_name)).last
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
@@ -0,0 +1,65 @@
|
|
1
|
+
module MockBeaneater
|
2
|
+
class Tube
|
3
|
+
attr_reader :pool, :name
|
4
|
+
|
5
|
+
def initialize(pool, name)
|
6
|
+
@name = name.to_s
|
7
|
+
@pool = pool
|
8
|
+
@delayed = Containers::PriorityQueue.new
|
9
|
+
@ready = Containers::PriorityQueue.new
|
10
|
+
@reserved = []
|
11
|
+
end
|
12
|
+
|
13
|
+
def put(body, options={})
|
14
|
+
visible_at = (options[:delay] || 0) + Time.now.to_i
|
15
|
+
job = Job.new(body, self, visible_at, options[:pri] || 65536)
|
16
|
+
if options[:delay]
|
17
|
+
@delayed.push job, -1*visible_at
|
18
|
+
else
|
19
|
+
@ready.push job, job.pri
|
20
|
+
end
|
21
|
+
{:status => "INSERTED",
|
22
|
+
:body => nil,
|
23
|
+
:id => job.id}
|
24
|
+
end
|
25
|
+
|
26
|
+
def peek(state)
|
27
|
+
refresh_tube
|
28
|
+
if state == 'ready'
|
29
|
+
@ready.next
|
30
|
+
elsif state == 'delayed'
|
31
|
+
@delayed.next
|
32
|
+
else
|
33
|
+
nil
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
def reserve(timeout=nil)
|
38
|
+
refresh_tube
|
39
|
+
@ready.pop.tap { |j| @reserved << j if j }
|
40
|
+
end
|
41
|
+
|
42
|
+
def clear
|
43
|
+
@delayed.clear
|
44
|
+
@ready.clear
|
45
|
+
end
|
46
|
+
|
47
|
+
def delete(job)
|
48
|
+
@reserved.delete(job)
|
49
|
+
end
|
50
|
+
|
51
|
+
def release(job)
|
52
|
+
@reserved.delete(job)
|
53
|
+
@ready.push(job, job.pri)
|
54
|
+
end
|
55
|
+
|
56
|
+
private
|
57
|
+
|
58
|
+
def refresh_tube
|
59
|
+
while @delayed.next && @delayed.next.visible_at < Time.now.to_i
|
60
|
+
job = @delayed.pop
|
61
|
+
@ready.push job, job.pri
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
lib = File.expand_path('../lib', __FILE__)
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
+
require 'mock_beaneater/version'
|
5
|
+
|
6
|
+
Gem::Specification.new do |spec|
|
7
|
+
spec.name = "mock_beaneater"
|
8
|
+
spec.version = MockBeaneater::VERSION
|
9
|
+
spec.authors = ["Sean Xie"]
|
10
|
+
spec.email = ["seanx@referralcandy.com"]
|
11
|
+
spec.description = 'Beaneater mock for testing'
|
12
|
+
spec.summary = 'Beaneater mock for testing'
|
13
|
+
spec.homepage = 'https://rubygems.org/gems/mock_beaneater'
|
14
|
+
spec.licenses = ["MIT"]
|
15
|
+
|
16
|
+
spec.files = `git ls-files`.split($/)
|
17
|
+
spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
|
18
|
+
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
19
|
+
spec.require_paths = ["lib"]
|
20
|
+
|
21
|
+
spec.add_dependency "algorithms", ">= 0.6.1"
|
22
|
+
spec.add_development_dependency "bundler" , "~> 1.3"
|
23
|
+
spec.add_development_dependency "rspec" , ">= 2.9.0"
|
24
|
+
spec.add_development_dependency "rake"
|
25
|
+
end
|
@@ -0,0 +1,88 @@
|
|
1
|
+
require_relative '../spec_helper'
|
2
|
+
|
3
|
+
describe MockBeaneater::Job do
|
4
|
+
describe "#initialize" do
|
5
|
+
before { @tube = double }
|
6
|
+
subject { MockBeaneater::Job.new('body', @tube) }
|
7
|
+
its(:id) { should == MockBeaneater::Jobs.count }
|
8
|
+
its(:body) { should == 'body' }
|
9
|
+
its(:tube) { should == @tube }
|
10
|
+
its(:visible_at) { should be_within(1).of(Time.now.to_i) }
|
11
|
+
its(:reserved) { should be_false }
|
12
|
+
|
13
|
+
it "should assign each job a unique id through incrementing Jobs.count" do
|
14
|
+
current_count = MockBeaneater::Jobs.count
|
15
|
+
MockBeaneater::Job.new('body', double).id.should == current_count + 1
|
16
|
+
MockBeaneater::Job.new('body', double).id.should == current_count + 2
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
describe "#release" do
|
21
|
+
it "should set reserved to false" do
|
22
|
+
job = MockBeaneater::Job.new('body', double(:release => nil))
|
23
|
+
job.instance_variable_set(:@reserved, true)
|
24
|
+
job.release
|
25
|
+
job.should_not be_reserved
|
26
|
+
end
|
27
|
+
it "should request for tube to release self" do
|
28
|
+
tube = double
|
29
|
+
job = MockBeaneater::Job.new('body', tube)
|
30
|
+
tube.should_receive(:release).with(job)
|
31
|
+
job.release
|
32
|
+
end
|
33
|
+
it "should return hash with status and body (nil)" do
|
34
|
+
job = MockBeaneater::Job.new('body', double(:release => nil))
|
35
|
+
job.release.should == {:status => "RELEASED", :body => nil}
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
describe "#delete" do
|
40
|
+
it "should set reserved to false" do
|
41
|
+
job = MockBeaneater::Job.new('body', double(:delete => nil))
|
42
|
+
job.instance_variable_set(:@reserved, true)
|
43
|
+
job.delete
|
44
|
+
job.should_not be_reserved
|
45
|
+
end
|
46
|
+
it "should request for tube to delete self" do
|
47
|
+
tube = double
|
48
|
+
job = MockBeaneater::Job.new('body', tube)
|
49
|
+
tube.should_receive(:delete).with(job)
|
50
|
+
job.delete
|
51
|
+
end
|
52
|
+
it "should return hash with status and body (nil)" do
|
53
|
+
job = MockBeaneater::Job.new('body', double(:delete => nil))
|
54
|
+
job.delete.should == {:status => "DELETED", :body => nil}
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
describe "#reserved?" do
|
59
|
+
it "should return reserved status" do
|
60
|
+
job = MockBeaneater::Job.new('body', double)
|
61
|
+
[true, false].each do |status|
|
62
|
+
job.instance_variable_set(:@reserved, status)
|
63
|
+
job.reserved?.should == status
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
describe "#==" do
|
69
|
+
it "should be equal if both jobs have the same id" do
|
70
|
+
job = MockBeaneater::Job.new('body', double)
|
71
|
+
job2 = MockBeaneater::Job.new('body', double)
|
72
|
+
job2.instance_variable_set(:@id, job.id)
|
73
|
+
job.should == job2
|
74
|
+
end
|
75
|
+
it "should not be equal if both jobs have different ids" do
|
76
|
+
job = MockBeaneater::Job.new('body', double)
|
77
|
+
job2 = MockBeaneater::Job.new('body', double)
|
78
|
+
job.should_not == job2
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
82
|
+
describe "#to_s" do
|
83
|
+
it "should output only job id and body" do
|
84
|
+
job = MockBeaneater::Job.new('body', double)
|
85
|
+
job.to_s.should == "#<MockBeaneater::Job id=#{job.id} body=#{job.body.inspect}>"
|
86
|
+
end
|
87
|
+
end
|
88
|
+
end
|
data/spec/pool_spec.rb
ADDED
@@ -0,0 +1,16 @@
|
|
1
|
+
require_relative 'spec_helper'
|
2
|
+
|
3
|
+
describe MockBeaneater::Pool do
|
4
|
+
describe "#tubes" do
|
5
|
+
before { @pool = MockBeaneater::Pool.new }
|
6
|
+
it "should return an instance of tubes" do
|
7
|
+
@pool.tubes.should be_kind_of MockBeaneater::Tubes
|
8
|
+
end
|
9
|
+
it "should return tubes with reference to self" do
|
10
|
+
@pool.tubes.pool.should == @pool
|
11
|
+
end
|
12
|
+
it "should return same instance of tubes when called multiple times" do
|
13
|
+
@pool.tubes.should == @pool.tubes
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,83 @@
|
|
1
|
+
require_relative '../spec_helper'
|
2
|
+
|
3
|
+
describe MockBeaneater::Tubes do
|
4
|
+
describe "#initialize" do
|
5
|
+
before do
|
6
|
+
@pool = double
|
7
|
+
@default_tube = MockBeaneater::Tube.new(@pool, 'default')
|
8
|
+
MockBeaneater::Tube.stub(:new).and_return(@default_tube)
|
9
|
+
end
|
10
|
+
subject { MockBeaneater::Tubes.new(@pool) }
|
11
|
+
its(:pool) { should == @pool }
|
12
|
+
its(:all) { should == [@default_tube] }
|
13
|
+
its(:watched) { should == [@default_tube] }
|
14
|
+
its(:used) { should == @default_tube }
|
15
|
+
end
|
16
|
+
|
17
|
+
describe "#[]" do
|
18
|
+
it "should first_or_create tube with name:tube_name" do
|
19
|
+
tubes = MockBeaneater::Tubes.new(double)
|
20
|
+
tube_name = 'tube'
|
21
|
+
tubes.should_receive(:first_or_create).with(tube_name)
|
22
|
+
tubes[tube_name]
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
describe "#find" do
|
27
|
+
it "should first_or_create tube with name:tube_name" do
|
28
|
+
tubes = MockBeaneater::Tubes.new(double)
|
29
|
+
tube_name = 'tube'
|
30
|
+
tubes.should_receive(:first_or_create).with(tube_name)
|
31
|
+
tubes.find(tube_name)
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
describe "#reserve"do
|
36
|
+
it "should return job if any in watched tubes are ready"
|
37
|
+
end
|
38
|
+
|
39
|
+
describe "#watch" do
|
40
|
+
it "should add names to watch list" do
|
41
|
+
tubes = MockBeaneater::Tubes.new(double)
|
42
|
+
tube_names = ['watch-me', 'watch-me-too']
|
43
|
+
tubes.watched.should == [tubes.find('default')]
|
44
|
+
tubes.watch(*tube_names)
|
45
|
+
tubes.watched.should == [tubes.find('default'), tubes.find(tube_names.first), tubes.find(tube_names.last)]
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
describe "#watch!" do
|
50
|
+
it "should set watch list to tubes with names" do
|
51
|
+
tubes = MockBeaneater::Tubes.new(double)
|
52
|
+
tube_names = ['watch-me', 'watch-me-too']
|
53
|
+
tubes.watched.should == [tubes.find('default')]
|
54
|
+
tubes.watch!(*tube_names)
|
55
|
+
tubes.watched.should == [tubes.find(tube_names.first), tubes.find(tube_names.last)]
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
describe "#use" do
|
60
|
+
it "should set used to first or created tube with name:tube_name" do
|
61
|
+
tubes = MockBeaneater::Tubes.new(double)
|
62
|
+
tube_name = 'use-this-tube'
|
63
|
+
tubes.used.name.should == 'default'
|
64
|
+
tubes.use(tube_name)
|
65
|
+
tubes.used.name.should == tube_name
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
describe "#first_or_create" do
|
70
|
+
it "should return first known tube with tube_name if exists" do
|
71
|
+
tubes = MockBeaneater::Tubes.new(double)
|
72
|
+
tube_name = 'default'
|
73
|
+
tubes.first_or_create(tube_name).should == tubes.all.first
|
74
|
+
end
|
75
|
+
it "should create tube with name:tube_name if not known" do
|
76
|
+
tubes = MockBeaneater::Tubes.new(double)
|
77
|
+
tube_name = 'new-tube'
|
78
|
+
tubes.all.map(&:name).include?(tube_name).should be_false
|
79
|
+
tubes.first_or_create(tube_name).should == tubes.all.last
|
80
|
+
tubes.all.map(&:name).include?(tube_name).should be_true
|
81
|
+
end
|
82
|
+
end
|
83
|
+
end
|
@@ -0,0 +1,138 @@
|
|
1
|
+
require_relative '../spec_helper'
|
2
|
+
|
3
|
+
describe MockBeaneater::Tube do
|
4
|
+
describe "#initialize" do
|
5
|
+
before do
|
6
|
+
@pool = double
|
7
|
+
@name = 'tube'
|
8
|
+
end
|
9
|
+
subject { MockBeaneater::Tube.new(@pool, @name) }
|
10
|
+
its(:pool) { should == @pool }
|
11
|
+
its(:name) { should == @name }
|
12
|
+
|
13
|
+
it "should instantiate a priority queue to hold delayed jobs" do
|
14
|
+
tube = MockBeaneater::Tube.new(double, double)
|
15
|
+
tube.instance_variable_get(:@delayed).should be_kind_of Containers::PriorityQueue
|
16
|
+
end
|
17
|
+
it "should instantiate a priority queue to hold ready jobs" do
|
18
|
+
tube = MockBeaneater::Tube.new(double, double)
|
19
|
+
tube.instance_variable_get(:@ready).should be_kind_of Containers::PriorityQueue
|
20
|
+
end
|
21
|
+
it "should instantiate an empty array to hold reserved jobs" do
|
22
|
+
tube = MockBeaneater::Tube.new(double, double)
|
23
|
+
tube.instance_variable_get(:@reserved).should == []
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
describe "#put" do
|
28
|
+
before { @tube = MockBeaneater::Tube.new(double, double) }
|
29
|
+
it "should add job to ready container if no delay specified" do
|
30
|
+
job_id = @tube.put('body', :pri => 12345)[:id]
|
31
|
+
@tube.reserve.should do |j|
|
32
|
+
j.id.should == job_id
|
33
|
+
j.body.should == 'body'
|
34
|
+
j.pri.should == 12345
|
35
|
+
end
|
36
|
+
end
|
37
|
+
it "should add job to delayed container if delay specified" do
|
38
|
+
job_id = @tube.put('body', :delay => 3)[:id]
|
39
|
+
@tube.peek('delayed').should do |j|
|
40
|
+
j.id.should == job_id
|
41
|
+
j.body.should == 'body'
|
42
|
+
j.pri.should == 65536
|
43
|
+
end
|
44
|
+
end
|
45
|
+
it "should return hash with status, body (nil) and id" do
|
46
|
+
@tube.put('body', :pri => 12345).should ==
|
47
|
+
{:status => "INSERTED", :body => nil, :id => MockBeaneater::Jobs.count}
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
describe "#peek" do
|
52
|
+
before { @tube = MockBeaneater::Tube.new(double, double) }
|
53
|
+
it "should refresh_tube" do
|
54
|
+
@tube.should_receive(:refresh_tube).once
|
55
|
+
@tube.peek('ready')
|
56
|
+
end
|
57
|
+
context "peeking at ready jobs" do
|
58
|
+
it "should return next ready job if exists" do
|
59
|
+
job_id = @tube.put('im-ready')[:id]
|
60
|
+
@tube.put('im-ready-2')
|
61
|
+
@tube.put('im-ready-3')
|
62
|
+
@tube.peek('ready').id.should == job_id
|
63
|
+
end
|
64
|
+
it "should return nil if no ready job exists" do
|
65
|
+
@tube.peek('ready').should be_nil
|
66
|
+
end
|
67
|
+
end
|
68
|
+
context "peeking at delayed jobs" do
|
69
|
+
it "should return next delayed job if exists" do
|
70
|
+
@tube.put('im-delayed', :delay => 30)
|
71
|
+
@tube.put('im-delayed-2', :delay => 40)
|
72
|
+
job_id = @tube.put('im-delayed-3', :delay => 10)[:id]
|
73
|
+
@tube.peek('delayed').id.should == job_id
|
74
|
+
end
|
75
|
+
it "should return nil if no delayed job exists" do
|
76
|
+
@tube.peek('delayed').should be_nil
|
77
|
+
end
|
78
|
+
end
|
79
|
+
it "should return nil if state is not 'ready' or 'delayed'" do
|
80
|
+
@tube.peek('invalid_state').should be_nil
|
81
|
+
end
|
82
|
+
end
|
83
|
+
|
84
|
+
describe "#clear" do
|
85
|
+
it "should clear ready and delayed containers" do
|
86
|
+
tube = MockBeaneater::Tube.new(double, double)
|
87
|
+
5.times { tube.put('job') }
|
88
|
+
tube.clear
|
89
|
+
tube.peek('ready').should be_nil
|
90
|
+
tube.peek('delayed').should be_nil
|
91
|
+
end
|
92
|
+
end
|
93
|
+
|
94
|
+
describe "#delete" do
|
95
|
+
it "should delete job from reserved container" do
|
96
|
+
tube = MockBeaneater::Tube.new(double, double)
|
97
|
+
tube.put 'job'
|
98
|
+
tube.put 'job2'
|
99
|
+
job = tube.reserve
|
100
|
+
job2 = tube.reserve
|
101
|
+
tube.instance_variable_get(:@reserved).should == [job, job2]
|
102
|
+
job.delete
|
103
|
+
tube.instance_variable_get(:@reserved).should == [job2]
|
104
|
+
end
|
105
|
+
end
|
106
|
+
|
107
|
+
describe "#release" do
|
108
|
+
it "should delete job from reserved container and add job to ready container" do
|
109
|
+
tube = MockBeaneater::Tube.new(double, double)
|
110
|
+
tube.put 'job'
|
111
|
+
job = tube.reserve
|
112
|
+
tube.instance_variable_get(:@reserved).should == [job]
|
113
|
+
job.release
|
114
|
+
tube.instance_variable_get(:@reserved).should == []
|
115
|
+
tube.peek('ready').id.should == job.id
|
116
|
+
end
|
117
|
+
end
|
118
|
+
|
119
|
+
describe "#refresh_tube" do
|
120
|
+
it "should move jobs which should be visible from delayed to ready" do
|
121
|
+
tube = MockBeaneater::Tube.new(double, double)
|
122
|
+
job_id = tube.put('job')[:id]
|
123
|
+
job2_id = tube.put('job2', :delay => 1)[:id]
|
124
|
+
job3_id = tube.put('job3', :delay => 1)[:id]
|
125
|
+
job4_id = tube.put('job4', :delay => 30)[:id]
|
126
|
+
tube.peek('ready').id.should == job_id
|
127
|
+
tube.instance_variable_get(:@ready).size.should == 1
|
128
|
+
tube.peek('delayed').id.should == job2_id
|
129
|
+
tube.instance_variable_get(:@delayed).size.should == 3
|
130
|
+
sleep 2
|
131
|
+
tube.send(:refresh_tube)
|
132
|
+
tube.peek('ready').id.should == job_id
|
133
|
+
tube.instance_variable_get(:@ready).size.should == 3
|
134
|
+
tube.peek('delayed').id.should == job4_id
|
135
|
+
tube.instance_variable_get(:@delayed).size.should == 1
|
136
|
+
end
|
137
|
+
end
|
138
|
+
end
|
metadata
ADDED
@@ -0,0 +1,136 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: mock_beaneater
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.2
|
5
|
+
prerelease:
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- Sean Xie
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2013-10-31 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: algorithms
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
17
|
+
none: false
|
18
|
+
requirements:
|
19
|
+
- - ! '>='
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: 0.6.1
|
22
|
+
type: :runtime
|
23
|
+
prerelease: false
|
24
|
+
version_requirements: !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
26
|
+
requirements:
|
27
|
+
- - ! '>='
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: 0.6.1
|
30
|
+
- !ruby/object:Gem::Dependency
|
31
|
+
name: bundler
|
32
|
+
requirement: !ruby/object:Gem::Requirement
|
33
|
+
none: false
|
34
|
+
requirements:
|
35
|
+
- - ~>
|
36
|
+
- !ruby/object:Gem::Version
|
37
|
+
version: '1.3'
|
38
|
+
type: :development
|
39
|
+
prerelease: false
|
40
|
+
version_requirements: !ruby/object:Gem::Requirement
|
41
|
+
none: false
|
42
|
+
requirements:
|
43
|
+
- - ~>
|
44
|
+
- !ruby/object:Gem::Version
|
45
|
+
version: '1.3'
|
46
|
+
- !ruby/object:Gem::Dependency
|
47
|
+
name: rspec
|
48
|
+
requirement: !ruby/object:Gem::Requirement
|
49
|
+
none: false
|
50
|
+
requirements:
|
51
|
+
- - ! '>='
|
52
|
+
- !ruby/object:Gem::Version
|
53
|
+
version: 2.9.0
|
54
|
+
type: :development
|
55
|
+
prerelease: false
|
56
|
+
version_requirements: !ruby/object:Gem::Requirement
|
57
|
+
none: false
|
58
|
+
requirements:
|
59
|
+
- - ! '>='
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: 2.9.0
|
62
|
+
- !ruby/object:Gem::Dependency
|
63
|
+
name: rake
|
64
|
+
requirement: !ruby/object:Gem::Requirement
|
65
|
+
none: false
|
66
|
+
requirements:
|
67
|
+
- - ! '>='
|
68
|
+
- !ruby/object:Gem::Version
|
69
|
+
version: '0'
|
70
|
+
type: :development
|
71
|
+
prerelease: false
|
72
|
+
version_requirements: !ruby/object:Gem::Requirement
|
73
|
+
none: false
|
74
|
+
requirements:
|
75
|
+
- - ! '>='
|
76
|
+
- !ruby/object:Gem::Version
|
77
|
+
version: '0'
|
78
|
+
description: Beaneater mock for testing
|
79
|
+
email:
|
80
|
+
- seanx@referralcandy.com
|
81
|
+
executables: []
|
82
|
+
extensions: []
|
83
|
+
extra_rdoc_files: []
|
84
|
+
files:
|
85
|
+
- .gitignore
|
86
|
+
- Gemfile
|
87
|
+
- LICENSE.txt
|
88
|
+
- README.md
|
89
|
+
- Rakefile
|
90
|
+
- lib/mock_beaneater.rb
|
91
|
+
- lib/mock_beaneater/job.rb
|
92
|
+
- lib/mock_beaneater/job/collection.rb
|
93
|
+
- lib/mock_beaneater/job/record.rb
|
94
|
+
- lib/mock_beaneater/pool.rb
|
95
|
+
- lib/mock_beaneater/tube.rb
|
96
|
+
- lib/mock_beaneater/tube/collection.rb
|
97
|
+
- lib/mock_beaneater/tube/record.rb
|
98
|
+
- lib/mock_beaneater/version.rb
|
99
|
+
- mock_beaneater.gemspec
|
100
|
+
- spec/job/record_spec.rb
|
101
|
+
- spec/pool_spec.rb
|
102
|
+
- spec/spec_helper.rb
|
103
|
+
- spec/tube/collection_spec.rb
|
104
|
+
- spec/tube/record_spec.rb
|
105
|
+
homepage: https://rubygems.org/gems/mock_beaneater
|
106
|
+
licenses:
|
107
|
+
- MIT
|
108
|
+
post_install_message:
|
109
|
+
rdoc_options: []
|
110
|
+
require_paths:
|
111
|
+
- lib
|
112
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
113
|
+
none: false
|
114
|
+
requirements:
|
115
|
+
- - ! '>='
|
116
|
+
- !ruby/object:Gem::Version
|
117
|
+
version: '0'
|
118
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
119
|
+
none: false
|
120
|
+
requirements:
|
121
|
+
- - ! '>='
|
122
|
+
- !ruby/object:Gem::Version
|
123
|
+
version: '0'
|
124
|
+
requirements: []
|
125
|
+
rubyforge_project:
|
126
|
+
rubygems_version: 1.8.23
|
127
|
+
signing_key:
|
128
|
+
specification_version: 3
|
129
|
+
summary: Beaneater mock for testing
|
130
|
+
test_files:
|
131
|
+
- spec/job/record_spec.rb
|
132
|
+
- spec/pool_spec.rb
|
133
|
+
- spec/spec_helper.rb
|
134
|
+
- spec/tube/collection_spec.rb
|
135
|
+
- spec/tube/record_spec.rb
|
136
|
+
has_rdoc:
|