Skip to content

Commit

Permalink
Fix callback handling from implicit traits
Browse files Browse the repository at this point in the history
  • Loading branch information
joshuaclayton committed Oct 31, 2011
1 parent aee300a commit 0124d42
Show file tree
Hide file tree
Showing 5 changed files with 26 additions and 16 deletions.
3 changes: 2 additions & 1 deletion lib/factory_girl/declaration/implicit.rb
Expand Up @@ -23,7 +23,8 @@ def build
elsif FactoryGirl.sequences.registered?(name)
[Attribute::Sequence.new(name, name, @ignored)]
else
@factory.trait_by_name(name).attributes.to_a
@factory.inherit_traits([name])
[]
end
end
end
Expand Down
13 changes: 11 additions & 2 deletions lib/factory_girl/definition.rb
Expand Up @@ -7,10 +7,19 @@ def initialize(name = nil)
@callbacks = []
@defined_traits = []
@to_create = nil
@traits = []
end

delegate :declare_attribute, :to => :attribute_list

def traits
@traits.reverse.map { |name| trait_by_name(name) }

This comment has been minimized.

Copy link
@ngan

ngan Nov 23, 2011

Will doing a reverse here cause trait callbacks to run in reverse as well? See #246

end

def inherit_traits(new_traits)
@traits += new_traits
end

def add_callback(callback)
@callbacks << callback
end
Expand All @@ -27,12 +36,12 @@ def define_trait(trait)
@defined_traits << trait
end

private

def trait_by_name(name)
trait_for(name) || FactoryGirl.trait_by_name(name)
end

private

def trait_for(name)
defined_traits.detect {|trait| trait.name == name }
end
Expand Down
9 changes: 3 additions & 6 deletions lib/factory_girl/factory.rb
Expand Up @@ -10,14 +10,15 @@ def initialize(name, options = {}) #:nodoc:
@name = name.to_s.underscore.to_sym
@parent = options[:parent]
@aliases = options[:aliases] || []
@traits = options[:traits] || []
@class_name = options[:class]
@default_strategy = options[:default_strategy]
@definition = Definition.new(@name)

inherit_traits(options[:traits] || [])
end

delegate :add_callback, :declare_attribute, :to_create, :define_trait,
:defined_traits, :trait_by_name, :to => :@definition
:defined_traits, :traits, :inherit_traits, :to => :@definition

def factory_name
$stderr.puts "DEPRECATION WARNING: factory.factory_name is deprecated; use factory.name instead."
Expand Down Expand Up @@ -128,10 +129,6 @@ def assert_valid_options(options)
end
end

def traits
@traits.reverse.map { |name| trait_by_name(name) }
end

def parent
if @parent
FactoryGirl.factory_by_name(@parent)
Expand Down
2 changes: 1 addition & 1 deletion spec/acceptance/traits_spec.rb
Expand Up @@ -197,6 +197,6 @@

context "when the factory has an implicit trait" do
subject { FactoryGirl.create(:caps_user_implicit_trait) }
its(:name) { pending }
its(:name) { should == "JOHN" }
end
end
15 changes: 9 additions & 6 deletions spec/factory_girl/definition_spec.rb
Expand Up @@ -47,21 +47,24 @@
end
end

describe FactoryGirl::Definition, "#trait_by_name" do
describe FactoryGirl::Definition, "#traits" do
let(:female_trait) { stub("female trait", :name => :female) }
let(:admin_trait) { stub("admin trait", :name => :admin) }

before do
subject.define_trait(female_trait)
FactoryGirl.stubs(:trait_by_name => admin_trait)
end

it "finds the correct trait if defined on the definition" do
subject.trait_by_name(:female).should == female_trait
its(:traits) { should be_empty }

it "finds the correct traits after inheriting" do
subject.inherit_traits([:female])
subject.traits.should == [female_trait]
end

it "looks for the trait on FactoryGirl" do
FactoryGirl.stubs(:trait_by_name => admin_trait)
subject.trait_by_name(:admin).should == admin_trait
FactoryGirl.should have_received(:trait_by_name).with(:admin)
subject.inherit_traits([:female, :admin])
subject.traits.should == [admin_trait, female_trait]
end
end

0 comments on commit 0124d42

Please sign in to comment.