factory_girl 1.2.1 → 1.2.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 (44) hide show
  1. data/CONTRIBUTION_GUIDELINES.rdoc +4 -5
  2. data/README.rdoc +6 -6
  3. data/Rakefile +11 -14
  4. data/lib/factory_girl/attribute.rb +3 -2
  5. data/lib/factory_girl/attribute/dynamic.rb +5 -2
  6. data/lib/factory_girl/proxy/stub.rb +33 -12
  7. data/lib/factory_girl/sequence.rb +3 -0
  8. data/spec/factory_girl/aliases_spec.rb +29 -0
  9. data/spec/factory_girl/attribute/association_spec.rb +25 -0
  10. data/spec/factory_girl/attribute/dynamic_spec.rb +49 -0
  11. data/spec/factory_girl/attribute/static_spec.rb +29 -0
  12. data/spec/factory_girl/attribute_spec.rb +30 -0
  13. data/spec/factory_girl/factory_spec.rb +490 -0
  14. data/spec/factory_girl/proxy/attributes_for_spec.rb +52 -0
  15. data/spec/factory_girl/proxy/build_spec.rb +73 -0
  16. data/spec/factory_girl/proxy/create_spec.rb +83 -0
  17. data/spec/factory_girl/proxy/stub_spec.rb +69 -0
  18. data/spec/factory_girl/proxy_spec.rb +28 -0
  19. data/spec/factory_girl/sequence_spec.rb +66 -0
  20. data/spec/factory_girl/syntax/blueprint_spec.rb +34 -0
  21. data/spec/factory_girl/syntax/generate_spec.rb +57 -0
  22. data/spec/factory_girl/syntax/make_spec.rb +35 -0
  23. data/spec/factory_girl/syntax/sham_spec.rb +35 -0
  24. data/spec/integration_spec.rb +265 -0
  25. data/{test → spec}/models.rb +0 -0
  26. data/{test/test_helper.rb → spec/spec_helper.rb} +12 -5
  27. metadata +44 -42
  28. data/test/aliases_test.rb +0 -29
  29. data/test/association_attribute_test.rb +0 -31
  30. data/test/attribute_test.rb +0 -32
  31. data/test/attributes_for_strategy_test.rb +0 -55
  32. data/test/build_strategy_test.rb +0 -79
  33. data/test/create_strategy_test.rb +0 -90
  34. data/test/dynamic_attribute_test.rb +0 -41
  35. data/test/factory_test.rb +0 -513
  36. data/test/integration_test.rb +0 -235
  37. data/test/sequence_test.rb +0 -76
  38. data/test/static_attribute_test.rb +0 -33
  39. data/test/strategy_test.rb +0 -33
  40. data/test/stub_strategy_test.rb +0 -61
  41. data/test/syntax/blueprint_test.rb +0 -39
  42. data/test/syntax/generate_test.rb +0 -63
  43. data/test/syntax/make_test.rb +0 -39
  44. data/test/syntax/sham_test.rb +0 -40
