factory_girl 2.3.1 → 2.3.2

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 (36) hide show
  1. data/Changelog +9 -0
  2. data/Gemfile.lock +1 -1
  3. data/gemfiles/2.1.gemfile.lock +1 -1
  4. data/gemfiles/2.3.gemfile.lock +1 -1
  5. data/gemfiles/3.0.gemfile.lock +1 -1
  6. data/gemfiles/3.1.gemfile.lock +1 -1
  7. data/lib/factory_girl/attribute.rb +10 -24
  8. data/lib/factory_girl/attribute/association.rb +4 -2
  9. data/lib/factory_girl/attribute/dynamic.rb +7 -6
  10. data/lib/factory_girl/attribute/sequence.rb +3 -3
  11. data/lib/factory_girl/attribute/static.rb +3 -16
  12. data/lib/factory_girl/attribute_list.rb +3 -27
  13. data/lib/factory_girl/definition.rb +1 -1
  14. data/lib/factory_girl/factory.rb +1 -1
  15. data/lib/factory_girl/proxy.rb +80 -21
  16. data/lib/factory_girl/proxy/attributes_for.rb +2 -12
  17. data/lib/factory_girl/proxy/build.rb +2 -20
  18. data/lib/factory_girl/proxy/create.rb +2 -3
  19. data/lib/factory_girl/proxy/stub.rb +3 -16
  20. data/lib/factory_girl/version.rb +1 -1
  21. data/spec/acceptance/attributes_for_spec.rb +17 -0
  22. data/spec/acceptance/traits_spec.rb +23 -0
  23. data/spec/factory_girl/attribute/association_spec.rb +14 -13
  24. data/spec/factory_girl/attribute/dynamic_spec.rb +6 -9
  25. data/spec/factory_girl/attribute/sequence_spec.rb +1 -3
  26. data/spec/factory_girl/attribute/static_spec.rb +2 -4
  27. data/spec/factory_girl/attribute_list_spec.rb +2 -14
  28. data/spec/factory_girl/attribute_spec.rb +0 -15
  29. data/spec/factory_girl/declaration/implicit_spec.rb +10 -29
  30. data/spec/factory_girl/definition_spec.rb +7 -1
  31. data/spec/factory_girl/factory_spec.rb +1 -1
  32. data/spec/factory_girl/proxy/attributes_for_spec.rb +10 -5
  33. data/spec/factory_girl/proxy/create_spec.rb +1 -7
  34. data/spec/factory_girl/proxy_spec.rb +2 -5
  35. data/spec/support/shared_examples/proxy.rb +13 -12
  36. metadata +174 -115
@@ -4,11 +4,10 @@ module FactoryGirl
4
4
  def result(to_create)
5
5
  super
6
6
 
7
- to_create ||= lambda {|instance| instance.save! }
8
- to_create[@instance]
7
+ to_create[result_instance]
9
8
 
10
9
  run_callbacks(:after_create)
11
- @instance
10
+ result_instance
12
11
  end
13
12
  end
14
13
  end
@@ -5,9 +5,8 @@ module FactoryGirl
5
5
 
6
6
  def initialize(klass, callbacks = [])
7
7
  super
8
- @instance = klass.new
9
- @instance.id = next_id
10
- @instance.instance_eval do
8
+ result_instance.id = next_id
9
+ result_instance.instance_eval do
11
10
  def persisted?
12
11
  !new_record?
13
12
  end
@@ -42,18 +41,6 @@ module FactoryGirl
42
41
  end
43
42
  end
44
43
 
45
- def get(attribute)
46
- if @ignored_attributes.has_key?(attribute)
47
- @ignored_attributes[attribute]
48
- else
49
- @instance.send(attribute)
50
- end
51
- end
52
-
53
- def set(attribute, value)
54
- @instance.send(:"#{attribute.name}=", value)
55
- end
56
-
57
44
  def association(factory_name, overrides = {})
58
45
  factory = FactoryGirl.factory_by_name(factory_name)
59
46
  factory.run(Proxy::Stub, overrides.except(:method))
@@ -61,7 +48,7 @@ module FactoryGirl
61
48
 
62
49
  def result(to_create)
63
50
  run_callbacks(:after_stub)
64
- @instance
51
+ result_instance
65
52
  end
66
53
 
67
54
  private
@@ -1,4 +1,4 @@
1
1
  module FactoryGirl
