factory_girl 1.3.3 → 2.0.0.beta1

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 (53) hide show
  1. data/README.rdoc +68 -60
  2. data/features/support/test.db +0 -0
  3. data/lib/factory_girl.rb +6 -12
  4. data/lib/factory_girl/aliases.rb +2 -31
  5. data/lib/factory_girl/attribute.rb +1 -1
  6. data/lib/factory_girl/attribute/association.rb +1 -1
  7. data/lib/factory_girl/attribute/callback.rb +1 -1
  8. data/lib/factory_girl/attribute/dynamic.rb +3 -3
  9. data/lib/factory_girl/attribute/static.rb +1 -1
  10. data/lib/factory_girl/definition_proxy.rb +180 -0
  11. data/lib/factory_girl/deprecated.rb +18 -0
  12. data/lib/factory_girl/factory.rb +120 -355
  13. data/lib/factory_girl/find_definitions.rb +25 -0
  14. data/lib/factory_girl/proxy.rb +4 -6
  15. data/lib/factory_girl/proxy/attributes_for.rb +1 -1
  16. data/lib/factory_girl/proxy/build.rb +7 -5
  17. data/lib/factory_girl/proxy/create.rb +1 -1
  18. data/lib/factory_girl/proxy/stub.rb +11 -5
  19. data/lib/factory_girl/rails2.rb +1 -1
  20. data/lib/factory_girl/sequence.rb +5 -40
  21. data/lib/factory_girl/step_definitions.rb +7 -7
  22. data/lib/factory_girl/syntax.rb +7 -7
  23. data/lib/factory_girl/syntax/blueprint.rb +5 -4
  24. data/lib/factory_girl/syntax/default.rb +31 -0
  25. data/lib/factory_girl/syntax/generate.rb +13 -8
  26. data/lib/factory_girl/syntax/make.rb +8 -6
  27. data/lib/factory_girl/syntax/sham.rb +11 -8
  28. data/lib/factory_girl/syntax/vintage.rb +196 -0
  29. data/lib/factory_girl/version.rb +4 -0
  30. data/spec/acceptance/acceptance_spec.rb +43 -60
  31. data/spec/acceptance/syntax/blueprint_spec.rb +1 -5
  32. data/spec/acceptance/syntax/generate_spec.rb +1 -4
  33. data/spec/acceptance/syntax/make_spec.rb +1 -4
  34. data/spec/acceptance/syntax/sham_spec.rb +9 -7
  35. data/spec/acceptance/syntax/vintage_spec.rb +184 -0
  36. data/spec/factory_girl/aliases_spec.rb +5 -5
  37. data/spec/factory_girl/attribute/association_spec.rb +3 -3
  38. data/spec/factory_girl/attribute/callback_spec.rb +3 -3
  39. data/spec/factory_girl/attribute/dynamic_spec.rb +20 -9
  40. data/spec/factory_girl/attribute/static_spec.rb +5 -5
  41. data/spec/factory_girl/attribute_spec.rb +5 -5
  42. data/spec/factory_girl/definition_proxy_spec.rb +138 -0
  43. data/spec/factory_girl/deprecated_spec.rb +66 -0
  44. data/spec/factory_girl/factory_spec.rb +283 -566
  45. data/spec/factory_girl/find_definitions_spec.rb +89 -0
  46. data/spec/factory_girl/proxy/attributes_for_spec.rb +2 -2
  47. data/spec/factory_girl/proxy/build_spec.rb +17 -12
  48. data/spec/factory_girl/proxy/create_spec.rb +17 -12
  49. data/spec/factory_girl/proxy/stub_spec.rb +6 -5
  50. data/spec/factory_girl/proxy_spec.rb +2 -2
  51. data/spec/factory_girl/sequence_spec.rb +15 -38
  52. data/spec/spec_helper.rb +4 -0
  53. metadata +28 -11
@@ -1,24 +1,22 @@
1
1
  require 'spec_helper'
