factory_girl 2.5.2 → 2.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (48) hide show
  1. data/.travis.yml +0 -1
  2. data/Changelog +6 -0
  3. data/GETTING_STARTED.md +52 -7
  4. data/Gemfile.lock +1 -1
  5. data/gemfiles/2.3.gemfile.lock +1 -1
  6. data/gemfiles/3.0.gemfile.lock +1 -1
  7. data/gemfiles/3.1.gemfile.lock +1 -1
  8. data/gemfiles/3.2.gemfile.lock +1 -1
  9. data/lib/factory_girl.rb +2 -1
  10. data/lib/factory_girl/association_runner.rb +50 -0
  11. data/lib/factory_girl/definition_proxy.rb +1 -1
  12. data/lib/factory_girl/evaluator.rb +12 -1
  13. data/lib/factory_girl/factory.rb +5 -5
  14. data/lib/factory_girl/strategy.rb +32 -0
  15. data/lib/factory_girl/{proxy → strategy}/attributes_for.rb +5 -2
  16. data/lib/factory_girl/strategy/build.rb +15 -0
  17. data/lib/factory_girl/{proxy → strategy}/create.rb +6 -2
  18. data/lib/factory_girl/{proxy → strategy}/stub.rb +4 -5
  19. data/lib/factory_girl/syntax/generate.rb +3 -3
  20. data/lib/factory_girl/syntax/make.rb +2 -2
  21. data/lib/factory_girl/syntax/methods.rb +6 -6
  22. data/lib/factory_girl/version.rb +1 -1
  23. data/spec/acceptance/build_spec.rb +2 -2
  24. data/spec/acceptance/create_list_spec.rb +41 -0
  25. data/spec/acceptance/create_spec.rb +39 -10
  26. data/spec/acceptance/stub_spec.rb +40 -13
  27. data/spec/acceptance/syntax/vintage_spec.rb +10 -10
  28. data/spec/acceptance/traits_spec.rb +1 -1
  29. data/spec/acceptance/transient_attributes_spec.rb +2 -2
  30. data/spec/factory_girl/association_runner_spec.rb +31 -0
  31. data/spec/factory_girl/attribute/association_spec.rb +0 -1
  32. data/spec/factory_girl/attribute_spec.rb +0 -1
  33. data/spec/factory_girl/declaration/implicit_spec.rb +0 -1
  34. data/spec/factory_girl/factory_spec.rb +16 -16
  35. data/spec/factory_girl/{proxy → strategy}/attributes_for_spec.rb +2 -2
  36. data/spec/factory_girl/strategy/build_spec.rb +7 -0
  37. data/spec/factory_girl/{proxy → strategy}/create_spec.rb +3 -3
  38. data/spec/factory_girl/{proxy → strategy}/stub_spec.rb +4 -4
  39. data/spec/factory_girl/strategy_spec.rb +21 -0
  40. data/spec/support/shared_examples/strategy.rb +112 -0
  41. metadata +47 -48
  42. data/gemfiles/2.1.gemfile +0 -8
  43. data/gemfiles/2.1.gemfile.lock +0 -74
  44. data/lib/factory_girl/proxy.rb +0 -64
  45. data/lib/factory_girl/proxy/build.rb +0 -27
  46. data/spec/factory_girl/proxy/build_spec.rb +0 -7
  47. data/spec/factory_girl/proxy_spec.rb +0 -19
  48. data/spec/support/shared_examples/proxy.rb +0 -90
@@ -1,4 +1,4 @@
1
1
  module FactoryGirl
2
- VERSION = "2.5.2"
2
+ VERSION = "2.6.0"
3
3
  end
4
4
 
@@ -31,7 +31,7 @@ describe "a built instance" do
31
31
  end
32
32
  end
33
33
 
34
- describe "a built instance with :method => :build" do
34
+ describe "a built instance with :strategy => :build" do
35
35
  include FactoryGirl::Syntax::Methods
36
36
 
37
37
  before do
@@ -45,7 +45,7 @@ describe "a built instance with :method => :build" do
45
45
  factory :user
46
46
 
47
47
  factory :post do
48
- association(:user, :method => :build)
48
+ association(:user, :strategy => :build)
49
49
  end
50
50
  end
51
51
  end
@@ -39,3 +39,44 @@ describe "create multiple instances" do
39
39
  end
40
40
  end
41
41
  end