2
- VERSION = "2.3.1"
2
+ VERSION = "2.3.2"
3
3
  end
4
4
 
@@ -61,3 +61,20 @@ describe "calling `attributes_for` with a block" do
61
61
  end
62
62
  end
63
63
  end
64
+
65
+ describe "`attributes_for` for a class whose constructor has required params" do
66
+ before do
67
+ define_model("User", :name => :string) do
68
+ def initialize(arg1, arg2); end
69
+ end
70
+
71
+ FactoryGirl.define do
72
+ factory :user do
73
+ name "John Doe"
74
+ end
75
+ end
76
+ end
77
+
78
+ subject { FactoryGirl.attributes_for(:user) }
79
+ its([:name]) { should == "John Doe" }
80
+ end
@@ -263,3 +263,26 @@ describe "traits added via proxy" do
263
263
  its(:name) { should == "Jack" }
264
264
  end
265
265
  end
266
+
267
+ describe "traits and dynamic attributes that are applied simultaneously" do
268
+ before do
269
+ define_model("User", :name => :string, :email => :string, :combined => :string)
270
+
271
+ FactoryGirl.define do
272
+ trait :email do
273
+ email { "#{name}@example.com" }
274
+ end
275
+
276
+ factory :user do
277
+ name "John"
278
+ email
279
+ combined { "#{name} <#{email}>" }
280
+ end
281
+ end
282
+ end
283
+
284
+ subject { FactoryGirl.build(:user) }
285
+ its(:name) { should == "John" }
286
+ its(:email) { should == "John@example.com" }
287
+ its(:combined) { should == "John <John@example.com>" }
288
+ end
@@ -1,22 +1,23 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe FactoryGirl::Attribute::Association do
4
- let(:name) { :author }
5
- let(:factory) { :user }
6
- let(:overrides) { { :first_name => "John" } }
7
- let(:proxy) { stub("proxy") }
4
+ let(:name) { :author }
5
+ let(:factory) { :user }
6
+ let(:overrides) { { :first_name => "John" } }
7
+ let(:association) { stub("association") }
8
+ let(:proxy) { stub("proxy", :association => association) }
8
9
 
9
- subject { FactoryGirl::Attribute::Association.new(name, factory, overrides) }
10
+ subject { FactoryGirl::Attribute::Association.new(name, factory, overrides) }
10
11
 
11
- it { should be_association }
12
- its(:name) { should == name }
13
- its(:factory) { should == factory }
12
+ it { should be_association }
13
+ its(:name) { should == name }
14
14
 
15
- it "tells the proxy to set the association when being added" do
16
- association = stub("association")
17
- proxy.stubs(:set => nil, :association => association)
18
- subject.add_to(proxy)
19
- proxy.should have_received(:set).with(subject, association)
15
+ it "builds the association when calling the proc" do
16
+ subject.to_proc(proxy).call.should == association
17
+ end
18
+
19
+ it "builds the association when calling the proc" do
20
+ subject.to_proc(proxy).call
20
21
  proxy.should have_received(:association).with(factory, overrides)
21
22
  end
22
23
  end
@@ -12,18 +12,16 @@ describe FactoryGirl::Attribute::Dynamic do
12
12
  context "with a block returning a static value" do
13
13
  let(:block) { lambda { "value" } }
14
14
 
15
- it "calls the block to set a value" do
16
- subject.add_to(proxy)
17
- proxy.should have_received(:set).with(subject, "value")
15
+ it "returns the value when executing the proc" do
16
+ subject.to_proc(proxy).call.should == "value"
18
17
  end
19
18
  end
20
19
 
21
20
  context "with a block returning its block-level variable" do
22
21
  let(:block) { lambda {|thing| thing } }
23
22
 
24
- it "yields the proxy to the block" do
25
- subject.add_to(proxy)
26
- proxy.should have_received(:set).with(subject, proxy)
23
+ it "returns the proxy when executing the proc" do
24
+ subject.to_proc(proxy).call.should == proxy
27
25
  end
28
26
  end
29
27
 
@@ -36,8 +34,7 @@ describe FactoryGirl::Attribute::Dynamic do
36
34
  end
37
35
 
38
36
  it "evaluates the attribute from the proxy" do
39
- subject.add_to(proxy)
40
- proxy.should have_received(:set).with(subject, result)
37
+ subject.to_proc(proxy).call.should == result
41
38
  end
42
39
  end
