factory_girl 2.0.0.beta1 → 2.0.0.beta2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (63) hide show
  1. data/Appraisals +12 -0
  2. data/{CONTRIBUTION_GUIDELINES.rdoc → CONTRIBUTION_GUIDELINES.md} +3 -3
  3. data/GETTING_STARTED.md +246 -0
  4. data/Gemfile +12 -0
  5. data/Gemfile.lock +62 -0
  6. data/README.md +64 -0
  7. data/Rakefile +15 -30
  8. data/features/factory_girl_steps.feature +26 -0
  9. data/features/step_definitions/database_steps.rb +2 -0
  10. data/features/support/env.rb +0 -9
  11. data/features/support/factories.rb +15 -0
  12. data/features/support/test.db +0 -0
  13. data/lib/factory_girl.rb +2 -0
  14. data/lib/factory_girl/definition_proxy.rb +10 -43
  15. data/lib/factory_girl/factory.rb +48 -17
  16. data/lib/factory_girl/proxy.rb +3 -3
  17. data/lib/factory_girl/proxy/attributes_for.rb +1 -1
  18. data/lib/factory_girl/proxy/build.rb +3 -3
  19. data/lib/factory_girl/proxy/create.rb +6 -2
  20. data/lib/factory_girl/proxy/stub.rb +3 -3
  21. data/lib/factory_girl/registry.rb +59 -0
  22. data/lib/factory_girl/sequence.rb +23 -9
  23. data/lib/factory_girl/step_definitions.rb +16 -9
  24. data/lib/factory_girl/syntax/blueprint.rb +2 -2
  25. data/lib/factory_girl/syntax/default.rb +5 -3
  26. data/lib/factory_girl/syntax/generate.rb +6 -6
  27. data/lib/factory_girl/syntax/make.rb +2 -2
  28. data/lib/factory_girl/syntax/methods.rb +75 -0
  29. data/lib/factory_girl/syntax/sham.rb +2 -2
  30. data/lib/factory_girl/syntax/vintage.rb +16 -79
  31. data/lib/factory_girl/version.rb +1 -1
  32. data/spec/acceptance/acceptance_helper.rb +7 -12
  33. data/spec/acceptance/attribute_aliases_spec.rb +26 -0
  34. data/spec/acceptance/attributes_for_spec.rb +48 -0
  35. data/spec/acceptance/build_spec.rb +35 -0
  36. data/spec/acceptance/build_stubbed_spec.rb +79 -0
  37. data/spec/acceptance/callbacks_spec.rb +42 -0
  38. data/spec/acceptance/create_spec.rb +67 -0
  39. data/spec/acceptance/default_strategy_spec.rb +27 -0
  40. data/spec/acceptance/definition_spec.rb +28 -0
  41. data/spec/acceptance/parent_spec.rb +39 -0
  42. data/spec/acceptance/sequence_spec.rb +32 -0
  43. data/spec/acceptance/syntax/blueprint_spec.rb +7 -5
  44. data/spec/acceptance/syntax/generate_spec.rb +10 -4
  45. data/spec/acceptance/syntax/make_spec.rb +7 -4
  46. data/spec/acceptance/syntax/sham_spec.rb +15 -8
  47. data/spec/acceptance/syntax/vintage_spec.rb +57 -17
  48. data/spec/factory_girl/attribute/dynamic_spec.rb +1 -1
  49. data/spec/factory_girl/definition_proxy_spec.rb +13 -11
  50. data/spec/factory_girl/factory_spec.rb +29 -52
  51. data/spec/factory_girl/find_definitions_spec.rb +34 -23
  52. data/spec/factory_girl/proxy/attributes_for_spec.rb +6 -6
  53. data/spec/factory_girl/proxy/build_spec.rb +4 -4
  54. data/spec/factory_girl/proxy/create_spec.rb +11 -3
  55. data/spec/factory_girl/proxy/stub_spec.rb +6 -6
  56. data/spec/factory_girl/proxy_spec.rb +1 -1
  57. data/spec/factory_girl/registry_spec.rb +92 -0
  58. data/spec/factory_girl/sequence_spec.rb +65 -8
  59. data/spec/spec_helper.rb +75 -29
  60. metadata +66 -43
  61. data/README.rdoc +0 -282
  62. data/spec/acceptance/acceptance_spec.rb +0 -288
  63. data/spec/acceptance/models.rb +0 -48