42
+
43
+ describe "multiple creates and ignored attributes to dynamically build attribute lists" do
44
+ before do
45
+ define_model('User', :name => :string) do
46
+ has_many :posts
47
+ end
48
+
49
+ define_model('Post', :title => :string, :user_id => :integer) do
50
+ belongs_to :user
51
+ end
52
+
53
+ FactoryGirl.define do
54
+ factory :post do
55
+ title "Through the Looking Glass"
56
+ user
57
+ end
58
+
59
+ factory :user do
60
+ name "John Doe"
61
+
62
+ factory :user_with_posts do
63
+ ignore do
64
+ posts_count 5
65
+ end
66
+
67
+ after_create do |user, evaluator|
68
+ FactoryGirl.create_list(:post, evaluator.posts_count, :user => user)
69
+ end
70
+ end
71
+ end
72
+ end
73
+ end
74
+
75
+ it "generates the correct number of posts" do
76
+ FactoryGirl.create(:user_with_posts).posts.length.should == 5
77
+ end
78
+
79
+ it "allows the number of posts to be modified" do
80
+ FactoryGirl.create(:user_with_posts, :posts_count => 2).posts.length.should == 2
81
+ end
82
+ end
@@ -31,30 +31,59 @@ describe "a created instance" do
31
31
  end
32
32
  end
33
33
 
34
- describe "a created instance, specifying :method => build" do
34
+ describe "a created instance, specifying :strategy => build" do
35
35
  include FactoryGirl::Syntax::Methods
36
36
 
37
- before do
38
- define_model('User')
37
+ def define_factories_with_method
38
+ FactoryGirl.define do
39
+ factory :user
39
40
 
40
- define_model('Post', :user_id => :integer) do
41
- belongs_to :user
41
+ factory :post do
42
+ association(:user, :method => :build)
43
+ end
42
44
  end
45
+ end
43
46
 
47
+ def define_factories_with_strategy
44
48
  FactoryGirl.define do
45
49
  factory :user
46
50
 
47
51
  factory :post do
48
- association(:user, :method => :build)
52
+ association(:user, :strategy => :build)
49
53
  end
50
54
  end
51
55
  end
52
56
 
53
- subject { create('post') }
57
+ before do
58
+ define_model('User')
54
59
 
55
- it "still saves associations (:method => :build only affects build, not create)" do
56
- subject.user.should be_kind_of(User)
57
- subject.user.should_not be_new_record
60
+ define_model('Post', :user_id => :integer) do
61
+ belongs_to :user
62
+ end
63
+ end
64
+
65
+ context "associations declared with :strategy" do
66
+ before { define_factories_with_strategy }
67
+ subject { build_stubbed(:post) }
68
+
69
+ subject { create('post') }
70
+
71
+ it "still saves associations (:strategy => :build only affects build, not create)" do
72
+ subject.user.should be_kind_of(User)
73
+ subject.user.should_not be_new_record
74
+ end
75
+ end
76
+
77
+ context "associations declared with :method" do
78
+ before { define_factories_with_method }
79
+ subject { build_stubbed(:post) }
80
+
81
+ subject { create('post') }
82
+
83
+ it "still saves associations (:method => :build only affects build, not create)" do
84
+ subject.user.should be_kind_of(User)
85
+ subject.user.should_not be_new_record
86
+ end
58
87
  end
59
88
  end
60
89
 
@@ -31,34 +31,61 @@ describe "a stubbed instance" do
31
31
  end
32
32
  end
33
33
 
34
- describe "a stubbed instance with :method => :build" do
34
+ describe "a stubbed instance overriding strategy" do
35
35
  include FactoryGirl::Syntax::Methods
36
36
 
37
- before do
38
- define_model('User')
37
+ def define_factories_with_method
38
+ FactoryGirl.define do
39
+ factory :user
39
40
 
40
- define_model('Post', :user_id => :integer) do
41
- belongs_to :user
41
+ factory :post do
42
+ association(:user, :method => :build)
43
+ end
42
44
  end
45
+ end
43
46
 
47
+ def define_factories_with_strategy
44
48
  FactoryGirl.define do
45
49
  factory :user
46
50
 
47
51
  factory :post do
48
- association(:user, :method => :build)
52
+ association(:user, :strategy => :build)
49
53
  end
50
54
  end
51
55
  end
52
56
 
53
- subject { build_stubbed(:post) }
54
-
55
- it "acts as if it is saved in the database" do
56
- should_not be_new_record
57
+ before do
58
+ define_model('User')
59
+ define_model('Post', :user_id => :integer) do
60
+ belongs_to :user
61
+ end
57
62
  end
58
63
 