43
40
 
@@ -45,7 +42,7 @@ describe FactoryGirl::Attribute::Dynamic do
45
42
  let(:block) { lambda { Factory.sequence(:email) } }
46
43
 
47
44
  it "raises a sequence abuse error" do
48
- expect { subject.add_to(proxy) }.to raise_error(FactoryGirl::SequenceAbuseError)
45
+ expect { subject.to_proc(proxy).call }.to raise_error(FactoryGirl::SequenceAbuseError)
49
46
  end
50
47
  end
51
48
  end
@@ -12,8 +12,6 @@ describe FactoryGirl::Attribute::Sequence do
12
12
  its(:name) { should == name }
13
13
 
14
14
  it "assigns the next value in the sequence" do
15
- proxy.stubs(:set)
16
- subject.add_to(proxy)
17
- proxy.should have_received(:set).with(subject, "Name 5")
15
+ subject.to_proc(proxy).call.should == "Name 5"
18
16
  end
19
17
  end
@@ -9,10 +9,8 @@ describe FactoryGirl::Attribute::Static do
9
9
 
10
10
  its(:name) { should == name }
11
11
 
12
- it "sets its static value on a proxy" do
13
- proxy.stubs(:set)
14
- subject.add_to(proxy)
15
- proxy.should have_received(:set).with(subject, value)
12
+ it "returns the value when executing the proc" do
13
+ subject.to_proc(proxy).call.should == value
16
14
  end
17
15
  end
18
16
 
@@ -51,23 +51,11 @@ describe FactoryGirl::AttributeList, "#apply_attributes" do
51
51
  end
52
52
  end
53
53
 
54
- it "prepends applied attributes" do
55
- subject.define_attribute(full_name_attribute)
56
- subject.apply_attributes(list(city_attribute))
57
- subject.to_a.should == [city_attribute, full_name_attribute]
58
- end
59
-
60
- it "moves non-static attributes to the end of the list" do
61
- subject.define_attribute(full_name_attribute)
62
- subject.apply_attributes(list(city_attribute, email_attribute))
63
- subject.to_a.should == [city_attribute, full_name_attribute, email_attribute]
64
- end
65
-
66
- it "maintains order of non-static attributes" do
54
+ it "adds attributes in the order defined regardless of attribute type" do
67
55
  subject.define_attribute(full_name_attribute)
68
56
  subject.define_attribute(login_attribute)
69
57
  subject.apply_attributes(list(city_attribute, email_attribute))
70
- subject.to_a.should == [city_attribute, full_name_attribute, email_attribute, login_attribute]
58
+ subject.to_a.should == [full_name_attribute, login_attribute, city_attribute, email_attribute]
71
59
  end
72
60
 
73
61
  it "doesn't overwrite attributes that are already defined" do
@@ -8,25 +8,10 @@ describe FactoryGirl::Attribute do
8
8
  its(:name) { should == name.to_sym }
9
9
  it { should_not be_association }
10
10
 
11
- it "doesn't set any attributes on a proxy when added" do
12
- proxy.stubs(:set)
13
- subject.add_to(proxy)
14
- proxy.should have_received(:set).never
15
- end
16
-
17
11
  it "raises an error when defining an attribute writer" do
18
12
  error_message = %{factory_girl uses 'f.test value' syntax rather than 'f.test = value'}
19
13
  expect {
20
14
  FactoryGirl::Attribute.new('test=', false)
21
15
  }.to raise_error(FactoryGirl::AttributeDefinitionError, error_message)
22
16
  end
23
-
24
- it "returns nil when compared to a non-attribute" do
25
- (subject <=> "foo").should be_nil
26
- end
27
-
28
- it "uses priority to perform comparisons" do
29
- second_attribute = FactoryGirl::Attribute.new('name', false)
30
- (subject <=> second_attribute).should be_zero
31
- end
32
17
  end
@@ -1,45 +1,26 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe FactoryGirl::Declaration::Implicit do
4
- let(:name) { :author }
5
- let(:proxy) { stub("proxy") }
6
- subject { FactoryGirl::Declaration::Implicit.new(name) }
7
- let(:attribute) { subject.to_attributes.first }
4
+ let(:name) { :author }
5
+ let(:proxy) { stub("proxy") }
6
+ let(:declaration) { FactoryGirl::Declaration::Implicit.new(name) }
7
+ subject { declaration.to_attributes.first }
8
8
 