2
+ require 'acceptance/acceptance_helper'
2
3
 
3
4
  require 'factory_girl/syntax/sham'
4
5
 
5
6
  describe "a factory using sham syntax" do
6
7
  before do
7
- Sham.name { "Name" }
8
- Sham.email { "somebody#{rand(5)}@example.com" }
8
+ Sham.name { "Name" }
9
+ Sham.email { "somebody#{rand(5)}@example.com" }
10
+ Sham.user("FOO") { |c| "User-#{c}" }
9
11
 
10
12
  Factory.define :user do |factory|
11
13
  factory.first_name { Sham.name }
12
14
  factory.last_name { Sham.name }
13
15
  factory.email { Sham.email }
16
+ factory.username { Sham.user }
14
17
  end
15
18
  end
16
19
 
17
- after do
18
- Factory.factories.clear
19
- Factory.sequences.clear
20
- end
21
-
22
20
  describe "after making an instance" do
23
21
  before do
24
22
  @instance = Factory(:user, :last_name => 'Rye')
@@ -28,6 +26,10 @@ describe "a factory using sham syntax" do
28
26
  @instance.first_name.should == 'Name'
29
27
  end
30
28
 
29
+ it "should support shams with starting values" do
30
+ @instance.username.should == 'User-FOO'
31
+ end
32
+
31
33
  it "should use the sham for the email" do
32
34
  @instance.email.should =~ /somebody\d@example.com/
33
35
  end
