Skip to content

Commit

Permalink
sequence can now have multiple aliases
Browse files Browse the repository at this point in the history
  • Loading branch information
kristianmandrup authored and joshuaclayton committed Apr 6, 2012
1 parent 055c976 commit f387e38
Show file tree
Hide file tree
Showing 4 changed files with 45 additions and 7 deletions.
18 changes: 11 additions & 7 deletions lib/factory_girl/sequence.rb
Expand Up @@ -3,12 +3,14 @@ module FactoryGirl
# Sequences are defined using sequence within a FactoryGirl.define block.
# Sequence values are generated using next.
class Sequence
attr_reader :name
attr_reader :name, :names, :value

def initialize(name, value = 1, &proc) #:nodoc:
@name = name
@proc = proc
@value = value
def initialize(*names, &proc) #:nodoc:
names.flatten!
@value = value?(names.last) ? names.slice!(-1) : 1
@names = names
@name = names.first
@proc = proc
end

def next
Expand All @@ -17,8 +19,10 @@ def next
@value = @value.next
end

def names
[@name]
private

def value? item
item.is_a?(Numeric) || item.is_a?(String)
end
end
end
8 changes: 8 additions & 0 deletions lib/factory_girl/syntax/default.rb
Expand Up @@ -33,6 +33,14 @@ def sequence(name, start_value = 1, &block)
FactoryGirl.register_sequence(Sequence.new(name, start_value, &block))
end

# define aliased sequence
# - register multiple sequences with same logic but different identifying names
def sequences(*names, &block)
names.each do |name|
FactoryGirl.register_sequence(Sequence.new(names, &block))
end
end

def trait(name, &block)
FactoryGirl.register_trait(Trait.new(name, &block))
end
Expand Down
9 changes: 9 additions & 0 deletions spec/factory_girl/registry_spec.rb
Expand Up @@ -3,6 +3,8 @@
describe FactoryGirl::Registry do
let(:aliases) { [:thing, :widget] }
let(:sequence) { FactoryGirl::Sequence.new(:email) { |n| "somebody#{n}@example.com" } }
let(:sequences) { FactoryGirl::Sequence.new(:email, :sender, :receiver) { |n| "some_one_else#{n}@example.com" } }

let(:factory) { FactoryGirl::Factory.new(:object) }
let(:other_factory) { FactoryGirl::Factory.new(:string) }
let(:factory_with_aliases) { FactoryGirl::Factory.new(:string, aliases: aliases) }
Expand Down Expand Up @@ -61,6 +63,13 @@
subject.find(:email).should == sequence
end

it "registers a multi sequences" do
subject.add(sequences)
subject.find(:email).should == sequences
subject.find(:sender).should == sequences
subject.find(:receiver).should == sequences
end

it "doesn't allow a duplicate name" do
expect { 2.times { subject.add(factory) } }.
to raise_error(FactoryGirl::DuplicateDefinitionError, "Factory already registered: object")
Expand Down
17 changes: 17 additions & 0 deletions spec/factory_girl/sequence_spec.rb
Expand Up @@ -25,6 +25,23 @@
end
end

describe "a sequence with multiple names (aliases)" do
let(:name) { :test }
let(:value) { 3 }
let(:aliases) { [:alias, :other] }
subject { FactoryGirl::Sequence.new(name, :alias, :other, value) {|n| "=#{n}" } }

its(:name) { should == name }
its(:value) { should == value }
its(:names) { should == ([name] + aliases) }
its(:next) { should == "=3" }

describe "when incrementing" do
before { subject.next }
its(:next) { should == "=4" }
end
end

describe "a basic sequence without a block" do
subject { FactoryGirl::Sequence.new(:name) }
its(:next) { should == 1 }
Expand Down

0 comments on commit f387e38

Please sign in to comment.