9
9
  context "with a known factory" do
10
10
  before do
11
11
  FactoryGirl.factories.stubs(:registered? => true)
12
12
  end
13
13
 
14
- it "generates an association" do
15
- attribute.should be_association
16
- end
17
-
18
- it "generates an association with the correct factory" do
19
- attribute.factory.should == name
20
- end
21
-
22
- it "associates the factory" do
23
- association = stub("association")
24
- proxy.stubs(:set => nil, :association => association)
25
- attribute.add_to(proxy)
26
- proxy.should have_received(:set).with(attribute, association)
27
- proxy.should have_received(:association).with(name, {})
28
- end
14
+ it { should be_association }
15
+ its(:factory) { should == name }
29
16
  end
30
17
 
31
18
  context "with a known sequence" do
32
- let(:sequence) { FactoryGirl::Sequence.new(name, 1) { "magic" } }
33
- before { FactoryGirl.register_sequence(sequence) }
34
-
35
- it "doesn't generate an association" do
36
- attribute.should_not be_association
19
+ before do
20
+ FactoryGirl.sequences.stubs(:registered? => true)
37
21
  end
38
22
 
39
- it "generates the sequence" do
40
- proxy.stubs(:set)
41
- attribute.add_to(proxy)
42
- proxy.should have_received(:set).with(attribute, "magic")
43
- end
23
+ it { should_not be_association }
24
+ it { should be_a(FactoryGirl::Attribute::Sequence) }
44
25
  end
45
26
  end
@@ -49,7 +49,13 @@ describe FactoryGirl::Definition, "adding callbacks" do
49
49
  end
50
50
 
51
51
  describe FactoryGirl::Definition, "#to_create" do
52
- its(:to_create) { should be_nil }
52
+ its(:to_create) { should be_a(Proc) }
53
+
54
+ it "calls save! on the object when run" do
55
+ instance = stub("model instance", :save! => true)
56
+ subject.to_create[instance]
57
+ instance.should have_received(:save!).once
58
+ end
53
59
 
54
60
  it "returns the assigned value when given a block" do
55
61
  block = proc { nil }
@@ -271,7 +271,7 @@ describe FactoryGirl::Factory, "running a factory" do
271
271
 
272
272
  it "returns the result from the proxy when running" do
273
273
  subject.run(FactoryGirl::Proxy::Build, {}).should == "result"
274
- proxy.should have_received(:result).with(nil)
274
+ proxy.should have_received(:result).with(subject.definition.to_create)
275
275
  end
276
276
 
277
277
  it "sets overrides once on the factory" do
@@ -1,7 +1,7 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe FactoryGirl::Proxy::AttributesFor do
4
- let(:proxy_class) { stub("class") }
4
+ let(:proxy_class) { stub("proxy_class") }
5
5
 
6
6
  subject { FactoryGirl::Proxy::AttributesFor.new(proxy_class) }
7
7
 
@@ -11,18 +11,23 @@ describe FactoryGirl::Proxy::AttributesFor do
11
11
  subject.result(nil).should be_kind_of(Hash)
12
12
  end
13
13
 
14
+ it "does not instantiate the proxy class" do
15
+ proxy_class.stubs(:new)
16
+ subject.result(nil)
17
+ proxy_class.should have_received(:new).never
18
+ end
19
+
14
20
  describe "after setting an attribute" do
15
21
  let(:attribute) { stub("attribute", :name => :attribute) }
16
- let(:value) { "value" }
17
22
 
18
- before { subject.set(attribute, value) }
23
+ before { subject.set(attribute, lambda { "value" }) }
19
24
 
20
25
  it "sets that value in the resulting hash" do
21
- subject.result(nil)[:attribute].should == value
26
+ subject.result(nil)[:attribute].should == "value"
22
27
  end
23
28
 
24
29
  it "returns that value when asked for that attribute" do
25
- subject.get(:attribute).should == value
30
+ subject.get(:attribute).should == "value"
26
31
  end
27
32
  end
28
33
  end
@@ -11,11 +11,6 @@ describe FactoryGirl::Proxy::Create do
11
11
  it_should_behave_like "proxy with callbacks", :after_build
12
12
  it_should_behave_like "proxy with callbacks", :after_create
13
13
 
14
- it "saves the instance before returning the result" do
15
- subject.result(nil)
16
- instance.should have_received(:save!)
17
- end
18
-
19
14
  it "runs a custom create block" do