@@ -0,0 +1,184 @@
1
+ require 'spec_helper'
2
+ require 'acceptance/acceptance_helper'
3
+
4
+ describe "default syntax" do
5
+ before do
6
+ Factory.sequence(:email) { |n| "somebody#{n}@example.com" }
7
+ Factory.define :user do |factory|
8
+ factory.first_name { 'Bill' }
9
+ factory.last_name { 'Nye' }
10
+ factory.email { Factory.next(:email) }
11
+ end
12
+ end
13
+
14
+ describe "after making an instance" do
15
+ before do
16
+ @instance = Factory(:user, :last_name => 'Rye')
17
+ end
18
+
19
+ it "should use attributes from the definition" do
20
+ @instance.first_name.should == 'Bill'
21
+ end
22
+
23
+ it "should evaluate attribute blocks for each instance" do
24
+ @instance.email.should =~ /somebody\d+@example.com/
25
+ Factory(:user).email.should_not == @instance.email
26
+ end
27
+ end
28
+
29
+ it "should raise an ArgumentError when trying to use a non-existent strategy" do
30
+ lambda {
31
+ Factory.define(:object, :default_strategy => :nonexistent) {}
32
+ }.should raise_error(ArgumentError)
33
+ end
34
+ end
35
+
36
+ describe Factory, "given a parent factory" do
37
+ before do
38
+ @parent = FactoryGirl::Factory.new(:object)
39
+ @parent.define_attribute(FactoryGirl::Attribute::Static.new(:name, 'value'))
40
+ FactoryGirl.register_factory(@parent)
41
+ end
42
+
43
+ it "should raise an ArgumentError when trying to use a non-existent factory as parent" do
44
+ lambda {
45
+ Factory.define(:child, :parent => :nonexsitent) {}
46
+ }.should raise_error(ArgumentError)
47
+ end
48
+ end
49
+
50
+ describe "defining a factory" do
51
+ before do
52
+ @name = :user
53
+ @factory = "factory"
54
+ @proxy = "proxy"
55
+ stub(@factory).name { @name }
56
+ @options = { :class => 'magic' }
57
+ stub(FactoryGirl::Factory).new { @factory }
58
+ stub(FactoryGirl::DefinitionProxy).new { @proxy }
59
+ end
60
+
61
+ it "should create a new factory using the specified name and options" do
62
+ mock(FactoryGirl::Factory).new(@name, @options) { @factory }
63
+ Factory.define(@name, @options) {|f| }
64
+ end
65
+
66
+ it "should pass the factory do the block" do
67
+ yielded = nil
68
+ Factory.define(@name) do |y|
69
+ yielded = y
70
+ end
71
+ yielded.should == @proxy
72
+ end
73
+
74
+ it "should add the factory to the list of factories" do
75
+ Factory.define(@name) {|f| }
76
+ @factory.should == FactoryGirl.factories[@name]
77
+ end
78
+
79
+ it "should allow a factory to be found by name" do
80
+ Factory.define(@name) {|f| }
81
+ FactoryGirl.factory_by_name(@name).should == @factory
82
+ end
83
+ end
84
+
85
+ describe "after defining a factory" do
86
+ before do
87
+ @name = :user
88
+ @factory = "factory"
89
+
90
+ FactoryGirl.factories[@name] = @factory
91
+ end
92
+
93
+ it "should use Proxy::AttributesFor for Factory.attributes_for" do
94
+ mock(@factory).run(FactoryGirl::Proxy::AttributesFor, :attr => 'value') { 'result' }
95
+ Factory.attributes_for(@name, :attr => 'value').should == 'result'
96
+ end
97
+
98
+ it "should use Proxy::Build for Factory.build" do
99
+ mock(@factory).run(FactoryGirl::Proxy::Build, :attr => 'value') { 'result' }
100
+ Factory.build(@name, :attr => 'value').should == 'result'
101
+ end
102
+
103
+ it "should use Proxy::Create for Factory.create" do
104
+ mock(@factory).run(FactoryGirl::Proxy::Create, :attr => 'value') { 'result' }
105
+ Factory.create(@name, :attr => 'value').should == 'result'
106
+ end
107
+
108
+ it "should use Proxy::Stub for Factory.stub" do
109
+ mock(@factory).run(FactoryGirl::Proxy::Stub, :attr => 'value') { 'result' }
110
+ Factory.stub(@name, :attr => 'value').should == 'result'
111
+ end
112
+
113
+ it "should use default strategy option as Factory.default_strategy" do
114
+ stub(@factory).default_strategy { :create }
115
+ mock(@factory).run(FactoryGirl::Proxy::Create, :attr => 'value') { 'result' }
116
+ Factory.default_strategy(@name, :attr => 'value').should == 'result'
117
+ end
118
+
119
+ it "should use the default strategy for the global Factory method" do
120
+ stub(@factory).default_strategy { :create }
121
+ mock(@factory).run(FactoryGirl::Proxy::Create, :attr => 'value') { 'result' }
122
+ Factory(@name, :attr => 'value').should == 'result'
123
+ end
124
+
125
+ [:build, :create, :attributes_for, :stub].each do |method|
126
+ it "should raise an ArgumentError on #{method} with a nonexistant factory" do
127
+ lambda { Factory.send(method, :bogus) }.should raise_error(ArgumentError)
128
+ end
129
+
130
+ it "should recognize either 'name' or :name for Factory.#{method}" do
131
+ stub(@factory).run
132
+ lambda { Factory.send(method, @name.to_s) }.should_not raise_error
133
+ lambda { Factory.send(method, @name.to_sym) }.should_not raise_error
134
+ end
135
+ end
136
+ end
137
+
138
+ describe "defining a sequence" do
139
+ before do
140
+ @sequence = "sequence"
141
+ @name = :count
142
+ stub(FactoryGirl::Sequence).new { @sequence }
143
+ end
144
+
145
+ it "should create a new sequence" do
146
+ mock(FactoryGirl::Sequence).new(1) { @sequence }
147
+ Factory.sequence(@name)
148
+ end
149
+
150
+ it "should use the supplied block as the sequence generator" do
151
+ stub(FactoryGirl::Sequence).new.yields(1)
152
+ yielded = false
153
+ Factory.sequence(@name) {|n| yielded = true }
154
+ (yielded).should be
155
+ end
156
+
157
+ it "should use the supplied start_value as the sequence start_value" do
158
+ mock(FactoryGirl::Sequence).new("A") { @sequence }
159
+ Factory.sequence(@name, "A")
160
+ end
161
+ end
162
+
163
+ describe "after defining a sequence" do
164
+ before do
165
+ @sequence = "sequence"
166
+ @name = :test
167
+ @value = '1 2 5'
168
+
169
+ stub(@sequence).next { @value }
170
+ stub(FactoryGirl::Sequence).new { @sequence }
171
+
172
+ Factory.sequence(@name) {}
173
+ end
174
+
175
+ it "should call next on the sequence when sent next" do
176
+ mock(@sequence).next
177
+
178
+ Factory.next(@name)
179
+ end
180
+
181
+ it "should return the value from the sequence" do
182
+ Factory.next(@name).should == @value
183
+ end
184
+ end
@@ -3,19 +3,19 @@ require 'spec_helper'
3
3
  describe Factory, "aliases" do