59
- it "assigns associations and acts as if it is saved" do
60
- subject.user.should be_kind_of(User)
61
- subject.user.should_not be_new_record
64
+ context "associations declared with :strategy" do
65
+ before { define_factories_with_strategy }
66
+ subject { build_stubbed(:post) }
67
+
68
+ it "acts as if it is saved in the database" do
69
+ should_not be_new_record
70
+ end
71
+
72
+ it "assigns associations and acts as if it is saved" do
73
+ subject.user.should be_kind_of(User)
74
+ subject.user.should_not be_new_record
75
+ end
62
76
  end
63
77
 
78
+ context "associations declared with :method" do
79
+ before { define_factories_with_method }
80
+ subject { build_stubbed(:post) }
81
+
82
+ it "acts as if it is saved in the database" do
83
+ should_not be_new_record
84
+ end
85
+
86
+ it "assigns associations and acts as if it is saved" do
87
+ subject.user.should be_kind_of(User)
88
+ subject.user.should_not be_new_record
89
+ end
90
+ end
64
91
  end
@@ -93,40 +93,40 @@ describe "after defining a factory" do
93
93
  FactoryGirl.register_factory(@factory)
94
94
  end
95
95
 
96
- it "uses Proxy::AttributesFor for Factory.attributes_for" do
96
+ it "uses Strategy::AttributesFor for Factory.attributes_for" do
97
97
  @factory.stubs(:run => "result")
98
98
  Factory.attributes_for(@name, :attr => 'value').should == 'result'
99
- @factory.should have_received(:run).with(FactoryGirl::Proxy::AttributesFor, :attr => 'value')
99
+ @factory.should have_received(:run).with(FactoryGirl::Strategy::AttributesFor, :attr => 'value')
100
100
  end
101
101
 
102
- it "uses Proxy::Build for Factory.build" do
102
+ it "uses Strategy::Build for Factory.build" do
103
103
  @factory.stubs(:run => "result")
104
104
  Factory.build(@name, :attr => 'value').should == 'result'
105
- @factory.should have_received(:run).with(FactoryGirl::Proxy::Build, :attr => 'value')
105
+ @factory.should have_received(:run).with(FactoryGirl::Strategy::Build, :attr => 'value')
106
106
  end
107
107
 
108
- it "uses Proxy::Create for Factory.create" do
108
+ it "uses Strategy::Create for Factory.create" do
109
109
  @factory.stubs(:run => "result")
110
110
  Factory.create(@name, :attr => 'value').should == 'result'
111
- @factory.should have_received(:run).with(FactoryGirl::Proxy::Create, :attr => 'value')
111
+ @factory.should have_received(:run).with(FactoryGirl::Strategy::Create, :attr => 'value')
112
112
  end
113
113
 
114
- it "uses Proxy::Stub for Factory.stub" do
114
+ it "uses Strategy::Stub for Factory.stub" do
115
115
  @factory.stubs(:run => "result")
116
116
  Factory.stub(@name, :attr => 'value').should == 'result'
117
- @factory.should have_received(:run).with(FactoryGirl::Proxy::Stub, :attr => 'value')
117
+ @factory.should have_received(:run).with(FactoryGirl::Strategy::Stub, :attr => 'value')
118
118
  end
119
119
 
120
120
  it "uses default strategy option as Factory.default_strategy" do
121
121
  @factory.stubs(:default_strategy => :create, :run => "result")
122
122
  Factory.default_strategy(@name, :attr => 'value').should == 'result'
123
- @factory.should have_received(:run).with(FactoryGirl::Proxy::Create, :attr => 'value')
123
+ @factory.should have_received(:run).with(FactoryGirl::Strategy::Create, :attr => 'value')
124
124
  end
125
125
 
126
126
  it "uses the default strategy for the global Factory method" do
127
127
  @factory.stubs(:default_strategy => :create, :run => "result")
128
128
  Factory(@name, :attr => 'value').should == 'result'
129
- @factory.should have_received(:run).with(FactoryGirl::Proxy::Create, :attr => 'value')
129
+ @factory.should have_received(:run).with(FactoryGirl::Strategy::Create, :attr => 'value')
130
130
  end
131
131
 
132
132
  [:build, :create, :attributes_for, :stub].each do |method|
@@ -210,7 +210,7 @@ describe "traits with callbacks" do
210
210
  end
211
211
  end
212
212
 
213
- describe "traits added via proxy" do
213
+ describe "traits added via strategy" do
214
214
  before do
215
215
  define_model("User", :name => :string, :admin => :boolean)
216
216
 
@@ -17,8 +17,8 @@ describe "transient attributes" do
17
17
  name { "#{FactoryGirl.generate(:name)}#{" - Rockstar" if rockstar}" }
18
18
  email { "#{name.downcase}#{four}@example.com" }
19
19
 
