factory_girl 2.0.0.beta5 → 2.0.0.rc1
Sign up to get free protection for your applications and to get access to all the features.
- data/features/factory_girl_steps.feature +8 -0
- data/features/support/factories.rb +4 -5
- data/features/support/test.db +0 -0
- data/lib/factory_girl/factory.rb +2 -2
- data/lib/factory_girl/registry.rb +1 -1
- data/lib/factory_girl/step_definitions.rb +106 -36
- data/lib/factory_girl/version.rb +1 -1
- data/spec/factory_girl/factory_spec.rb +20 -5
- data/spec/factory_girl/registry_spec.rb +13 -0
- metadata +44 -2
@@ -182,3 +182,11 @@ Feature: Use step definitions generated by factories
|
|
182
182
|
Then there should be 3 categories
|
183
183
|
Given 3 Categories exist with a name of "science"
|
184
184
|
Then there should be 6 Categories
|
185
|
+
|
186
|
+
Scenario: step definitions work correctly with aliases
|
187
|
+
Given the following person exists:
|
188
|
+
| ID | Name |
|
189
|
+
| 123 | Joe |
|
190
|
+
Then I should find the following for the last user:
|
191
|
+
| id | name |
|
192
|
+
| 123 | Joe |
|
@@ -54,11 +54,10 @@ FactoryGirl.define do
|
|
54
54
|
"email#{n}@example.com"
|
55
55
|
end
|
56
56
|
|
57
|
-
factory :user do
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
admin true
|
57
|
+
factory :user, :aliases => [:person] do
|
58
|
+
factory :admin_user do
|
59
|
+
admin true
|
60
|
+
end
|
62
61
|
end
|
63
62
|
|
64
63
|
factory :category do
|
data/features/support/test.db
CHANGED
Binary file
|
data/lib/factory_girl/factory.rb
CHANGED
@@ -1,24 +1,92 @@
|
|
1
1
|
module FactoryGirlStepHelpers
|
2
|
-
|
3
|
-
|
4
|
-
attribute, value = assignment.split(':', 2)
|
5
|
-
return if value.blank?
|
6
|
-
factory = FactoryGirl.factory_by_name(factory_name)
|
7
|
-
attributes = convert_human_hash_to_attribute_hash({attribute => value.strip}, factory.associations)
|
8
|
-
model_class = factory.build_class
|
9
|
-
model_class.find(:first, :conditions => attributes) or
|
10
|
-
FactoryGirl.create(factory_name, attributes)
|
2
|
+
def convert_human_hash_to_attribute_hash(human_hash, associations = [])
|
3
|
+
HumanHashToAttributeHash.new(human_hash, associations).attributes
|
11
4
|
end
|
12
5
|
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
6
|
+
class HumanHashToAttributeHash
|
7
|
+
attr_reader :associations
|
8
|
+
|
9
|
+
def initialize(human_hash, associations)
|
10
|
+
@human_hash = human_hash
|
11
|
+
@associations = associations
|
12
|
+
end
|
13
|
+
|
14
|
+
def attributes(strategy = CreateAttributes)
|
15
|
+
@human_hash.inject({}) do |attribute_hash, (human_key, value)|
|
16
|
+
attributes = strategy.new(self, *process_key_value(human_key, value))
|
17
|
+
attribute_hash.merge({ attributes.key => attributes.value })
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
private
|
22
|
+
|
23
|
+
def process_key_value(key, value)
|
24
|
+
[key.downcase.gsub(' ', '_').to_sym, value.strip]
|
25
|
+
end
|
26
|
+
|
27
|
+
class AssociationManager
|
28
|
+
def initialize(human_hash_to_attributes_hash, key, value)
|
29
|
+
@human_hash_to_attributes_hash = human_hash_to_attributes_hash
|
30
|
+
@key = key
|
31
|
+
@value = value
|
32
|
+
end
|
33
|
+
|
34
|
+
def association
|
35
|
+
@human_hash_to_attributes_hash.associations.detect {|association| association.name == @key }
|
36
|
+
end
|
37
|
+
|
38
|
+
def association_instance
|
39
|
+
return unless association
|
40
|
+
|
41
|
+
if attributes_hash = nested_attribute_hash
|
42
|
+
factory.build_class.find(:first, :conditions => attributes_hash.attributes(FindAttributes)) or
|
43
|
+
FactoryGirl.create(association.factory, attributes_hash.attributes)
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
private
|
48
|
+
|
49
|
+
def factory
|
50
|
+
FactoryGirl.factory_by_name(association.factory)
|
51
|
+
end
|
52
|
+
|
53
|
+
def nested_attribute_hash
|
54
|
+
attribute, value = @value.split(':', 2)
|
55
|
+
return if value.blank?
|
56
|
+
|
57
|
+
HumanHashToAttributeHash.new({ attribute => value }, factory.associations)
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
class AttributeStrategy
|
62
|
+
attr_reader :key, :value, :association_manager
|
63
|
+
|
64
|
+
def initialize(human_hash_to_attributes_hash, key, value)
|
65
|
+
@association_manager = AssociationManager.new(human_hash_to_attributes_hash, key, value)
|
66
|
+
@key = key
|
67
|
+
@value = value
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
class FindAttributes < AttributeStrategy
|
72
|
+
def initialize(human_hash_to_attributes_hash, key, value)
|
73
|
+
super
|
74
|
+
|
75
|
+
if association_manager.association
|
76
|
+
@key = "#{@key}_id"
|
77
|
+
@value = association_manager.association_instance.try(:id)
|
78
|
+
end
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
82
|
+
class CreateAttributes < AttributeStrategy
|
83
|
+
def initialize(human_hash_to_attributes_hash, key, value)
|
84
|
+
super
|
85
|
+
|
86
|
+
if association_manager.association
|
87
|
+
@value = association_manager.association_instance
|
88
|
+
end
|
20
89
|
end
|
21
|
-
attribute_hash.merge(key => value)
|
22
90
|
end
|
23
91
|
end
|
24
92
|
end
|
@@ -26,30 +94,32 @@ end
|
|
26
94
|
World(FactoryGirlStepHelpers)
|
27
95
|
|
28
96
|
FactoryGirl.factories.each do |factory|
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
97
|
+
factory.human_names.each do |human_name|
|
98
|
+
Given /^the following (?:#{human_name}|#{human_name.pluralize}) exists?:$/i do |table|
|
99
|
+
table.hashes.each do |human_hash|
|
100
|
+
attributes = convert_human_hash_to_attribute_hash(human_hash, factory.associations)
|
101
|
+
FactoryGirl.create(factory.name, attributes)
|
102
|
+
end
|
33
103
|
end
|
34
|
-
end
|
35
104
|
|
36
|
-
|
37
|
-
|
38
|
-
|
105
|
+
Given /^an? #{human_name} exists$/i do
|
106
|
+
FactoryGirl.create(factory.name)
|
107
|
+
end
|
39
108
|
|
40
|
-
|
41
|
-
|
42
|
-
|
109
|
+
Given /^(\d+) #{human_name.pluralize} exist$/i do |count|
|
110
|
+
count.to_i.times { FactoryGirl.create(factory.name) }
|
111
|
+
end
|
43
112
|
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
113
|
+
if factory.build_class.respond_to?(:columns)
|
114
|
+
factory.build_class.columns.each do |column|
|
115
|
+
human_column_name = column.name.downcase.gsub('_', ' ')
|
116
|
+
Given /^an? #{human_name} exists with an? #{human_column_name} of "([^"]*)"$/i do |value|
|
117
|
+
FactoryGirl.create(factory.name, column.name => value)
|
118
|
+
end
|
50
119
|
|
51
|
-
|
52
|
-
|
120
|
+
Given /^(\d+) #{human_name.pluralize} exist with an? #{human_column_name} of "([^"]*)"$/i do |count, value|
|
121
|
+
count.to_i.times { FactoryGirl.create(factory.name, column.name => value) }
|
122
|
+
end
|
53
123
|
end
|
54
124
|
end
|
55
125
|
end
|
data/lib/factory_girl/version.rb
CHANGED
@@ -354,14 +354,22 @@ describe FactoryGirl::Factory do
|
|
354
354
|
|
355
355
|
end
|
356
356
|
|
357
|
-
describe FactoryGirl::Factory, "
|
358
|
-
|
357
|
+
describe FactoryGirl::Factory, "human names" do
|
358
|
+
context "factory name without underscores" do
|
359
|
+
subject { FactoryGirl::Factory.new("user") }
|
360
|
+
its(:human_names) { should == ["user"] }
|
361
|
+
end
|
359
362
|
|
360
|
-
|
361
|
-
subject.
|
363
|
+
context "factory name with underscores" do
|
364
|
+
subject { FactoryGirl::Factory.new("happy_user") }
|
365
|
+
its(:human_names) { should == ["happy user"] }
|
362
366
|
end
|
363
|
-
end
|
364
367
|
|
368
|
+
context "factory name with aliases" do
|
369
|
+
subject { FactoryGirl::Factory.new("happy_user", :aliases => ["gleeful_user", "person"]) }
|
370
|
+
its(:human_names) { should == ["happy user", "gleeful user", "person"] }
|
371
|
+
end
|
372
|
+
end
|
365
373
|
|
366
374
|
describe FactoryGirl::Factory, "with aliases" do
|
367
375
|
it "registers the aliases" do
|
@@ -370,4 +378,11 @@ describe FactoryGirl::Factory, "with aliases" do
|
|
370
378
|
factory = FactoryGirl::Factory.new(:user, :aliases => [aliased_name])
|
371
379
|
factory.names.should =~ [name, aliased_name]
|
372
380
|
end
|
381
|
+
|
382
|
+
it "has human names" do
|
383
|
+
name = :user
|
384
|
+
aliased_name = :guest
|
385
|
+
factory = FactoryGirl::Factory.new(:user, :aliases => [aliased_name])
|
386
|
+
factory.human_names.should =~ [name.to_s, aliased_name.to_s]
|
387
|
+
end
|
373
388
|
end
|
@@ -50,6 +50,19 @@ describe FactoryGirl::Registry do
|
|
50
50
|
result.should =~ [factory, other_factory]
|
51
51
|
end
|
52
52
|
|
53
|
+
it "iterates registered factories uniquely with aliases" do
|
54
|
+
other_factory = FactoryGirl::Factory.new(:string, :aliases => [:awesome])
|
55
|
+
subject.add(factory)
|
56
|
+
subject.add(other_factory)
|
57
|
+
result = []
|
58
|
+
|
59
|
+
subject.each do |value|
|
60
|
+
result << value
|
61
|
+
end
|
62
|
+
|
63
|
+
result.should =~ [factory, other_factory]
|
64
|
+
end
|
65
|
+
|
53
66
|
it "registers an sequence" do
|
54
67
|
sequence = FactoryGirl::Sequence.new(:email) { |n| "somebody#{n}@example.com" }
|
55
68
|
subject.add(sequence)
|
metadata
CHANGED
@@ -1,8 +1,15 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: factory_girl
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
+
hash: 15424087
|
4
5
|
prerelease: 6
|
5
|
-
|
6
|
+
segments:
|
7
|
+
- 2
|
8
|
+
- 0
|
9
|
+
- 0
|
10
|
+
- rc
|
11
|
+
- 1
|
12
|
+
version: 2.0.0.rc1
|
6
13
|
platform: ruby
|
7
14
|
authors:
|
8
15
|
- Joe Ferris
|
@@ -10,7 +17,7 @@ autorequire:
|
|
10
17
|
bindir: bin
|
11
18
|
cert_chain: []
|
12
19
|
|
13
|
-
date: 2011-06-
|
20
|
+
date: 2011-06-30 00:00:00 -04:00
|
14
21
|
default_executable:
|
15
22
|
dependencies:
|
16
23
|
- !ruby/object:Gem::Dependency
|
@@ -21,6 +28,9 @@ dependencies:
|
|
21
28
|
requirements:
|
22
29
|
- - ">="
|
23
30
|
- !ruby/object:Gem::Version
|
31
|
+
hash: 3
|
32
|
+
segments:
|
33
|
+
- 0
|
24
34
|
version: "0"
|
25
35
|
type: :development
|
26
36
|
version_requirements: *id001
|
@@ -32,6 +42,9 @@ dependencies:
|
|
32
42
|
requirements:
|
33
43
|
- - ">="
|
34
44
|
- !ruby/object:Gem::Version
|
45
|
+
hash: 3
|
46
|
+
segments:
|
47
|
+
- 0
|
35
48
|
version: "0"
|
36
49
|
type: :development
|
37
50
|
version_requirements: *id002
|
@@ -43,6 +56,9 @@ dependencies:
|
|
43
56
|
requirements:
|
44
57
|
- - ">="
|
45
58
|
- !ruby/object:Gem::Version
|
59
|
+
hash: 3
|
60
|
+
segments:
|
61
|
+
- 0
|
46
62
|
version: "0"
|
47
63
|
type: :development
|
48
64
|
version_requirements: *id003
|
@@ -54,6 +70,11 @@ dependencies:
|
|
54
70
|
requirements:
|
55
71
|
- - ~>
|
56
72
|
- !ruby/object:Gem::Version
|
73
|
+
hash: 9
|
74
|
+
segments:
|
75
|
+
- 2
|
76
|
+
- 3
|
77
|
+
- 5
|
57
78
|
version: 2.3.5
|
58
79
|
type: :development
|
59
80
|
version_requirements: *id004
|
@@ -65,6 +86,13 @@ dependencies:
|
|
65
86
|
requirements:
|
66
87
|
- - ~>
|
67
88
|
- !ruby/object:Gem::Version
|
89
|
+
hash: 62196421
|
90
|
+
segments:
|
91
|
+
- 3
|
92
|
+
- 0
|
93
|
+
- 0
|
94
|
+
- beta
|
95
|
+
- 3
|
68
96
|
version: 3.0.0.beta3
|
69
97
|
type: :development
|
70
98
|
version_requirements: *id005
|
@@ -76,6 +104,9 @@ dependencies:
|
|
76
104
|
requirements:
|
77
105
|
- - ">="
|
78
106
|
- !ruby/object:Gem::Version
|
107
|
+
hash: 3
|
108
|
+
segments:
|
109
|
+
- 0
|
79
110
|
version: "0"
|
80
111
|
type: :development
|
81
112
|
version_requirements: *id006
|
@@ -87,6 +118,9 @@ dependencies:
|
|
87
118
|
requirements:
|
88
119
|
- - ">="
|
89
120
|
- !ruby/object:Gem::Version
|
121
|
+
hash: 3
|
122
|
+
segments:
|
123
|
+
- 0
|
90
124
|
version: "0"
|
91
125
|
type: :development
|
92
126
|
version_requirements: *id007
|
@@ -201,12 +235,20 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
201
235
|
requirements:
|
202
236
|
- - ">="
|
203
237
|
- !ruby/object:Gem::Version
|
238
|
+
hash: 3
|
239
|
+
segments:
|
240
|
+
- 0
|
204
241
|
version: "0"
|
205
242
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
206
243
|
none: false
|
207
244
|
requirements:
|
208
245
|
- - ">"
|
209
246
|
- !ruby/object:Gem::Version
|
247
|
+
hash: 25
|
248
|
+
segments:
|
249
|
+
- 1
|
250
|
+
- 3
|
251
|
+
- 1
|
210
252
|
version: 1.3.1
|
211
253
|
requirements: []
|
212
254
|
|