4
4
 
5
5
  it "should include an attribute as an alias for itself by default" do
6
- Factory.aliases_for(:test).should include(:test)
6
+ FactoryGirl.aliases_for(:test).should include(:test)
7
7
  end
8
8
 
9
9
  it "should include the root of a foreign key as an alias by default" do
10
- Factory.aliases_for(:test_id).should include(:test)
10
+ FactoryGirl.aliases_for(:test_id).should include(:test)
11
11
  end
12
12
 
13
13
  it "should include an attribute's foreign key as an alias by default" do
14
- Factory.aliases_for(:test).should include(:test_id)
14
+ FactoryGirl.aliases_for(:test).should include(:test_id)
15
15
  end
16
16
 
17
17
  it "should NOT include an attribute as an alias when it starts with underscore" do
18
- Factory.aliases_for(:_id).should_not include(:id)
18
+ FactoryGirl.aliases_for(:_id).should_not include(:id)
19
19
  end
20
20
 
21
21
  describe "after adding an alias" do
@@ -25,7 +25,7 @@ describe Factory, "aliases" do
25
25
  end
26
26
 
27
27
  it "should return the alias in the aliases list" do
28
- Factory.aliases_for(:test_suffix).should include(:test)
28
+ FactoryGirl.aliases_for(:test_suffix).should include(:test)
29
29
  end
30
30
 
31
31
  end
@@ -1,11 +1,11 @@
1
1
  require 'spec_helper'
2
2
 
3
- describe Factory::Attribute::Association do
3
+ describe FactoryGirl::Attribute::Association do
4
4
  before do
5
5
  @name = :author
6
6
  @factory = :user
7
7
  @overrides = { :first_name => 'John' }
8
- @attr = Factory::Attribute::Association.new(@name, @factory, @overrides)
8
+ @attr = FactoryGirl::Attribute::Association.new(@name, @factory, @overrides)
9
9
  end
10
10
 
11
11
  it "should have a name" do
@@ -24,6 +24,6 @@ describe Factory::Attribute::Association do
24
24
  end
25
25
 
26
26
  it "should convert names to symbols" do
27
- Factory::Attribute::Association.new('name', :user, {}).name.should == :name
27
+ FactoryGirl::Attribute::Association.new('name', :user, {}).name.should == :name
28
28
  end
29
29
  end
@@ -1,10 +1,10 @@
1
1
  require 'spec_helper'
2
2
 
3
- describe Factory::Attribute::Callback do
3
+ describe FactoryGirl::Attribute::Callback do
4
4
  before do
5
5
  @name = :after_create
6
6
  @block = proc{ 'block' }
7
- @attr = Factory::Attribute::Callback.new(@name, @block)
7
+ @attr = FactoryGirl::Attribute::Callback.new(@name, @block)
8
8
  end
9
9
 
10
10
  it "should have a name" do
@@ -18,6 +18,6 @@ describe Factory::Attribute::Callback do
18
18
  end
