Skip to content

Commit

Permalink
Reorganize code
Browse files Browse the repository at this point in the history
  • Loading branch information
leshill committed Apr 7, 2011
1 parent 6f67cd6 commit 7df1b3d
Show file tree
Hide file tree
Showing 11 changed files with 394 additions and 372 deletions.
43 changes: 41 additions & 2 deletions lib/resque_spec.rb
Original file line number Diff line number Diff line change
@@ -1,8 +1,47 @@
require 'resque_spec/resque_spec'
require 'resque_spec/resque_scheduler_spec'
require 'resque_spec/ext'
require 'resque_spec/helpers'
require 'resque_spec/matchers'

module ResqueSpec
extend self

def queue_by_name(name)
queues[name]
end

def queue_for(klass)
queue_by_name(queue_name(klass))
end

def queue_name(klass)
if klass.is_a?(String)
klass = Kernel.const_get(klass) rescue nil
end

name_from_instance_var(klass) or
name_from_queue_accessor(klass) or
raise ::Resque::NoQueueError.new("Jobs must be placed onto a queue.")
end

def queues
@queues ||= Hash.new {|h,k| h[k] = []}
end

def reset!
queues.clear
end

private

def name_from_instance_var(klass)
klass.instance_variable_get(:@queue)
end

def name_from_queue_accessor(klass)
klass.respond_to?(:queue) and klass.queue
end
end

config = RSpec.configuration
config.include ResqueSpec::Helpers

Expand Down
26 changes: 26 additions & 0 deletions lib/resque_spec/ext.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
require 'resque'

module Resque
class Job
def self.create(queue, klass, *args)
raise ::Resque::NoQueueError.new("Jobs must be placed onto a queue.") if !queue
raise ::Resque::NoClassError.new("Jobs must be given a class.") if klass.to_s.empty?
ResqueSpec.queues[queue] << {:klass => klass.to_s, :args => args}
end

def self.destroy(queue, klass, *args)
raise ::Resque::NoQueueError.new("Jobs must have been placed onto a queue.") if !queue
raise ::Resque::NoClassError.new("Jobs must have been given a class.") if klass.to_s.empty?

old_count = ResqueSpec.queues[queue].size

if args.empty?
ResqueSpec.queues[queue].delete_if{ |job| job[:klass] == klass.to_s }
else
ResqueSpec.queues[queue].delete_if{ |job| job[:klass] == klass.to_s and job[:args].to_a == args.to_a }
end

old_count - ResqueSpec.queues[queue].size
end
end
end
84 changes: 0 additions & 84 deletions lib/resque_spec/resque_spec.rb

This file was deleted.

Original file line number Diff line number Diff line change
@@ -1,18 +1,16 @@
require 'resque_spec'

module ResqueSpec

def schedule_for(klass)
name = "#{queue_name(klass)}_scheduled"
queues[name]
end

module ResqueScheduler
module SchedulerExt
def enqueue_at(time, klass, *args)
ResqueSpec.schedule_for(klass) << {:klass => klass.to_s, :time => time, :args => args}
end
end

end

Resque.extend(ResqueSpec::ResqueScheduler)
Resque.extend(ResqueSpec::SchedulerExt)
73 changes: 73 additions & 0 deletions spec/resque_spec.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,73 @@
require 'spec_helper'

describe ResqueSpec do
before do
ResqueSpec.reset!
end

let(:first_name) { 'Les' }
let(:last_name) { 'Hill' }

describe "#queue_by_name" do

it "has an empty array if nothing queued for a class" do
ResqueSpec.queue_by_name(:my_queue).should == []
end

it "allows additions" do
ResqueSpec.queue_by_name(:my_queue) << 'queued'
ResqueSpec.queue_by_name(:my_queue).should_not be_empty
end

end

describe "#queue_for" do
it "raises if there is no queue defined for a class" do
expect do
ResqueSpec.queue_for(Address)
end.should raise_error(::Resque::NoQueueError)
end

it "recognizes a queue defined as a class instance variable" do
expect do
ResqueSpec.queue_for(Person)
end.should_not raise_error(::Resque::NoQueueError)
end