@@ -1,288 +0,0 @@
1
- require 'spec_helper'
2
- require 'acceptance/acceptance_helper'
3
-
4
- describe "integration" do
5
- before do
6
- FactoryGirl.define do
7
- sequence :email do |n|
8
- "somebody#{n}@example.com"
9
- end
10
-
11
- factory :user, :class => 'user' do
12
- first_name 'Jimi'
13
- last_name 'Hendrix'
14
- admin false
15
- email { "#{first_name}.#{last_name}@example.com".downcase }
16
-
17
- aliased_as :author
18
- end
19
-
20
- factory Post, :default_strategy => :attributes_for do
21
- name 'Test Post'
22
- author
23
- end
24
-
25
- factory :admin, :class => User do
26
- first_name 'Ben'
27
- last_name 'Stein'
28
- admin true
29
- sequence(:username) { |n| "username#{n}" }
30
- email
31
- end
32
-
33
- factory :sequence_abuser, :class => User do
34
- first_name { Factory.sequence(:email) }
35
- end
36
-
37
- factory :guest, :parent => :user do
38
- last_name 'Anonymous'
39
- username 'GuestUser'
40
- end
41
-
42
- factory :user_with_callbacks, :parent => :user do
43
- after_stub {|u| u.first_name = 'Stubby' }
44
- after_build {|u| u.first_name = 'Buildy' }
45
- after_create {|u| u.last_name = 'Createy' }
46
- end
47
-
48
- factory :user_with_inherited_callbacks, :parent => :user_with_callbacks do
49
- after_stub {|u| u.last_name = 'Double-Stubby' }
50
- end
51
-
52
- factory :business do
53
- name 'Supplier of Awesome'
54
- association :owner, :factory => :user
55
- end
56
- end
57
- end
58
-
59
- describe "a generated attributes hash" do
60
- before do
61
- @attrs = Factory.attributes_for(:user, :first_name => 'Bill')
62
- end
63
-
64
- it "should assign all attributes" do
65
- expected_attrs = [:admin, :email, :first_name, :last_name]
66
- actual_attrs = @attrs.keys.sort {|a, b| a.to_s <=> b.to_s }
67
- actual_attrs.should == expected_attrs
68
- end
69
-
70
- it "should correctly assign lazy, dependent attributes" do
71
- @attrs[:email].should == "bill.hendrix@example.com"
72
- end
73
-
74
- it "should override attrbutes" do
75
- @attrs[:first_name].should == 'Bill'
76
- end
77
-
78
- it "should not assign associations" do
79
- Factory.attributes_for(:post)[:author].should be_nil
80
- end
81
- end
82
-
83
- describe "a built instance" do
84
- before do
85
- @instance = Factory.build(:post)
86
- end
87
-
88
- it "should not be saved" do
89
- @instance.should be_new_record
90
- end
91
-
92
- it "should assign associations" do
93
- @instance.author.should be_kind_of(User)
94
- end
95
-
96
- it "should save associations" do
97
- @instance.author.should_not be_new_record
98
- end
99
-
100
- it "should not assign both an association and its foreign key" do
101
- Factory.build(:post, :author_id => 1).author_id.should == 1
102
- end
103
- end
104
-
105
- describe "a created instance" do
106
- before do
107
- @instance = Factory.create('post')
108
- end
109
-
110
- it "should be saved" do
111
- @instance.should_not be_new_record
112
- end
113
-
114
- it "should assign associations" do
115
- @instance.author.should be_kind_of(User)
116
- end
117
-
118
- it "should save associations" do
119
- @instance.author.should_not be_new_record
120
- end
121
- end
122
-
123
- describe "a generated stub instance" do
124
- before do
125
- @stub = Factory.stub(:user, :first_name => 'Bill')
126
- end
127
-
128
- it "should assign all attributes" do
129
- [:admin, :email, :first_name, :last_name].each do |attr|
130
- @stub.send(attr).should_not be_nil
131
- end
132
- end
133
-
134
- it "should correctly assign attributes" do
135
- @stub.email.should == "bill.hendrix@example.com"
136
- end
137
-
138
- it "should override attributes" do
139
- @stub.first_name.should == 'Bill'
140
- end
141
-
142
- it "should assign associations" do
143
- Factory.stub(:post).author.should_not be_nil
144
- end
145
-
146
- it "should have an id" do
147
- @stub.id.should > 0
148
- end
149
-
150
- it "should have unique IDs" do
151
- @other_stub = Factory.stub(:user)
152
- @stub.id.should_not == @other_stub.id
153
- end
154
-
155
- it "should not be considered a new record" do
156
- @stub.should_not be_new_record
157
- end
158
-
159
- it "should raise exception if connection to the database is attempted" do
160
- lambda { @stub.connection }.should raise_error(RuntimeError)
161
- lambda { @stub.update_attribute(:first_name, "Nick") }.should raise_error(RuntimeError)
162
- lambda { @stub.reload }.should raise_error(RuntimeError)
163
- lambda { @stub.destroy }.should raise_error(RuntimeError)
164
- lambda { @stub.save }.should raise_error(RuntimeError)
165
- lambda { @stub.increment!(:age) }.should raise_error(RuntimeError)
166
- end
167
- end
168
-
169
- describe "an instance generated by a factory with a custom class name" do
170
- before do
171
- @instance = Factory.create(:admin)
172
- end
173
-
174
- it "should use the correct class name" do
175
- @instance.should be_kind_of(User)
176
- end
177
-
178
- it "should use the correct factory definition" do
179
- @instance.should be_admin
180
- end
181
- end
182
-
183
- describe "an instance generated by a factory that inherits from another factory" do
184
- before do
185
- @instance = Factory.create(:guest)
186
- end
187
-
188
- it "should use the class name of the parent factory" do
189
- @instance.should be_kind_of(User)
190
- end
191
-
192
- it "should have attributes of the parent" do
193
- @instance.first_name.should == 'Jimi'
194
- end
195
-
196
- it "should have attributes defined in the factory itself" do
197
- @instance.username.should == 'GuestUser'
198
- end
199
-
200
- it "should have attributes that have been overriden" do
201
- @instance.last_name.should == 'Anonymous'
202
- end
203
- end
204
-
205
- describe "an attribute generated by a sequence" do
206
- before do
207
- @email = Factory.attributes_for(:admin)[:email]
208
- end
209
-
210
- it "should match the correct format" do
211
- @email.should =~ /^somebody\d+@example\.com$/
212
- end
213
-
214
- describe "after the attribute has already been generated once" do
215
- before do
216
- @another_email = Factory.attributes_for(:admin)[:email]
217
- end
218
-
219
- it "should match the correct format" do
220
- @email.should =~ /^somebody\d+@example\.com$/
221
- end
222
-
223
- it "should not be the same as the first generated value" do
224
- @another_email.should_not == @email
225
- end
226
- end
227
- end
228
-
229
- describe "an attribute generated by an in-line sequence" do
230
- before do
231
- @username = Factory.attributes_for(:admin)[:username]
232
- end
233
-
234
- it "should match the correct format" do
235
- @username.should =~ /^username\d+$/
236
- end
237
-
238
- describe "after the attribute has already been generated once" do
239
- before do
240
- @another_username = Factory.attributes_for(:admin)[:username]
241
- end
242
-
243
- it "should match the correct format" do
244
- @username.should =~ /^username\d+$/
245
- end
246
-
247
- it "should not be the same as the first generated value" do
248
- @another_username.should_not == @username
249
- end
250
- end
251
- end
252
-
253
- describe "a factory with a default strategy specified" do
254
- it "should generate instances according to the strategy" do
255
- Factory(:post).should be_kind_of(Hash)
256
- end
257
- end
258
-
259
- it "should raise Factory::SequenceAbuseError" do
260
- lambda {
261
- Factory(:sequence_abuser)
262
- }.should raise_error(FactoryGirl::SequenceAbuseError)
263
- end
264
-
265
- describe "an instance with callbacks" do
266
- it "should run the after_stub callback when stubbing" do
267
- @user = Factory.stub(:user_with_callbacks)
268
- @user.first_name.should == 'Stubby'
269
- end
270
-
271
- it "should run the after_build callback when building" do
272
- @user = Factory.build(:user_with_callbacks)
273
- @user.first_name.should == 'Buildy'
274
- end
275
-
276
- it "should run both the after_build and after_create callbacks when creating" do
277
- @user = Factory(:user_with_callbacks)
278
- @user.first_name.should == 'Buildy'
279
- @user.last_name.should == 'Createy'
280
- end
281
-
282
- it "should run both the after_stub callback on the factory and the inherited after_stub callback" do
283
- @user = Factory.stub(:user_with_inherited_callbacks)
284
- @user.first_name.should == 'Stubby'
285
- @user.last_name.should == 'Double-Stubby'
286
- end
287
- end
288
- end
@@ -1,48 +0,0 @@
1
- ActiveRecord::Base.establish_connection(
2
- :adapter => 'sqlite3',
3
- :database => File.join(File.dirname(__FILE__), 'test.db')
4
- )
5
-
6
- class CreateSchema < ActiveRecord::Migration
7
- def self.up
8
- create_table :users, :force => true do |t|
9
- t.string :first_name
10
- t.string :last_name
11
- t.string :email
12
- t.string :username
13
- t.boolean :admin, :default => false
14
- end
15
-
16
- create_table :posts, :force => true do |t|
17
- t.string :name
18
- t.integer :author_id
19
- end
20
-
21
- create_table :business, :force => true do |t|
22
- t.string :name
23
- t.integer :owner_id
24
- end
25
- end
26
- end
27
-
28
- CreateSchema.suppress_messages { CreateSchema.migrate(:up) }
29
-
30
- class User < ActiveRecord::Base
31
- validates_presence_of :first_name, :last_name, :email
32
- has_many :posts, :foreign_key => 'author_id'
33
- end
34
-
35
- class Business < ActiveRecord::Base
36
- validates_presence_of :name, :owner_id
37
- belongs_to :owner, :class_name => 'User'
38
- end
39
-
40
- class Post < ActiveRecord::Base
41
- validates_presence_of :name, :author_id
42
- belongs_to :author, :class_name => 'User'
43
- end
44
-
45
- module Admin
46
- class Settings
47
- end
48
- end