19
19
 
20
20
  it "should convert names to symbols" do
21
- Factory::Attribute::Callback.new('name', nil).name.should == :name
21
+ FactoryGirl::Attribute::Callback.new('name', nil).name.should == :name
22
22
  end
23
23
  end
@@ -1,10 +1,10 @@
1
1
  require 'spec_helper'
2
2
 
3
- describe Factory::Attribute::Dynamic do
3
+ describe FactoryGirl::Attribute::Dynamic do
4
4
  before do
5
5
  @name = :first_name
6
6
  @block = lambda { 'value' }
7
- @attr = Factory::Attribute::Dynamic.new(@name, @block)
7
+ @attr = FactoryGirl::Attribute::Dynamic.new(@name, @block)
8
8
  end
9
9
 
10
10
  it "should have a name" do
@@ -20,30 +20,41 @@ describe Factory::Attribute::Dynamic do
20
20
 
21
21
  it "should yield the proxy to the block when adding its value to a proxy" do
22
22
  @block = lambda {|a| a }
23
- @attr = Factory::Attribute::Dynamic.new(:user, @block)
23
+ @attr = FactoryGirl::Attribute::Dynamic.new(:user, @block)
24
24
  @proxy = "proxy"
25
25
  stub(@proxy).set
26
26
  @attr.add_to(@proxy)
27
27
  @proxy.should have_received.set(:user, @proxy)
28
28
  end
29
29
 
30
+ it "evaluates the block with in the context of the proxy without an argument" do
31
+ result = 'other attribute value'
32
+ @block = lambda { other_attribute }
33
+ @attr = FactoryGirl::Attribute::Dynamic.new(:user, @block)
34
+ @proxy = "proxy"
35
+ stub(@proxy).set
36
+ stub(@proxy).other_attribute { result }
37
+ @attr.add_to(@proxy)
38
+ @proxy.should have_received.set(:user, result)
39
+ end
40
+
30
41
  it "should raise an error when defining an attribute writer" do
31
42
  lambda {
32
- Factory::Attribute::Dynamic.new('test=', nil)
33
- }.should raise_error(Factory::AttributeDefinitionError)
43
+ FactoryGirl::Attribute::Dynamic.new('test=', nil)
44
+ }.should raise_error(FactoryGirl::AttributeDefinitionError)
34
45
  end
35
46
 
36
47
  it "should raise an error when returning a sequence" do
37
- stub(Factory).sequence { Factory::Sequence.new }
48
+ stub(Factory).sequence { FactoryGirl::Sequence.new }
38
49
  block = lambda { Factory.sequence(:email) }
39
- attr = Factory::Attribute::Dynamic.new(:email, block)
50
+ attr = FactoryGirl::Attribute::Dynamic.new(:email, block)
40
51
  proxy = stub!.set.subject
41
52
  lambda {
42
53
  attr.add_to(proxy)
43
- }.should raise_error(Factory::SequenceAbuseError)
54
+ }.should raise_error(FactoryGirl::SequenceAbuseError)
44
55
  end
45
56
 
46
57
  it "should convert names to symbols" do
47
- Factory::Attribute::Dynamic.new('name', nil).name.should == :name
58
+ FactoryGirl::Attribute::Dynamic.new('name', nil).name.should == :name
48
59
  end
49
60
  end
@@ -1,10 +1,10 @@
1
1
  require 'spec_helper'
2
2
 
3
- describe Factory::Attribute::Static do
3
+ describe FactoryGirl::Attribute::Static do
4
4
  before do
5
5
  @name = :first_name
6
6
  @value = 'John'
7
- @attr = Factory::Attribute::Static.new(@name, @value)
7
+ @attr = FactoryGirl::Attribute::Static.new(@name, @value)
8
8
  end
9
9
 
10
10
  it "should have a name" do
@@ -19,11 +19,11 @@ describe Factory::Attribute::Static do
19
19
 