20
15
  block_run = false
21
16
  block = lambda {|instance| block_run = true }
@@ -23,7 +18,6 @@ describe FactoryGirl::Proxy::Create do
23
18
  instance.should have_received(:save!).never
24
19
  block_run.should be_true
25
20
  end
26
-
27
21
  end
28
22
 
29
23
  describe FactoryGirl::Proxy::Create, "when running callbacks" do
@@ -38,7 +32,7 @@ describe FactoryGirl::Proxy::Create, "when running callbacks" do
38
32
  subject { FactoryGirl::Proxy::Create.new(proxy_class, [after_create_one, after_create_two, after_build_one]) }
39
33
 
40
34
  it "runs callbacks in the correct order" do
41
- subject.result(nil)
35
+ subject.result(lambda {|instance| instance })
42
36
  callback_result.should == [:after_build_one, :after_create_one, :after_create_two]
43
37
  end
44
38
  end
@@ -6,11 +6,8 @@ describe FactoryGirl::Proxy do
6
6
  it_should_behave_like "proxy without association support"
7
7
 
8
8
  it "doesn't raise when assigning a value to an attribute" do
9
- expect { subject.set(:name, "a name") }.to_not raise_error
10
- end
11
-
12
- it "returns nil for an attribute without a value" do
13
- subject.get(:name).should be_nil
9
+ name_attribute = FactoryGirl::Attribute::Static.new(:name, "great", false)
10
+ expect { subject.set(name_attribute, lambda { "a name" }) }.to_not raise_error
14
11
  end
15
12
 
16
13
  it "calls get for a missing method" do
@@ -3,13 +3,12 @@ shared_examples_for "proxy without association support" do
3
3
 
4
4
  it "does not call FactoryGirl.create when building an association" do
5
5
  FactoryGirl.stubs(:create)
6
- subject.set(attribute, "awesome")
6
+ subject.set(attribute, lambda { "awesome" })
7
7
  FactoryGirl.should have_received(:create).never
8
8
  end
9
9
 
10
10
  it "returns nil when accessing an association" do
11
- subject.set(attribute, "awesome")
12
- subject.get(:user).should be_nil
11
+ subject.association(:user, {}).should be_nil
13
12
  end
14
13
 
15
14
  it "does not attempt to look up the factory when accessing the association" do
@@ -70,7 +69,8 @@ shared_examples_for "proxy with standard getters and setters" do |attribute, val
70
69
 
71
70
  describe "when setting an attribute" do
72
71
  before do
73
- subject.set(attribute_instance, value)
72
+ subject.set(attribute_instance, lambda { value })
73
+ subject.result(lambda {|instance| instance })
74
74
  end
75
75
 
76
76
  its(attribute) { should == value }
@@ -79,19 +79,20 @@ shared_examples_for "proxy with standard getters and setters" do |attribute, val
79
79
 
80
80
  describe "when setting an ignored attribute" do
81
81
  before do
82
- subject.set_ignored(attribute_instance, value)
82
+ subject.set_ignored(attribute_instance, lambda { value })
83
+ subject.result(lambda {|instance| instance })
83
84
  end
84
85
 
85
86
  it { instance.should have_received(:"#{attribute}=").with(value).never }
86
87
  end
87
88
 
88
89
  describe "when getting an attribute" do
89
- it { subject.get(attribute).should == value }
90
-
91
- it "retrieves the value from the instance" do
92
- subject.get(attribute)
93
- instance.should have_received(:"#{attribute}")
90
+ before do
91
+ subject.set(attribute_instance, lambda { value })
92
+ subject.result(lambda {|instance| instance })
94
93
  end
94
+
95
+ it { subject.get(attribute).should == value }
95
96
  end
96
97
  end
97
98
 
@@ -102,11 +103,11 @@ shared_examples_for "proxy with callbacks" do |callback_name|
102
103
  subject { described_class.new(proxy_class, [callback]) }
103
104
 
104
105
  it "runs the #{callback_name} callback" do
105
- subject.result(nil)
106
+ subject.result(lambda {|instance| instance })
106
107
  callback_instance.should have_received(:foo).once
107
108
  end
108
109
 
109
110
  it "returns the proxy instance" do
110
- subject.result(nil).should == instance
111
+ subject.result(lambda {|instance| instance }).should == instance
111
112
  end
112
113
  end