it "recognizes a queue defined as a class method" do
expect do
ResqueSpec.queue_for(Account)
end.should_not raise_error(::Resque::NoQueueError)
end

end

describe "#queue_name" do
it "raises if there is no queue defined for a class" do
expect do
ResqueSpec.queue_name(Address)
end.should raise_error(::Resque::NoQueueError)
end

it "returns the queue name if there is a queue defined as an instance var" do
ResqueSpec.queue_name(Person).should == :people
end

it "returns the queue name for the name of the class" do
ResqueSpec.queue_name("Person").should == :people
end

it "returns the queue name if there is a queue defined via self.queue" do
ResqueSpec.queue_name(Account).should == :people
end

end

describe "#reset!" do
it "clears the queues" do
ResqueSpec.queue_for(Person) << 'queued'
ResqueSpec.reset!
ResqueSpec.queues.should be_empty
end
end
end
108 changes: 108 additions & 0 deletions spec/resque_spec/ext_spec.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,108 @@
require 'spec_helper'

describe "Resque Extensions" do
before do
ResqueSpec.reset!
end

let(:first_name) { 'Les' }
let(:last_name) { 'Hill' }

describe "Resque" do
before do
Resque.enqueue(Person, "abc", "def")
Resque.enqueue(Person, "xyz", "lmn")
Resque.enqueue(Person, "xyz", "lmn")
end

describe "#enqueue" do

before do
Resque.enqueue(Person, first_name, last_name)
end

it "adds to the queue hash" do
ResqueSpec.queue_for(Person).should_not be_empty
end

it "sets the klass on the queue" do
ResqueSpec.queue_for(Person).last.should include(:klass => Person.to_s)
end

it "sets the arguments on the queue" do
ResqueSpec.queue_for(Person).last.should include(:args => [first_name, last_name])
end

end

describe "#dequeue" do
describe "without arguments" do
it "should remove all items from queue with the given class" do
ResqueSpec.queue_for(Person).count.should == 3
expect do
Resque.dequeue(Person).should == 3
end.should change(ResqueSpec.queue_for(Person), :count).by(-3)
ResqueSpec.queue_for(Person).count.should == 0
end
end

describe "with arguments" do
it "should remove items from queue with the given class and arguments" do
ResqueSpec.queue_for(Person).count.should == 3
expect do
Resque.dequeue(Person, "xyz", "lmn").should == 2
end.should change(ResqueSpec.queue_for(Person), :size).by(-2)
ResqueSpec.queue_for(Person).count.should == 1
end
end
end
end

describe Resque::Job do
before do
Resque.enqueue(Person, "abc", "def")
Resque.enqueue(Person, "xyz", "lmn")
Resque.enqueue(Person, "xyz", "lmn")
end

describe "#create" do
before do
::Resque::Job.create(:people, Person, first_name, last_name)
end

it "adds to the queue hash" do
ResqueSpec.queues[:people].should_not be_empty
end

it "sets the klass on the queue" do
ResqueSpec.queues[:people].last.should include(:klass => Person.to_s)
end

it "sets the arguments on the queue" do
ResqueSpec.queues[:people].last.should include(:args => [first_name, last_name])
end
end

describe "#destroy" do
describe "without arguments" do
it "should remove all items from queue with the given class" do
ResqueSpec.queue_for(Person).count.should == 3
expect do
Resque::Job.destroy(:people, Person).should == 3
end.should change(ResqueSpec.queue_for(Person), :count).by(-3)
ResqueSpec.queue_for(Person).count.should == 0
end
end

describe "with arguments" do
it "should remove items from queue with the given class and arguments" do
ResqueSpec.queue_for(Person).count.should == 3
expect do
Resque::Job.destroy(:people, Person, "xyz", "lmn").should == 2
end.should change(ResqueSpec.queue_for(Person), :size).by(-2)
ResqueSpec.queue_for(Person).count.should == 1
end
end
end
end
end
File renamed without changes.
Loading

0 comments on commit 7df1b3d

Please sign in to comment.