20
- after_create do |user, proxy|
21
- user.name.upcase! if proxy.upcased
20
+ after_create do |user, evaluator|
21
+ user.name.upcase! if evaluator.upcased
22
22
  end
23
23
  end
24
24
  end
@@ -0,0 +1,31 @@
1
+ require "spec_helper"
2
+
3
+ describe FactoryGirl::AssociationRunner do
4
+ let(:factory) { stub("factory", :run => instance) }
5
+ let(:instance) { stub("instance") }
6
+
7
+ before do
8
+ FactoryGirl.stubs(:factory_by_name => factory)
9
+ end
10
+
11
+ it "passes all overrides to the factory" do
12
+ FactoryGirl::AssociationRunner.new(:user, FactoryGirl::Strategy::Build, :strategy => :build, :name => "John").run
13
+ factory.should have_received(:run).with(FactoryGirl::Strategy::Build, :strategy => :build, :name => "John")
14
+ end
15
+
16
+ it "runs a strategy inferred by name based on a factory name" do
17
+ FactoryGirl::AssociationRunner.new(:user, :build, :strategy => :build, :name => "John").run
18
+ factory.should have_received(:run).with(FactoryGirl::Strategy::Build, :strategy => :build, :name => "John")
19
+ end
20
+
21
+ it "allows overriding strategy" do
22
+ FactoryGirl::AssociationRunner.new(:user, :build, :strategy => :build, :name => "John").run(FactoryGirl::Strategy::Create)
23
+ factory.should have_received(:run).with(FactoryGirl::Strategy::Create, :strategy => :build, :name => "John")
24
+ end
25
+
26
+ it "raises if the strategy cannot be inferred" do
27
+ expect do
28
+ FactoryGirl::AssociationRunner.new(:user, :bogus_strategy, :strategy => :build, :name => "John").run
29
+ end.to raise_error("unrecognized method bogus_strategy")
30
+ end
31
+ end
@@ -5,7 +5,6 @@ describe FactoryGirl::Attribute::Association do
5
5
  let(:factory) { :user }
6
6
  let(:overrides) { { :first_name => "John" } }
7
7
  let(:association) { stub("association") }
8
- let(:proxy) { stub("proxy", :association => association) }
9
8
 
10
9
  subject { FactoryGirl::Attribute::Association.new(name, factory, overrides) }
11
10
  before { subject.stubs(:association => association) }
@@ -2,7 +2,6 @@ require 'spec_helper'
2
2
 
3
3
  describe FactoryGirl::Attribute do
4
4
  let(:name) { "user" }
5
- let(:proxy) { stub("proxy") }
6
5
  subject { FactoryGirl::Attribute.new(name, false) }
7
6
 
8
7
  its(:name) { should == name.to_sym }
@@ -2,7 +2,6 @@ require 'spec_helper'
2
2
 
3
3
  describe FactoryGirl::Declaration::Implicit do
4
4
  let(:name) { :author }
5
- let(:proxy) { stub("proxy") }
6
5
  let(:declaration) { FactoryGirl::Declaration::Implicit.new(name) }
7
6
  subject { declaration.to_attributes.first }
8
7
 
@@ -25,15 +25,15 @@ describe FactoryGirl::Factory do
25
25
  end
26
26
 
27
27
  it "passes a custom creation block" do
28
- proxy = stub("proxy", :result => nil, :add_observer => true)
29
- FactoryGirl::Proxy::Build.stubs(:new => proxy)
28
+ strategy = stub("strategy", :result => nil, :add_observer => true)
29
+ FactoryGirl::Strategy::Build.stubs(:new => strategy)
30
30
  block = lambda {}
31
31
  factory = FactoryGirl::Factory.new(:object)
32
32
  factory.to_create(&block)
33
33
 
34
- factory.run(FactoryGirl::Proxy::Build, {})
34
+ factory.run(FactoryGirl::Strategy::Build, {})
35
35
 
36
- proxy.should have_received(:result).with(instance_of(FactoryGirl::AttributeAssigner), block)
36
+ strategy.should have_received(:result).with(instance_of(FactoryGirl::AttributeAssigner), block)
37
37
  end
38
38
 
39
39
  it "returns associations" do
@@ -72,21 +72,21 @@ describe FactoryGirl::Factory do
72
72
  it "returns the overridden value in the generated attributes" do
73
73
  declaration = FactoryGirl::Declaration::Static.new(@name, 'The price is wrong, Bob!')
74
74
  @factory.declare_attribute(declaration)
75
- result = @factory.run(FactoryGirl::Proxy::AttributesFor, @hash)
75
+ result = @factory.run(FactoryGirl::Strategy::AttributesFor, @hash)
76
76
  result[@name].should == @value
