1
0
Fork 0
mirror of https://github.com/thoughtbot/factory_bot.git synced 2022-11-09 11:43:51 -05:00
thoughtbot--factory_bot/spec/integration_spec.rb
Nathan Sutton 8f3b24a559 Fixing inheritance of callbacks
Since callbacks share the same names they wouldn't be inherited.
I added a check to allow them to be inherited.
2009-10-10 00:23:57 -05:00

304 lines
7.8 KiB
Ruby

require File.expand_path(File.join(File.dirname(__FILE__), 'spec_helper'))
describe "integration" do
before do
Factory.define :user, :class => 'user' do |f|
f.first_name 'Jimi'
f.last_name 'Hendrix'
f.admin false
f.email {|a| "#{a.first_name}.#{a.last_name}@example.com".downcase }
end
Factory.define Post, :default_strategy => :attributes_for do |f|
f.name 'Test Post'
f.association :author, :factory => :user
end
Factory.define :admin, :class => User do |f|
f.first_name 'Ben'
f.last_name 'Stein'
f.admin true
f.sequence(:username) { |n| "username#{n}" }
f.email { Factory.next(:email) }
end
Factory.define :sequence_abuser, :class => User do |f|
f.first_name { Factory.sequence(:email) }
end
Factory.define :guest, :parent => :user do |f|
f.last_name 'Anonymous'
f.username 'GuestUser'
end
Factory.define :user_with_callbacks, :parent => :user do |f|
f.after_stub {|u| u.first_name = 'Stubby' }
f.after_build {|u| u.first_name = 'Buildy' }
f.after_create {|u| u.last_name = 'Createy' }
end
Factory.define :user_with_inherited_callbacks, :parent => :user_with_callbacks do |f|
f.callback(:after_stub) {|u| u.last_name = 'Double-Stubby' }
end
Factory.define :business do |f|
f.name 'Supplier of Awesome'
f.association :owner, :factory => :user
end
Factory.sequence :email do |n|
"somebody#{n}@example.com"
end
end
after do
Factory.factories.clear
end
describe "a generated attributes hash" do
before do
@attrs = Factory.attributes_for(:user, :first_name => 'Bill')
end
it "should assign all attributes" do
expected_attrs = [:admin, :email, :first_name, :last_name]
actual_attrs = @attrs.keys.sort {|a, b| a.to_s <=> b.to_s }
actual_attrs.should == expected_attrs
end
it "should correctly assign lazy, dependent attributes" do
@attrs[:email].should == "bill.hendrix@example.com"
end
it "should override attrbutes" do
@attrs[:first_name].should == 'Bill'
end
it "should not assign associations" do
Factory.attributes_for(:post)[:author].should be_nil
end
end
describe "a built instance" do
before do
@instance = Factory.build(:post)
end
it "should not be saved" do
@instance.should be_new_record
end
it "should assign associations" do
@instance.author.should be_kind_of(User)
end
it "should save associations" do
@instance.author.should_not be_new_record
end
it "should not assign both an association and its foreign key" do
Factory.build(:post, :author_id => 1).author_id.should == 1
end
end
describe "a created instance" do
before do
@instance = Factory.create('post')
end
it "should be saved" do
@instance.should_not be_new_record
end
it "should assign associations" do
@instance.author.should be_kind_of(User)
end
it "should save associations" do
@instance.author.should_not be_new_record
end
end
describe "a generated stub instance" do
before do
@stub = Factory.stub(:user, :first_name => 'Bill')
end
it "should assign all attributes" do
[:admin, :email, :first_name, :last_name].each do |attr|
@stub.send(attr).should_not be_nil
end
end
it "should correctly assign attributes" do
@stub.email.should == "bill.hendrix@example.com"
end
it "should override attributes" do
@stub.first_name.should == 'Bill'
end
it "should assign associations" do
Factory.stub(:post).author.should_not be_nil
end
it "should have an id" do
@stub.id.should > 0
end
it "should have unique IDs" do
@other_stub = Factory.stub(:user)
@stub.id.should_not == @other_stub.id
end
it "should not be considered a new record" do
@stub.should_not be_new_record
end
it "should raise exception if connection to the database is attempted" do
lambda { @stub.connection }.should raise_error(RuntimeError)
lambda { @stub.update_attribute(:first_name, "Nick") }.should raise_error(RuntimeError)
lambda { @stub.reload }.should raise_error(RuntimeError)
lambda { @stub.destroy }.should raise_error(RuntimeError)
lambda { @stub.save }.should raise_error(RuntimeError)
lambda { @stub.increment!(:age) }.should raise_error(RuntimeError)
end
end
describe "an instance generated by a factory with a custom class name" do
before do
@instance = Factory.create(:admin)
end
it "should use the correct class name" do
@instance.should be_kind_of(User)
end
it "should use the correct factory definition" do
@instance.should be_admin
end
end
describe "an instance generated by a factory that inherits from another factory" do
before do
@instance = Factory.create(:guest)
end
it "should use the class name of the parent factory" do
@instance.should be_kind_of(User)
end
it "should have attributes of the parent" do
@instance.first_name.should == 'Jimi'
end
it "should have attributes defined in the factory itself" do
@instance.username.should == 'GuestUser'
end
it "should have attributes that have been overriden" do
@instance.last_name.should == 'Anonymous'
end
end
describe "an attribute generated by a sequence" do
before do
@email = Factory.attributes_for(:admin)[:email]
end
it "should match the correct format" do
@email.should =~ /^somebody\d+@example\.com$/
end
describe "after the attribute has already been generated once" do
before do
@another_email = Factory.attributes_for(:admin)[:email]
end
it "should match the correct format" do
@email.should =~ /^somebody\d+@example\.com$/
end
it "should not be the same as the first generated value" do
@another_email.should_not == @email
end
end
end
describe "an attribute generated by an in-line sequence" do
before do
@username = Factory.attributes_for(:admin)[:username]
end
it "should match the correct format" do
@username.should =~ /^username\d+$/
end
describe "after the attribute has already been generated once" do
before do
@another_username = Factory.attributes_for(:admin)[:username]
end
it "should match the correct format" do
@username.should =~ /^username\d+$/
end
it "should not be the same as the first generated value" do
@another_username.should_not == @username
end
end
end
describe "a factory with a default strategy specified" do
it "should generate instances according to the strategy" do
Factory(:post).should be_kind_of(Hash)
end
end
it "should raise Factory::SequenceAbuseError" do
lambda {
Factory(:sequence_abuser)
}.should raise_error(Factory::SequenceAbuseError)
end
describe "an instance with callbacks" do
it "should run the after_stub callback when stubbing" do
@user = Factory.stub(:user_with_callbacks)
@user.first_name.should == 'Stubby'
end
it "should run the after_build callback when building" do
@user = Factory.build(:user_with_callbacks)
@user.first_name.should == 'Buildy'
end
it "should run both the after_build and after_create callbacks when creating" do
@user = Factory(:user_with_callbacks)
@user.first_name.should == 'Buildy'
@user.last_name.should == 'Createy'
end
it "should run both the after_stub callback on the factory and the inherited after_stub callback" do
@user = Factory.stub(:user_with_inherited_callbacks)
@user.first_name.should == 'Stubby'
@user.last_name.should == 'Double-Stubby'
end
end
end