Factory overrides are applied before other attributes. Fixes #140.
This commit is contained in:
parent
ec886985d1
commit
4b83b1e62e
1
Gemfile
1
Gemfile
|
@ -4,6 +4,7 @@ gem "rake"
|
||||||
gem "rspec", "~> 2.0"
|
gem "rspec", "~> 2.0"
|
||||||
gem "rcov"
|
gem "rcov"
|
||||||
gem "activerecord", :require => false
|
gem "activerecord", :require => false
|
||||||
|
gem "activesupport", :require => false
|
||||||
gem "rr"
|
gem "rr"
|
||||||
gem "sqlite3-ruby", :require => false
|
gem "sqlite3-ruby", :require => false
|
||||||
gem "appraisal", "~> 0.3.5"
|
gem "appraisal", "~> 0.3.5"
|
||||||
|
|
|
@ -58,6 +58,7 @@ PLATFORMS
|
||||||
|
|
||||||
DEPENDENCIES
|
DEPENDENCIES
|
||||||
activerecord
|
activerecord
|
||||||
|
activesupport
|
||||||
appraisal (~> 0.3.5)
|
appraisal (~> 0.3.5)
|
||||||
bluecloth
|
bluecloth
|
||||||
cucumber (~> 1.0.0)
|
cucumber (~> 1.0.0)
|
||||||
|
|
|
@ -34,6 +34,10 @@ module FactoryGirl
|
||||||
1
|
1
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def aliases_for?(attr)
|
||||||
|
FactoryGirl.aliases_for(attr).include?(name)
|
||||||
|
end
|
||||||
|
|
||||||
def <=>(another)
|
def <=>(another)
|
||||||
return nil unless another.is_a? Attribute
|
return nil unless another.is_a? Attribute
|
||||||
self.priority <=> another.priority
|
self.priority <=> another.priority
|
||||||
|
|
|
@ -76,13 +76,15 @@ module FactoryGirl
|
||||||
def run(proxy_class, overrides) #:nodoc:
|
def run(proxy_class, overrides) #:nodoc:
|
||||||
proxy = proxy_class.new(build_class)
|
proxy = proxy_class.new(build_class)
|
||||||
overrides = symbolize_keys(overrides)
|
overrides = symbolize_keys(overrides)
|
||||||
overrides.each {|attr, val| proxy.set(attr, val) }
|
|
||||||
passed_keys = overrides.keys.collect {|k| FactoryGirl.aliases_for(k) }.flatten
|
|
||||||
@attributes.each do |attribute|
|
@attributes.each do |attribute|
|
||||||
unless passed_keys.include?(attribute.name)
|
factory_overrides = overrides.select { |attr, val| attribute.aliases_for?(attr) }
|
||||||
|
if factory_overrides.empty?
|
||||||
attribute.add_to(proxy)
|
attribute.add_to(proxy)
|
||||||
|
else
|
||||||
|
factory_overrides.each { |attr, val| proxy.set(attr, val) }
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
overrides.each { |attr, val| proxy.set(attr, val) }
|
||||||
proxy.result(@to_create_block)
|
proxy.result(@to_create_block)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,65 @@
|
||||||
|
require 'spec_helper'
|
||||||
|
require 'acceptance/acceptance_helper'
|
||||||
|
require 'active_support/ordered_hash'
|
||||||
|
|
||||||
|
describe "attribute overrides" do
|
||||||
|
before do
|
||||||
|
define_model('User', :admin => :boolean)
|
||||||
|
define_model('Post', :title => :string,
|
||||||
|
:secure => :boolean,
|
||||||
|
:user_id => :integer) do
|
||||||
|
belongs_to :user
|
||||||
|
|
||||||
|
def secure=(value)
|
||||||
|
return unless user && user.admin?
|
||||||
|
write_attribute(:secure, value)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
FactoryGirl.define do
|
||||||
|
factory :user do
|
||||||
|
factory :admin do
|
||||||
|
admin true
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
factory :post do
|
||||||
|
user
|
||||||
|
title "default title"
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
let(:admin) { FactoryGirl.create(:admin) }
|
||||||
|
|
||||||
|
let(:post_attributes) do
|
||||||
|
attributes = ActiveSupport::OrderedHash.new
|
||||||
|
attributes[:secure] = false
|
||||||
|
attributes
|
||||||
|
end
|
||||||
|
|
||||||
|
let(:non_admin_post_attributes) do
|
||||||
|
post_attributes[:user] = FactoryGirl.create(:user)
|
||||||
|
post_attributes
|
||||||
|
end
|
||||||
|
|
||||||
|
let(:admin_post_attributes) do
|
||||||
|
post_attributes[:user] = admin
|
||||||
|
post_attributes
|
||||||
|
end
|
||||||
|
|
||||||
|
context "with an admin posting" do
|
||||||
|
subject { FactoryGirl.create(:post, admin_post_attributes) }
|
||||||
|
its(:secure) { should == false }
|
||||||
|
end
|
||||||
|
|
||||||
|
context "with a non-admin posting" do
|
||||||
|
subject { FactoryGirl.create(:post, non_admin_post_attributes) }
|
||||||
|
its(:secure) { should be_nil }
|
||||||
|
end
|
||||||
|
|
||||||
|
context "with no user posting" do
|
||||||
|
subject { FactoryGirl.create(:post, post_attributes) }
|
||||||
|
its(:secure) { should be_nil }
|
||||||
|
end
|
||||||
|
end
|
Loading…
Reference in New Issue