20
20
  it "should raise an error when defining an attribute writer" do
21
21
  lambda {
22
- Factory::Attribute::Static.new('test=', nil)
23
- }.should raise_error(Factory::AttributeDefinitionError)
22
+ FactoryGirl::Attribute::Static.new('test=', nil)
23
+ }.should raise_error(FactoryGirl::AttributeDefinitionError)
24
24
  end
25
25
 
26
26
  it "should convert names to symbols" do
27
- Factory::Attribute::Static.new('name', nil).name.should == :name
27
+ FactoryGirl::Attribute::Static.new('name', nil).name.should == :name
28
28
  end
29
29
  end
@@ -1,9 +1,9 @@
1
1
  require 'spec_helper'
2
2
 
3
- describe Factory::Attribute do
3
+ describe FactoryGirl::Attribute do
4
4
  before do
5
5
  @name = :user
6
- @attr = Factory::Attribute.new(@name)
6
+ @attr = FactoryGirl::Attribute.new(@name)
7
7
  end
8
8
 
9
9
  it "should have a name" do
@@ -20,11 +20,11 @@ describe Factory::Attribute do
20
20
  it "should raise an error when defining an attribute writer" do
21
21
  error_message = %{factory_girl uses 'f.test value' syntax rather than 'f.test = value'}
22
22
  lambda {
23
- Factory::Attribute.new('test=')
24
- }.should raise_error(Factory::AttributeDefinitionError, error_message)
23
+ FactoryGirl::Attribute.new('test=')
24
+ }.should raise_error(FactoryGirl::AttributeDefinitionError, error_message)
25
25
  end
26
26
 
27
27
  it "should convert names to symbols" do
28
- Factory::Attribute.new('name').name.should == :name
28
+ FactoryGirl::Attribute.new('name').name.should == :name
29
29
  end
30
30
  end