data/test/aliases_test.rb DELETED
@@ -1,29 +0,0 @@
1
- require 'test_helper'
2
-
3
- class AliasesTest < Test::Unit::TestCase
4
-
5
- should "include an attribute as an alias for itself by default" do
6
- assert Factory.aliases_for(:test).include?(:test)
7
- end
8
-
9
- should "include the root of a foreign key as an alias by default" do
10
- assert Factory.aliases_for(:test_id).include?(:test)
11
- end
12
-
13
- should "include an attribute's foreign key as an alias by default" do
14
- assert Factory.aliases_for(:test).include?(:test_id)
15
- end
16
-
17
- context "after adding an alias" do
18
-
19
- setup do
20
- Factory.alias(/(.*)_suffix/, '\1')
21
- end
22
-
23
- should "return the alias in the aliases list" do
24
- assert Factory.aliases_for(:test_suffix).include?(:test)
25
- end
26
-
27
- end
28
-
29
- end
@@ -1,31 +0,0 @@
1
- require 'test_helper'
2
-
3
- class AssociationAttributeTest < Test::Unit::TestCase
4
-
5
- context "an association" do
6
- setup do
7
- @name = :author
8
- @factory = :user
9
- @overrides = { :first_name => 'John' }
10
- @attr = Factory::Attribute::Association.new(@name,
11
- @factory,
12
- @overrides)
13
- end
14
-
15
- should "have a name" do
16
- assert_equal @name, @attr.name
17
- end
18
-
19
- should "tell the proxy to associate when being added to a proxy" do
20
- proxy = mock('proxy')
21
- proxy.expects(:associate).with(@name, @factory, @overrides)
22
- @attr.add_to(proxy)
23
- end
24
- end
25
-
26
- should "convert names to symbols" do
27
- assert_equal :name,
28
- Factory::Attribute::Association.new('name', :user, {}).name
29
- end
30
-
31
- end
@@ -1,32 +0,0 @@
1
- require 'test_helper'
2
-
3
- class AttributeTest < Test::Unit::TestCase
4
-
5
- context "an attribute" do
6
- setup do
7
- @name = :user
8
- @attr = Factory::Attribute.new(@name)
9
- end
10
-
11
- should "have a name" do
12
- assert_equal @name, @attr.name
13
- end
14
-
15
- should "do nothing when being added to a proxy" do
16
- @proxy = mock('proxy')
17
- @proxy.expects(:set).never
18
- @attr.add_to(@proxy)
19
- end
20
- end
21
-
22
- should "raise an error when defining an attribute writer" do
23
- assert_raise Factory::AttributeDefinitionError do
24
- Factory::Attribute.new('test=')
25
- end
26
- end
27
-
28
- should "convert names to symbols" do
29
- assert_equal :name, Factory::Attribute.new('name').name
30
- end
31
-
32
- end
@@ -1,55 +0,0 @@
1
- require 'test_helper'
2
-
3
- class AttributesForProxyTest < Test::Unit::TestCase
4
-
5
- context "the attributes_for proxy" do
6
- setup do
7
- @proxy = Factory::Proxy::AttributesFor.new(@class)
8
- end
9
-
10
- context "when asked to associate with another factory" do
11
- setup do
12
- Factory.stubs(:create)
13
- @proxy.associate(:owner, :user, {})
14
- end
15
-
16
- should "not set a value for the association" do
17
- assert !@proxy.result.key?(:owner)
18
- end
19
- end
20
-
21
- should "return nil when building an association" do
22
- assert_nil @proxy.association(:user)
23
- end
24
-
25
- should "not call Factory.create when building an association" do
26
- Factory.expects(:create).never
27
- assert_nil @proxy.association(:user)
28
- end
29
-
30
- should "always return nil when building an association" do
31
- @proxy.set(:association, 'x')
32
- assert_nil @proxy.association(:user)
33
- end
34
-
35
- should "return a hash when asked for the result" do
36
- assert_kind_of Hash, @proxy.result
37
- end
38
-
39
- context "after setting an attribute" do
40
- setup do
41
- @proxy.set(:attribute, 'value')
42
- end
43
-
44
- should "set that value in the resulting hash" do
45
- assert_equal 'value', @proxy.result[:attribute]
46
- end
47
-
48
- should "return that value when asked for that attribute" do
49
- assert_equal 'value', @proxy.get(:attribute)
50
- end
51
- end
52
- end
53
-
54
- end
55
-
@@ -1,79 +0,0 @@
1
- require 'test_helper'
2
-
3
- class BuildProxyTest < Test::Unit::TestCase
4
-
5
- context "with a class to build" do
6
- setup do
7
- @class = Class.new
8
- @instance = mock('built-instance')
9
- @association = mock('associated-instance')
10
-
11
- @class. stubs(:new). returns(@instance)
12
- @instance.stubs(:attribute).returns('value')
13
- Factory. stubs(:create). returns(@association)
14
- @instance.stubs(:attribute=)
15
- @instance.stubs(:owner=)
16
- end
17
-
18
- context "the build proxy" do
19
- setup do
20
- @proxy = Factory::Proxy::Build.new(@class)
21
- end
22
-
23
- before_should "instantiate the class" do
24
- @class.expects(:new).with().returns(@instance)
25
- end
26
-
27
- context "when asked to associate with another factory" do
28
- setup do
29
- @proxy.associate(:owner, :user, {})
30
- end
31
-
32
- before_should "create the associated instance" do
33
- Factory.expects(:create).with(:user, {}).returns(@association)
34
- end
35
-
36
- before_should "set the associated instance" do
37
- @instance.expects(:owner=).with(@association)
38
- end
39
- end
40
-
41
- should "call Factory.create when building an association" do
42
- association = 'association'
43
- attribs = { :first_name => 'Billy' }
44
- Factory.expects(:create).with(:user, attribs).returns(association)
45
- assert_equal association, @proxy.association(:user, attribs)
46
- end
47
-
48
- should "return the built instance when asked for the result" do
49
- assert_equal @instance, @proxy.result
50
- end
51
-
52
- context "when setting an attribute" do
53
- setup do
54
- @proxy.set(:attribute, 'value')
55
- end
56
-
57
- before_should "set that value" do
58
- @instance.expects(:attribute=).with('value')
59
- end
60
- end
61
-
62
- context "when getting an attribute" do
63
- setup do
64
- @result = @proxy.get(:attribute)
65
- end
66
-
67
- before_should "ask the built class for the value" do
68
- @instance.expects(:attribute).with().returns('value')
69
- end
70
-
71
- should "return the value for that attribute" do
72
- assert_equal 'value', @result
73
- end
74
- end
75
- end
76
- end
77
-
78
- end
79
-
@@ -1,90 +0,0 @@
1
- require 'test_helper'
2
-
3
- class CreateProxyTest < Test::Unit::TestCase
4
-
5
- context "with a class to build" do
6
- setup do
7
- @class = Class.new
8
- @instance = mock('built-instance')
9
- @association = mock('associated-instance')
10
-
11
- @class. stubs(:new). returns(@instance)
12
- Factory. stubs(:create). returns(@association)
13
- @instance.stubs(:attribute).returns('value')
14
- @instance.stubs(:attribute=)
15
- @instance.stubs(:owner=)
16
- @instance.stubs(:save!)
17
- end
18
-
19
- context "the create proxy" do
20
- setup do
21
- @proxy = Factory::Proxy::Create.new(@class)
22
- end
23
-
24
- before_should "instantiate the class" do
25
- @class.expects(:new).with().returns(@instance)
26
- end
27
-
28
- context "when asked to associate with another factory" do
29
- setup do
30
- @proxy.associate(:owner, :user, {})
31
- end
32
-
33
- before_should "create the associated instance" do
34
- Factory.expects(:create).with(:user, {}).returns(@association)
35
- end
36
-
37
- before_should "set the associated instance" do
38
- @instance.expects(:owner=).with(@association)
39
- end
40
- end
41
-
42
- should "call Factory.create when building an association" do
43
- association = 'association'
44
- attribs = { :first_name => 'Billy' }
45
- Factory.expects(:create).with(:user, attribs).returns(association)
46
- assert_equal association, @proxy.association(:user, attribs)
47
- end
48
-
49
- context "when asked for the result" do
50
- setup do
51
- @result = @proxy.result
52
- end
53
-
54
- before_should "save the instance" do
55
- @instance.expects(:save!).with()
56
- end
57
-
58
- should "return the built instance" do
59
- assert_equal @instance, @result
60
- end
61
- end
62
-
63
- context "when setting an attribute" do
64
- setup do
65
- @proxy.set(:attribute, 'value')
66
- end
67
-
68
- before_should "set that value" do
69
- @instance.expects(:attribute=).with('value')
70
- end
71
- end
72
-
73
- context "when getting an attribute" do
74
- setup do
75
- @result = @proxy.get(:attribute)
76
- end
77
-
78
- before_should "ask the built class for the value" do
79
- @instance.expects(:attribute).with().returns('value')
80
- end
81
-
82
- should "return the value for that attribute" do
83
- assert_equal 'value', @result
84
- end
85
- end
86
- end
87
- end
88
-
89
- end
90
-
@@ -1,41 +0,0 @@
1
- require 'test_helper'
2
-
3
- class DynamicAttributeTest < Test::Unit::TestCase
4
-
5
- context "a static attribute" do
6
- setup do
7
- @name = :first_name
8
- @block = lambda { 'value' }
9
- @attr = Factory::Attribute::Dynamic.new(@name, @block)
10
- end
11
-
12
- should "have a name" do
13
- assert_equal @name, @attr.name
14
- end
15
-
16
- should "call the block to set a value" do
17
- @proxy = mock('proxy')
18
- @proxy.expects(:set).with(@name, 'value')
19
- @attr.add_to(@proxy)
20
- end
21
-
22
- should "yield the proxy to the block when adding its value to a proxy" do
23
- @block = lambda {|a| a }
24
- @attr = Factory::Attribute::Dynamic.new(:user, @block)
25
- @proxy = mock('proxy')
26
- @proxy.expects(:set).with(:user, @proxy)
27
- @attr.add_to(@proxy)
28
- end
29
- end
30
-
31
- should "raise an error when defining an attribute writer" do
32
- assert_raise Factory::AttributeDefinitionError do
33
- Factory::Attribute::Dynamic.new('test=', nil)
34
- end
35
- end
36
-
37
- should "convert names to symbols" do
38
- assert_equal :name, Factory::Attribute::Dynamic.new('name', nil).name
39
- end
40
-
41
- end
data/test/factory_test.rb DELETED
@@ -1,513 +0,0 @@
1
- require 'test_helper'
2
-
3
- class FactoryTest < Test::Unit::TestCase
4
- factory = Factory.new(:post)
5
- context "defining a factory" do
6
- setup do
7
- @name = :user
8
- @factory = mock('factory')
9
- @factory.stubs(:factory_name).returns(@name)
10
- @options = { :class => 'magic' }
11
- Factory.stubs(:new).returns(@factory)
12
- end
13
-
14
- should "create a new factory using the specified name and options" do
15
- Factory.expects(:new).with(@name, @options).returns(@factory)
16
- Factory.define(@name, @options) {|f| }
17
- end
18
-
19
- should "pass the factory do the block" do
20
- yielded = nil
21
- Factory.define(@name) do |y|
22
- yielded = y
23
- end
24
- assert_equal @factory, yielded
25
- end
26
-
27
- should "add the factory to the list of factories" do
28
- Factory.define(@name) {|f| }
29
- assert_equal Factory.factories[@name],
30
- @factory,
31
- "Factories: #{Factory.factories.inspect}"
32
- end
33
- end
34
-
35
- context "a factory" do
36
- setup do
37
- @name = :user
38
- @class = User
39
- @factory = Factory.new(@name)
40
- end
41
-
42
- should "have a factory name" do
43
- assert_equal @name, @factory.factory_name
44
- end
45
-
46
- should "have a build class" do
47
- assert_equal @class, @factory.build_class
48
- end
49
-
50
- should "have a default strategy" do
51
- assert_equal :create, @factory.default_strategy
52
- end
53
-
54
- should "not allow the same attribute to be added twice" do
55
- assert_raise(Factory::AttributeDefinitionError) do
56
- 2.times { @factory.add_attribute :first_name }
57
- end
58
- end
59
-
60
- should "add a static attribute when an attribute is defined with a value" do
61
- attribute = mock('attribute', :name => :name)
62
- Factory::Attribute::Static.
63
- expects(:new).
64
- with(:name, 'value').
65
- returns(attribute)
66
- @factory.add_attribute(:name, 'value')
67
- end
68
-
69
- should "add a dynamic attribute when an attribute is defined with a block" do
70
- attribute = mock('attribute', :name => :name)
71
- block = lambda {}
72
- Factory::Attribute::Dynamic.
73
- expects(:new).
74
- with(:name, block).
75
- returns(attribute)
76
- @factory.add_attribute(:name, &block)
77
- end
78
-
79
- should "raise for an attribute with a value and a block" do
80
- assert_raise(Factory::AttributeDefinitionError) do
81
- @factory.add_attribute(:name, 'value') {}
82
- end
83
- end
84
-
85
- context "adding an attribute using a in-line sequence" do
86
- should 'create the sequence' do
87
- Factory::Sequence.
88
- expects(:new)
89
- @factory.sequence(:name) {}
90
- end
91
-
92
- should 'add a dynamic attribute' do
93
- attr = mock('attribute', :name => :name)
94
- Factory::Attribute::Dynamic.
95
- expects(:new).
96
- with(:name, instance_of(Proc)).
97
- returns(attr)
98
- @factory.sequence(:name) {}
99
- assert @factory.attributes.include?(attr)
100
- end
101
- end
102
-
103
- context "after adding an attribute" do
104
- setup do
105
- @attribute = mock('attribute')
106
- @proxy = mock('proxy')
107
-
108
- @attribute. stubs(:name). returns(:name)
109
- @attribute. stubs(:add_to)
110
- @proxy. stubs(:set)
111
- @proxy. stubs(:result).returns('result')
112
- Factory::Attribute::Static.stubs(:new). returns(@attribute)
113
- Factory::Proxy::Build. stubs(:new). returns(@proxy)
114
-
115
- @factory.add_attribute(:name, 'value')
116
- end
117
-
118
- should "create the right proxy using the build class when running" do
119
- Factory::Proxy::Build.
120
- expects(:new).
121
- with(@factory.build_class).
122
- returns(@proxy)
123
- @factory.run(Factory::Proxy::Build, {})
124
- end
125
-
126
- should "add the attribute to the proxy when running" do
127
- @attribute.expects(:add_to).with(@proxy)
128
- @factory.run(Factory::Proxy::Build, {})
129
- end
130
-
131
- should "return the result from the proxy when running" do
132
- @proxy.expects(:result).with().returns('result')
133
- assert_equal 'result',
134
- @factory.run(Factory::Proxy::Build, {})
135
- end
136
- end
137
-
138
- should "add an association without a factory name or overrides" do
139
- factory = Factory.new(:post)
140
- name = :user
141
- attr = 'attribute'
142
- Factory::Attribute::Association.
143
- expects(:new).
144
- with(name, name, {}).
145
- returns(attr)
146
- factory.association(name)
147
- assert factory.attributes.include?(attr)
148
- end
149
-
150
- should "add an association with overrides" do
151
- factory = Factory.new(:post)
152
- name = :user
153
- attr = 'attribute'
154
- overrides = { :first_name => 'Ben' }
155
- Factory::Attribute::Association.
156
- expects(:new).
157
- with(name, name, overrides).
158
- returns(attr)
159
- factory.association(name, overrides)
160
- assert factory.attributes.include?(attr)
161
- end
162
-
163
- should "add an association with a factory name" do
164
- factory = Factory.new(:post)
165
- attr = 'attribute'
166
- Factory::Attribute::Association.
167
- expects(:new).
168
- with(:author, :user, {}).
169
- returns(attr)
170
- factory.association(:author, :factory => :user)
171
- assert factory.attributes.include?(attr)
172
- end
173
-
174
- should "add an association with a factory name and overrides" do
175
- factory = Factory.new(:post)
176
- attr = 'attribute'
177
- Factory::Attribute::Association.
178
- expects(:new).
179
- with(:author, :user, :first_name => 'Ben').
180
- returns(attr)
181
- factory.association(:author, :factory => :user, :first_name => 'Ben')
182
- assert factory.attributes.include?(attr)
183
- end
184
-
185
- should "raise for a self referencing association" do
186
- factory = Factory.new(:post)
187
- assert_raise(Factory::AssociationDefinitionError) do
188
- factory.association(:parent, :factory => :post)
189
- end
190
- end
191
-
192
- should "add an attribute using the method name when passed an undefined method" do
193
- attr = mock('attribute', :name => :name)
194
- block = lambda {}
195
- Factory::Attribute::Static.
196
- expects(:new).
197
- with(:name, 'value').
198
- returns(attr)
199
- @factory.send(:name, 'value')
200
- assert @factory.attributes.include?(attr)
201
- end
202
-
203
- context "when overriding generated attributes with a hash" do
204
- setup do
205
- @attr = :name
206
- @value = 'The price is right!'
207
- @hash = { @attr => @value }
208
- end
209
-
210
- should "return the overridden value in the generated attributes" do
211
- @factory.add_attribute(@attr, 'The price is wrong, Bob!')
212
- result = @factory.run(Factory::Proxy::AttributesFor, @hash)
213
- assert_equal @value, result[@attr]
214
- end
215
-
216
- should "not call a lazy attribute block for an overridden attribute" do
217
- @factory.add_attribute(@attr) { flunk }
218
- result = @factory.run(Factory::Proxy::AttributesFor, @hash)
219
- end
220
-
221
- should "override a symbol parameter with a string parameter" do
222
- @factory.add_attribute(@attr, 'The price is wrong, Bob!')
223
- @hash = { @attr.to_s => @value }
224
- result = @factory.run(Factory::Proxy::AttributesFor, @hash)
225
- assert_equal @value, result[@attr]
226
- end
227
- end
228
-
229
- context "overriding an attribute with an alias" do
230
- setup do
231
- @factory.add_attribute(:test, 'original')
232
- Factory.alias(/(.*)_alias/, '\1')
233
- @result = @factory.run(Factory::Proxy::AttributesFor,
234
- :test_alias => 'new')
235
- end
236
-
237
- should "use the passed in value for the alias" do
238
- assert_equal 'new', @result[:test_alias]
239
- end
240
-
241
- should "discard the predefined value for the attribute" do
242
- assert_nil @result[:test]
243
- end
244
- end
245
-
246
- should "guess the build class from the factory name" do
247
- assert_equal User, @factory.build_class
248
- end
249
-
250
- context "when defined with a custom class" do
251
- setup do
252
- @class = User
253
- @factory = Factory.new(:author, :class => @class)
254
- end
255
-
256
- should "use the specified class as the build class" do
257
- assert_equal @class, @factory.build_class
258
- end
259
- end
260
-
261
- context "when defined with a class instead of a name" do
262
- setup do
263
- @class = ArgumentError
264
- @name = :argument_error
265
- @factory = Factory.new(@class)
266
- end
267
-
268
- should "guess the name from the class" do
269
- assert_equal @name, @factory.factory_name
270
- end
271
-
272
- should "use the class as the build class" do
273
- assert_equal @class, @factory.build_class
274
- end
275
- end
276
-
277
- context "when defined with a custom class name" do
278
- setup do
279
- @class = ArgumentError
280
- @factory = Factory.new(:author, :class => :argument_error)
281
- end
282
-
283
- should "use the specified class as the build class" do
284
- assert_equal @class, @factory.build_class
285
- end
286
- end
287
- end
288
-
289
- context "a factory with a name ending in s" do
290
- setup do
291
- @name = :business
292
- @class = Business
293
- @factory = Factory.new(@name)
294
- end
295
-
296
- should "have a factory name" do
297
- assert_equal @name, @factory.factory_name
298
- end
299
-
300
- should "have a build class" do
301
- assert_equal @class, @factory.build_class
302
- end
303
- end
304
-
305
- context "a factory with a string for a name" do
306
- setup do
307
- @name = :user
308
- @factory = Factory.new(@name.to_s) {}
309
- end
310
-
311
- should "convert the string to a symbol" do
312
- assert_equal @name, @factory.factory_name
313
- end
314
- end
315
-
316
- context "a factory defined with a string name" do
317
- setup do
318
- Factory.factories = {}
319
- @name = :user
320
- @factory = Factory.define(@name.to_s) {}
321
- end
322
-
323
- should "store the factory using a symbol" do
324
- assert_equal @factory, Factory.factories[@name]
325
- end
326
- end
327
-
328
- context "after defining a factory" do
329
- setup do
330
- @name = :user
331
- @factory = mock('factory')
332
-
333
- Factory.factories[@name] = @factory
334
- end
335
-
336
- teardown { Factory.factories.clear }
337
-
338
- should "use Proxy::AttributesFor for Factory.attributes_for" do
339
- @factory.
340
- expects(:run).
341
- with(Factory::Proxy::AttributesFor, :attr => 'value').
342
- returns('result')
343
- assert_equal 'result', Factory.attributes_for(@name, :attr => 'value')
344
- end
345
-
346
- should "use Proxy::Build for Factory.build" do
347
- @factory.
348
- expects(:run).
349
- with(Factory::Proxy::Build, :attr => 'value').
350
- returns('result')
351
- assert_equal 'result', Factory.build(@name, :attr => 'value')
352
- end
353
-
354
- should "use Proxy::Create for Factory.create" do
355
- @factory.
356
- expects(:run).
357
- with(Factory::Proxy::Create, :attr => 'value').
358
- returns('result')
359
- assert_equal 'result', Factory.create(@name, :attr => 'value')
360
- end
361
-
362
- should "use Proxy::Stub for Factory.stub" do
363
- @factory.
364
- expects(:run).
365
- with(Factory::Proxy::Stub, :attr => 'value').
366
- returns('result')
367
- assert_equal 'result', Factory.stub(@name, :attr => 'value')
368
- end
369
-
370
- should "use default strategy option as Factory.default_strategy" do
371
- @factory.stubs(:default_strategy).returns(:create)
372
- @factory.
373
- expects(:run).
374
- with(Factory::Proxy::Create, :attr => 'value').
375
- returns('result')
376
- assert_equal 'result', Factory.default_strategy(@name, :attr => 'value')
377
- end
378
-
379
- should "use the default strategy for the global Factory method" do
380
- @factory.stubs(:default_strategy).returns(:create)
381
- @factory.
382
- expects(:run).
383
- with(Factory::Proxy::Create, :attr => 'value').
384
- returns('result')
385
- assert_equal 'result', Factory(@name, :attr => 'value')
386
- end
387
-
388
- [:build, :create, :attributes_for, :stub].each do |method|
389
- should "raise an ArgumentError on #{method} with a nonexistant factory" do
390
- assert_raise(ArgumentError) { Factory.send(method, :bogus) }
391
- end
392
-
393
- should "recognize either 'name' or :name for Factory.#{method}" do
394
- @factory.stubs(:run)
395
- assert_nothing_raised { Factory.send(method, @name.to_s) }
396
- assert_nothing_raised { Factory.send(method, @name.to_sym) }
397
- end
398
- end
399
- end
400
-
401
- context 'defining a factory with a parent parameter' do
402
- setup do
403
- @parent = Factory.define :object do |f|
404
- f.name 'Name'
405
- end
406
- end
407
-
408
- should 'raise an ArgumentError when trying to use a non-existent factory as parent' do
409
- assert_raise(ArgumentError) { Factory.define(:child, :parent => :nonexsitent) {} }
410
- end
411
-
412
- should 'create a new factory using the class of the parent' do
413
- child = Factory.define(:child, :parent => :object) {}
414
- assert_equal @parent.build_class, child.build_class
415
- end
416
-
417
- should 'create a new factory while overriding the parent class' do
418
- class Other; end
419
-
420
- child = Factory.define(:child, :parent => :object, :class => Other) {}
421
- assert_equal Other, child.build_class
422
- end
423
-
424
- should 'create a new factory with attributes of the parent' do
425
- child = Factory.define(:child, :parent => :object) {}
426
- assert_equal 1, child.attributes.size
427
- assert_equal :name, child.attributes.first.name
428
- end
429
-
430
- should 'allow to define additional attributes' do
431
- child = Factory.define(:child, :parent => :object) do |f|
432
- f.email 'person@somebody.com'
433
- end
434
- assert_equal 2, child.attributes.size
435
- end
436
-
437
- should 'allow to override parent attributes' do
438
- child = Factory.define(:child, :parent => :object) do |f|
439
- f.name { 'Child Name' }
440
- end
441
- assert_equal 1, child.attributes.size
442
- assert_kind_of Factory::Attribute::Dynamic, child.attributes.first
443
- end
444
- end
445
-
446
- context 'defining a factory with a default strategy parameter' do
447
- should 'raise an ArgumentError when trying to use a non-existent factory' do
448
- assert_raise(ArgumentError) { Factory.define(:object, :default_strategy => :nonexistent) {} }
449
- end
450
-
451
- should 'create a new factory with a specified default strategy' do
452
- factory = Factory.define(:object, :default_strategy => :stub) {}
453
- assert_equal :stub, factory.default_strategy
454
- end
455
- end
456
-
457
- def self.context_in_directory_with_files(*files)
458
- context "in a directory with #{files.to_sentence}" do
459
- setup do
460
- @pwd = Dir.pwd
461
- @tmp_dir = File.join(File.dirname(__FILE__), 'tmp')
462
- FileUtils.mkdir_p @tmp_dir
463
- Dir.chdir(@tmp_dir)
464
-
465
- files.each do |file|
466
- FileUtils.mkdir_p File.dirname(file)
467
- FileUtils.touch file
468
- Factory.stubs(:require).with(file)
469
- end
470
- end
471
-
472
- teardown do
473
- Dir.chdir(@pwd)
474
- FileUtils.rm_rf(@tmp_dir)
475
- end
476
-
477
- yield
478
- end
479
- end
480
-
481
- def self.should_require_definitions_from(file)
482
- should "load definitions from #{file}" do
483
- Factory.expects(:require).with(file)
484
- Factory.find_definitions
485
- end
486
- end
487
-
488
- context_in_directory_with_files 'factories.rb' do
489
- should_require_definitions_from 'factories.rb'
490
- end
491
-
492
- %w(spec test).each do |dir|
493
- context_in_directory_with_files File.join(dir, 'factories.rb') do
494
- should_require_definitions_from "#{dir}/factories.rb"
495
- end
496
-
497
- context_in_directory_with_files File.join(dir, 'factories', 'post_factory.rb') do
498
- should_require_definitions_from "#{dir}/factories/post_factory.rb"
499
- end
500
-
501
- context_in_directory_with_files File.join(dir, 'factories', 'post_factory.rb'), File.join(dir, 'factories', 'person_factory.rb') do
502
- should_require_definitions_from "#{dir}/factories/post_factory.rb"
503
- should_require_definitions_from "#{dir}/factories/person_factory.rb"
504
- end
505
-
506
- context_in_directory_with_files File.join(dir, 'factories.rb'), File.join(dir, 'factories', 'post_factory.rb'), File.join(dir, 'factories', 'person_factory.rb') do
507
- should_require_definitions_from "#{dir}/factories.rb"
508
- should_require_definitions_from "#{dir}/factories/post_factory.rb"
509
- should_require_definitions_from "#{dir}/factories/person_factory.rb"
510
- end
511
- end
512
-
513
- end