77
77
  end
78
78
 
79
79
  it "does not call a lazy attribute block for an overridden attribute" do
80
80
  declaration = FactoryGirl::Declaration::Dynamic.new(@name, false, lambda { flunk })
81
81
  @factory.declare_attribute(declaration)
82
- @factory.run(FactoryGirl::Proxy::AttributesFor, @hash)
82
+ @factory.run(FactoryGirl::Strategy::AttributesFor, @hash)
83
83
  end
84
84
 
85
85
  it "overrides a symbol parameter with a string parameter" do
86
86
  declaration = FactoryGirl::Declaration::Static.new(@name, 'The price is wrong, Bob!')
87
87
  @factory.declare_attribute(declaration)
88
88
  @hash = { @name.to_s => @value }
89
- result = @factory.run(FactoryGirl::Proxy::AttributesFor, @hash)
89
+ result = @factory.run(FactoryGirl::Strategy::AttributesFor, @hash)
90
90
  result[@name].should == @value
91
91
  end
92
92
  end
@@ -95,7 +95,7 @@ describe FactoryGirl::Factory do
95
95
  before do
96
96
  @factory.declare_attribute(FactoryGirl::Declaration::Static.new(:test, 'original'))
97
97
  Factory.alias(/(.*)_alias/, '\1')
98
- @result = @factory.run(FactoryGirl::Proxy::AttributesFor,
98
+ @result = @factory.run(FactoryGirl::Strategy::AttributesFor,
99
99
  :test_alias => 'new')
100
100
  end
101
101
 
@@ -279,7 +279,7 @@ describe FactoryGirl::Factory, "running a factory" do
279
279
  subject { FactoryGirl::Factory.new(:user) }
280
280
  let(:attribute) { FactoryGirl::Attribute::Static.new(:name, "value", false) }
281
281
  let(:declaration) { FactoryGirl::Declaration::Static.new(:name, "value", false) }
282
- let(:proxy) { stub("proxy", :result => "result", :add_observer => true) }
282
+ let(:strategy) { stub("strategy", :result => "result", :add_observer => true) }
283
283
  let(:attributes) { [attribute] }
284
284
  let(:attribute_list) { stub('attribute-list', :declarations => [declaration], :to_a => attributes) }
285
285
 
@@ -287,23 +287,23 @@ describe FactoryGirl::Factory, "running a factory" do
287
287
  define_model("User", :name => :string)
288
288
  FactoryGirl::Declaration::Static.stubs(:new => declaration)
289
289
  declaration.stubs(:to_attributes => attributes)
290
- FactoryGirl::Proxy::Build.stubs(:new => proxy)
290
+ FactoryGirl::Strategy::Build.stubs(:new => strategy)
291
291
  subject.declare_attribute(declaration)
292
292
  end
293
293
 
294
- it "creates the right proxy using the build class when running" do
295
- subject.run(FactoryGirl::Proxy::Build, {})
296
- FactoryGirl::Proxy::Build.should have_received(:new).once
294
+ it "creates the right strategy using the build class when running" do
295
+ subject.run(FactoryGirl::Strategy::Build, {})
296
+ FactoryGirl::Strategy::Build.should have_received(:new).once
297
297
  end
298
298
 
299
- it "returns the result from the proxy when running" do
300
- subject.run(FactoryGirl::Proxy::Build, {}).should == "result"
299
+ it "returns the result from the strategy when running" do
300
+ subject.run(FactoryGirl::Strategy::Build, {}).should == "result"
301
301
  end
302
302
 
303
303
  it "calls the block and returns the result" do
304
304
  block_run = nil
305
305
  block = lambda {|result| block_run = "changed" }
306
- subject.run(FactoryGirl::Proxy::Build, { }, &block)
306
+ subject.run(FactoryGirl::Strategy::Build, { }, &block)
307
307
  block_run.should == "changed"
308
308
  end
309
309
  end
@@ -1,10 +1,10 @@
1
1
  require 'spec_helper'
2
2
 
3
- describe FactoryGirl::Proxy::AttributesFor do
3
+ describe FactoryGirl::Strategy::AttributesFor do
4
4
  let(:result) { { :name => "John Doe", :gender => "Male", :admin => false } }
5
5
  let(:attribute_assigner) { stub("attribute assigner", :hash => result) }
6
6
 
7
- it_should_behave_like "proxy without association support"
7
+ it_should_behave_like "strategy without association support"
8
8
 
9
9
  it "returns the hash from the attribute assigner" do
10
10
  subject.result(attribute_assigner, lambda {|item| item }).should == result