@@ -0,0 +1,138 @@
1
+ require 'spec_helper'
2
+
3
+ describe FactoryGirl::DefinitionProxy do
4
+ let(:factory) { FactoryGirl::Factory.new(:object) }
5
+ subject { FactoryGirl::DefinitionProxy.new(factory) }
6
+
7
+ it "should add a static attribute for type" do
8
+ subject.type 'value'
9
+ factory.attributes.last.should be_kind_of(FactoryGirl::Attribute::Static)
10
+ end
11
+
12
+ it "should add a static attribute for id" do
13
+ subject.id 'value'
14
+ factory.attributes.last.should be_kind_of(FactoryGirl::Attribute::Static)
15
+ end
16
+
17
+ it "should add a static attribute when an attribute is defined with a value" do
18
+ attribute = 'attribute'
19
+ stub(attribute).name { :name }
20
+ mock(FactoryGirl::Attribute::Static).new(:name, 'value') { attribute }
21
+ mock(factory).define_attribute(attribute)
22
+ subject.add_attribute(:name, 'value')
23
+ end
24
+
25
+ it "should add a dynamic attribute when an attribute is defined with a block" do
26
+ attribute = 'attribute'
27
+ stub(attribute).name { :name }
28
+ block = lambda {}
29
+ mock(FactoryGirl::Attribute::Dynamic).new(:name, block) { attribute }
30
+ mock(factory).define_attribute(attribute)
31
+ subject.add_attribute(:name, &block)
32
+ end
33
+
34
+ it "should raise for an attribute with a value and a block" do
35
+ lambda {
36
+ subject.add_attribute(:name, 'value') {}
37
+ }.should raise_error(FactoryGirl::AttributeDefinitionError)
38
+ end
39
+
40
+ describe "adding an attribute using a in-line sequence" do
41
+ it "should create the sequence" do
42
+ mock(FactoryGirl::Sequence).new(1)
43
+ subject.sequence(:name) {}
44
+ end
45
+
46
+ it "should create the sequence with a custom default value" do
47
+ mock(FactoryGirl::Sequence).new("A")
48
+ subject.sequence(:name, "A") {}
49
+ end
50
+
51
+ it "should add a dynamic attribute" do
52
+ attribute = 'attribute'
53
+ stub(attribute).name { :name }
54
+ mock(FactoryGirl::Attribute::Dynamic).new(:name, is_a(Proc)) { attribute }
55
+ subject.sequence(:name) {}
56
+ factory.attributes.should include(attribute)
57
+ end
58
+ end
59
+
60
+ it "should add a callback attribute when the after_build attribute is defined" do
61
+ mock(FactoryGirl::Attribute::Callback).new(:after_build, is_a(Proc)) { 'after_build callback' }
62
+ subject.after_build {}
63
+ factory.attributes.should include('after_build callback')
64
+ end
65
+
66
+ it "should add a callback attribute when the after_create attribute is defined" do
67
+ mock(FactoryGirl::Attribute::Callback).new(:after_create, is_a(Proc)) { 'after_create callback' }
68
+ subject.after_create {}
69
+ factory.attributes.should include('after_create callback')
70
+ end
71
+
72
+ it "should add a callback attribute when the after_stub attribute is defined" do
73
+ mock(FactoryGirl::Attribute::Callback).new(:after_stub, is_a(Proc)) { 'after_stub callback' }
74
+ subject.after_stub {}
75
+ factory.attributes.should include('after_stub callback')
76
+ end
77
+
78
+ it "should add an association without a factory name or overrides" do
79
+ name = :user
80
+ attr = 'attribute'
81
+ stub(attr).name { name }
82
+ mock(FactoryGirl::Attribute::Association).new(name, name, {}) { attr }
83
+ subject.association(name)
84
+ factory.attributes.should include(attr)
85
+ end
86
+
87
+ it "should add an association with overrides" do
88
+ name = :user
89
+ attr = 'attribute'
90
+ overrides = { :first_name => 'Ben' }
91
+ stub(attr).name { name }
92
+ mock(FactoryGirl::Attribute::Association).new(name, name, overrides) { attr }
93
+ subject.association(name, overrides)
94
+ factory.attributes.should include(attr)
95
+ end
96
+
97
+ it "should add an attribute using the method name when passed an undefined method" do
98
+ attribute = 'attribute'
99
+ stub(attribute).name { :name }
100
+ mock(FactoryGirl::Attribute::Static).new(:name, 'value') { attribute }
101
+ subject.send(:name, 'value')
102
+ factory.attributes.should include(attribute)
103
+ end
104
+
105
+ it "adds an attribute using when passed an undefined method and block" do
106
+ attribute = 'attribute'
107
+ stub(attribute).name { :name }
108
+ block = lambda {}
109
+ mock(FactoryGirl::Attribute::Dynamic).new(:name, block) { attribute }
110
+ subject.send(:name, &block)
111
+ factory.attributes.should include(attribute)
112
+ end
113
+
114
+ it "adds an association when passed an undefined method without arguments or a block" do
115
+ name = :user
116
+ attr = 'attribute'
117
+ stub(attr).name { name }
118
+ mock(FactoryGirl::Attribute::Association).new(name, name, {}) { attr }
119
+ subject.send(name)
120
+ factory.attributes.should include(attr)
121
+ end
122
+
123
+ it "adds a sequence when passed an undefined method without arguments or a block" do
124
+ name = :airport
125
+ proxy = 'proxy'
126
+ FactoryGirl.sequences[name] = FactoryGirl::Sequence.new { |value| "expected" }
127
+ subject.send(name)
128
+ stub(proxy).set
129
+ factory.attributes.last.add_to(proxy)
130
+ proxy.should have_received.set(name, 'expected')
131
+ end
132
+
133
+ it "registers its factory for an alias" do
134
+ aliased_name = :guest
135
+ mock(FactoryGirl).register_factory(factory, :as => aliased_name)
136
+ subject.aliased_as aliased_name
137
+ end
138
+ end