freeform 0.0.4 → 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (129) hide show
  1. data/.gitignore +8 -17
  2. data/Gemfile +1 -1
  3. data/Gemfile.lock +150 -0
  4. data/MIT-LICENSE +20 -0
  5. data/README.md +31 -43
  6. data/Rakefile +32 -1
  7. data/freeform.gemspec +22 -15
  8. data/lib/freeform/builder/builder_mixin.rb +111 -0
  9. data/lib/freeform/builder/builders.rb +32 -0
  10. data/lib/freeform/builder/engine.rb +14 -0
  11. data/lib/freeform/builder/view_helper.rb +56 -0
  12. data/lib/freeform/form/form_input_key.rb +1 -1
  13. data/lib/freeform/form/nested.rb +17 -55
  14. data/lib/freeform/form/property.rb +82 -42
  15. data/lib/freeform/form/validation.rb +38 -11
  16. data/lib/freeform/form.rb +24 -27
  17. data/lib/freeform/version.rb +1 -1
  18. data/lib/freeform.rb +4 -0
  19. data/lib/generators/freeform/install_generator.rb +17 -0
  20. data/lib/tasks/freeform_tasks.rake +4 -0
  21. data/spec/acceptance_spec.rb +261 -155
  22. data/spec/builder/builder_spec.rb +215 -0
  23. data/spec/builder/view_helper_spec.rb +97 -0
  24. data/spec/dummy/README.rdoc +28 -0
  25. data/spec/dummy/Rakefile +6 -0
  26. data/spec/dummy/app/assets/images/.keep +0 -0
  27. data/spec/dummy/app/assets/javascripts/application.js +5 -0
  28. data/spec/dummy/app/assets/javascripts/jquery.js +9404 -0
  29. data/spec/dummy/app/assets/javascripts/jquery_events_test.js +19 -0
  30. data/spec/dummy/app/assets/javascripts/projects.js +2 -0
  31. data/spec/dummy/app/assets/javascripts/prototype.js +6082 -0
  32. data/spec/dummy/app/assets/javascripts/prototype_events_test.js +20 -0
  33. data/spec/dummy/app/assets/stylesheets/application.css +7 -0
  34. data/spec/dummy/app/assets/stylesheets/companies.css +4 -0
  35. data/spec/dummy/app/assets/stylesheets/projects.css +4 -0
  36. data/spec/dummy/app/controllers/application_controller.rb +3 -0
  37. data/spec/dummy/app/controllers/companies_controller.rb +5 -0
  38. data/spec/dummy/app/controllers/projects_controller.rb +11 -0
  39. data/spec/dummy/app/forms/milestone_form.rb +4 -0
  40. data/spec/dummy/app/forms/project_form.rb +11 -0
  41. data/spec/dummy/app/forms/task_form.rb +10 -0
  42. data/spec/dummy/app/helpers/application_helper.rb +2 -0
  43. data/spec/dummy/app/mailers/.keep +0 -0
  44. data/spec/dummy/app/models/.keep +0 -0
  45. data/spec/dummy/app/models/company.rb +5 -0
  46. data/spec/dummy/app/models/milestone.rb +6 -0
  47. data/spec/dummy/app/models/project.rb +9 -0
  48. data/spec/dummy/app/models/project_task.rb +3 -0
  49. data/spec/dummy/app/models/task.rb +7 -0
  50. data/spec/dummy/app/views/companies/new.html.erb +16 -0
  51. data/spec/dummy/app/views/layouts/application.html.erb +19 -0
  52. data/spec/dummy/app/views/projects/new.html.erb +13 -0
  53. data/spec/dummy/app/views/projects/without_intermediate_inputs.html.erb +11 -0
  54. data/spec/dummy/bin/bundle +3 -0
  55. data/spec/dummy/bin/rails +4 -0
  56. data/spec/dummy/bin/rake +4 -0
  57. data/spec/dummy/config/application.rb +35 -0
  58. data/spec/dummy/config/boot.rb +5 -0
  59. data/spec/dummy/config/database.yml +25 -0
  60. data/spec/dummy/config/environment.rb +5 -0
  61. data/spec/dummy/config/environments/development.rb +29 -0
  62. data/spec/dummy/config/environments/production.rb +80 -0
  63. data/spec/dummy/config/environments/test.rb +36 -0
  64. data/spec/dummy/config/initializers/backtrace_silencers.rb +7 -0
  65. data/spec/dummy/config/initializers/filter_parameter_logging.rb +4 -0
  66. data/spec/dummy/config/initializers/inflections.rb +16 -0
  67. data/spec/dummy/config/initializers/mime_types.rb +5 -0
  68. data/spec/dummy/config/initializers/secret_token.rb +13 -0
  69. data/spec/dummy/config/initializers/session_store.rb +3 -0
  70. data/spec/dummy/config/initializers/wrap_parameters.rb +14 -0
  71. data/spec/dummy/config/locales/en.yml +23 -0
  72. data/spec/dummy/config/routes.rb +5 -0
  73. data/spec/dummy/config.ru +4 -0
  74. data/spec/dummy/db/migrate/20110710143903_initial_tables.rb +38 -0
  75. data/spec/dummy/db/schema.rb +43 -0
  76. data/spec/dummy/db/test.sqlite3 +0 -0
  77. data/spec/dummy/lib/assets/.keep +0 -0
  78. data/spec/dummy/log/.keep +0 -0
  79. data/spec/dummy/log/development.log +0 -0
  80. data/spec/dummy/log/test.log +39736 -0
  81. data/spec/dummy/public/404.html +58 -0
  82. data/spec/dummy/public/422.html +58 -0
  83. data/spec/dummy/public/500.html +57 -0
  84. data/spec/dummy/public/favicon.ico +0 -0
  85. data/spec/dummy/tmp/cache/assets/C54/850/sprockets%2Fd484f47085686f151320ff7248bb5105 +0 -0
  86. data/spec/dummy/tmp/cache/assets/C76/160/sprockets%2F49c594d143212b346d11f1ecf9358103 +0 -0
  87. data/spec/dummy/tmp/cache/assets/C99/4D0/sprockets%2F5e30a6b911437f1428dc32c3ae182123 +0 -0
  88. data/spec/dummy/tmp/cache/assets/C99/7D0/sprockets%2F79513e6956e0ee8624976e041fd5636d +0 -0
  89. data/spec/dummy/tmp/cache/assets/CAA/C90/sprockets%2F1e6c8ee1258009385ccf5b84015424b3 +0 -0
  90. data/spec/dummy/tmp/cache/assets/CB2/CB0/sprockets%2F11cc8d161d71a716dd36f16849d90870 +0 -0
  91. data/spec/dummy/tmp/cache/assets/CB7/7F0/sprockets%2Fac97b043470f6fcc925c352f16956643 +0 -0
  92. data/spec/dummy/tmp/cache/assets/CBA/680/sprockets%2F912d84e091e5f2190b1ab7926de19679 +0 -0
  93. data/spec/dummy/tmp/cache/assets/CC7/430/sprockets%2F48e99a3e16ba3e65749e009d82546f94 +0 -0
  94. data/spec/dummy/tmp/cache/assets/CD8/370/sprockets%2F357970feca3ac29060c1e3861e2c0953 +0 -0
  95. data/spec/dummy/tmp/cache/assets/CDB/8A0/sprockets%2Faed2a2575c376263c26e93b56b57051d +0 -0
  96. data/spec/dummy/tmp/cache/assets/CF1/E80/sprockets%2F7735295e1e3085f2e1dc29d59a45e8e6 +0 -0
  97. data/spec/dummy/tmp/cache/assets/D0F/E60/sprockets%2F1123d9a479fdf5c2b8415087e2a43ec6 +0 -0
  98. data/spec/dummy/tmp/cache/assets/D1F/A10/sprockets%2F60317e62cb324bfd9987e8da9636fd06 +0 -0
  99. data/spec/dummy/tmp/cache/assets/D25/E20/sprockets%2F29ba1a4a2b611731334f54abb9e5b5d1 +0 -0
  100. data/spec/dummy/tmp/cache/assets/D32/A10/sprockets%2F13fe41fee1fe35b49d145bcc06610705 +0 -0
  101. data/spec/dummy/tmp/cache/assets/D35/760/sprockets%2F49e26620c5c743ac4cdab7703f54db06 +0 -0
  102. data/spec/dummy/tmp/cache/assets/D49/870/sprockets%2F90896142645585acc8baf56ad57e3afb +0 -0
  103. data/spec/dummy/tmp/cache/assets/D4E/1B0/sprockets%2Ff7cbd26ba1d28d48de824f0e94586655 +0 -0
  104. data/spec/dummy/tmp/cache/assets/D5A/EA0/sprockets%2Fd771ace226fc8215a3572e0aa35bb0d6 +0 -0
  105. data/spec/dummy/tmp/cache/assets/D62/F00/sprockets%2F6ac03a007f26b1c18ed3d53498ad3eb8 +0 -0
  106. data/spec/dummy/tmp/cache/assets/D79/BC0/sprockets%2F85a1db977361cc5130fcefb4637ff67e +0 -0
  107. data/spec/dummy/tmp/cache/assets/D87/1F0/sprockets%2F61c9ceafb877fb740c67416ff6f782a9 +0 -0
  108. data/spec/dummy/tmp/cache/assets/DA8/900/sprockets%2Fde7a2b3987b89b9d9afb268ce4204a4a +0 -0
  109. data/spec/dummy/tmp/cache/assets/DAD/4F0/sprockets%2F765acd1bf68dc90f7d3e61da78b1e659 +0 -0
  110. data/spec/dummy/tmp/cache/assets/DDC/400/sprockets%2Fcffd775d018f68ce5dba1ee0d951a994 +0 -0
  111. data/spec/dummy/tmp/cache/assets/E03/3F0/sprockets%2F82b37ae9eccec44c1ef44cfdd07d8534 +0 -0
  112. data/spec/dummy/tmp/cache/assets/E04/890/sprockets%2F2f5173deea6c795b8fdde723bb4b63af +0 -0
  113. data/spec/dummy/tmp/cache/assets/E0A/CA0/sprockets%2F7fe72ac1c0db1a7e8e7f59cf25e8a39e +0 -0
  114. data/spec/dummy/tmp/cache/assets/E20/9B0/sprockets%2F2fa6cd86b1af7bda41f5b7921cdadf10 +0 -0
  115. data/spec/dummy/tmp/cache/assets/E3A/A60/sprockets%2F7c72c96cfc66454caf5fc8ca0fedd4f3 +0 -0
  116. data/spec/dummy/tmp/cache/assets/E54/400/sprockets%2Fd0cbc16cc37efcf9dc41f242b5dbbf81 +0 -0
  117. data/spec/dummy/tmp/cache/assets/EB7/AB0/sprockets%2F801d29a5debdbfbfb4eef14d70d9bcdb +0 -0
  118. data/spec/dummy/tmp/cache/assets/F48/5E0/sprockets%2F26cd6ffcffbebbe2fd6cd1a8f0c2debc +0 -0
  119. data/spec/form/nested_spec.rb +75 -61
  120. data/spec/form/property_spec.rb +167 -14
  121. data/spec/form/validation_spec.rb +46 -23
  122. data/spec/javascript_spec.rb +60 -0
  123. data/spec/persistence_spec.rb +608 -0
  124. data/spec/spec_helper.rb +18 -2
  125. data/vendor/assets/javascripts/jquery_freeform.js +120 -0
  126. data/vendor/assets/javascripts/jquery_nested_form.js +0 -0
  127. data/vendor/assets/javascripts/prototype_freeform.js +69 -0
  128. data/vendor/assets/javascripts/prototype_nested_form.js +0 -0
  129. metadata +341 -3
@@ -0,0 +1,608 @@
1
+ require 'spec_helper'
2
+
3
+ describe FreeForm::Form do
4
+ let!(:task_class) do
5
+ klass = Class.new(FreeForm::Form) do
6
+ form_input_key :task
7
+ form_model :task
8
+ validate_models
9
+ allow_destroy_on_save
10
+
11
+ property :name, :on => :task
12
+ property :start_date, :on => :task
13
+ property :end_date, :on => :task
14
+ end
15
+ # This wrapper just avoids CONST warnings
16
+ v, $VERBOSE = $VERBOSE, nil
17
+ Module.const_set("TaskForm", klass)
18
+ $VERBOSE = v
19
+ klass
20
+ end
21
+
22
+ let(:form_class) do
23
+ klass = Class.new(FreeForm::Form) do
24
+ form_input_key :company
25
+ form_models :company
26
+ child_model :project do
27
+ company.project.present? ? company.project : company.build_project
28
+ end
29
+ validate_models
30
+ allow_destroy_on_save
31
+
32
+ property :name, :on => :company, :as => :company_name
33
+ property :name, :on => :project, :as => :project_name
34
+ property :due_date, :on => :project
35
+
36
+ has_many :tasks, :class => Module::TaskForm, :default_initializer => :default_task_initializer
37
+
38
+ def default_task_initializer
39
+ { :task => project.tasks.build }
40
+ end
41
+ end
42
+ # This wrapper just avoids CONST warnings
43
+ v, $VERBOSE = $VERBOSE, nil
44
+ Module.const_set("AcceptanceForm", klass)
45
+ $VERBOSE = v
46
+ klass
47
+ end
48
+
49
+ let(:company) { Company.create!(:name => "Demo Corporation") }
50
+ let(:project) { Project.create!(:company => company, :name => "Widget", :due_date => Date.new(2014, 1, 1)) }
51
+ let(:task_1) { Task.create!(:project => project, :name => "Task 1", :start_date => Date.new(2014, 2, 2), :end_date => Date.new(2014, 3, 3)) }
52
+ let(:task_2) { Task.create!(:project => project, :name => "Task 2", :start_date => Date.new(2014, 9, 1), :end_date => Date.new(2014, 10, 1)) }
53
+
54
+ let(:form) do
55
+ f = form_class.new( :company => company )
56
+ company.project.tasks.each do |task|
57
+ f.build_task(:task => task)
58
+ end
59
+ f
60
+ end
61
+
62
+ before(:each) do
63
+ company.reload
64
+ project.reload
65
+ task_1.reload
66
+ task_2.reload
67
+ end
68
+
69
+ describe "form initialization", :initialization => true do
70
+ it "initializes with Company model" do
71
+ form.company.should eq(company)
72
+ end
73
+
74
+ it "initializes with Project model" do
75
+ form.project.should eq(project)
76
+ end
77
+
78
+ it "initializes with Task model" do
79
+ form.tasks.first.task.should eq(task_1)
80
+ end
81
+
82
+ it "initializes with Task with project parent" do
83
+ task = form.tasks.first.task
84
+ task.project.should eq(form.project)
85
+ end
86
+ end
87
+
88
+ describe "building nested models", :nested_models => true do
89
+ it "can build multiple tasks" do
90
+ form.tasks.count.should eq(2)
91
+ form.build_task
92
+ form.tasks.count.should eq(3)
93
+ end
94
+
95
+ it "build new models for each task" do
96
+ form.build_task
97
+ task_1 = form.tasks.first.task
98
+ task_2 = form.tasks.last.task
99
+ task_1.should_not eq(task_2)
100
+ end
101
+
102
+ it "builds new tasks with project parent" do
103
+ form.build_task
104
+ task_1 = form.tasks.first.task
105
+ task_2 = form.tasks.last.task
106
+ task_1.project.should eq(task_2.project)
107
+ end
108
+ end
109
+
110
+ describe "assigning parameters", :assign_params => true do
111
+ let(:attributes) do {
112
+ :company_name => "dummycorp",
113
+ :project_name => "railsapp",
114
+ "due_date(1i)" => "2014",
115
+ "due_date(2i)" => "10",
116
+ "due_date(3i)" => "30",
117
+ :tasks_attributes => {
118
+ "0" => {
119
+ :name => "task_1",
120
+ "start_date(1i)" => "2012",
121
+ "start_date(2i)" => "1",
122
+ "start_date(3i)" => "2",
123
+ },
124
+ "1" => {
125
+ :name => "task_2",
126
+ "end_date(1i)" => "2011",
127
+ "end_date(2i)" => "12",
128
+ "end_date(3i)" => "15",
129
+ }
130
+ } }
131
+ end
132
+
133
+ before(:each) do
134
+ form.fill(attributes)
135
+ end
136
+
137
+ it "assigns company name" do
138
+ form.company_name.should eq("dummycorp")
139
+ form.company.name.should eq("dummycorp")
140
+ end
141
+
142
+ it "assigns project name" do
143
+ form.project_name.should eq("railsapp")
144
+ form.project.name.should eq("railsapp")
145
+ end
146
+
147
+ it "assigns project due date" do
148
+ form.due_date.should eq(Date.new(2014, 10, 30))
149
+ form.project.due_date.should eq(Date.new(2014, 10, 30))
150
+ end
151
+
152
+ it "builds new task automatically" do
153
+ form.tasks.count.should eq(2)
154
+ end
155
+
156
+ it "assigns first task name" do
157
+ form.tasks.first.task.name.should eq("task_1")
158
+ end
159
+
160
+ it "assigns first task start_date" do
161
+ form.tasks.first.task.start_date.should eq(Date.new(2012, 1, 2))
162
+ end
163
+
164
+ it "assigns second task name" do
165
+ form.tasks.last.task.name.should eq("task_2")
166
+ end
167
+
168
+ it "assigns second task end_date" do
169
+ form.tasks.last.task.end_date.should eq(Date.new(2011, 12, 15))
170
+ end
171
+ end
172
+
173
+ describe "validations", :validations => true do
174
+ context "with invalid attributes" do
175
+ let(:attributes) do {
176
+ :company_name => "dummycorp",
177
+ :project_name => nil,
178
+ "due_date(1i)" => "2014",
179
+ "due_date(2i)" => "10",
180
+ "due_date(3i)" => "30",
181
+ :tasks_attributes => {
182
+ "0" => {
183
+ :name => "task_1",
184
+ "start_date(1i)" => "2012",
185
+ "start_date(2i)" => "1",
186
+ "start_date(3i)" => "2",
187
+ },
188
+ "1" => {
189
+ :name => "task_2",
190
+ "end_date(1i)" => "2011",
191
+ "end_date(2i)" => "12",
192
+ "end_date(3i)" => "15",
193
+ }
194
+ } }
195
+ end
196
+
197
+ before(:each) do
198
+ form.fill(attributes)
199
+ form.valid?
200
+ end
201
+
202
+ it "should be invalid" do
203
+ form.should_not be_valid
204
+ end
205
+
206
+ it "should have errors on project name" do
207
+ form.errors[:project_name].should eq(["can't be blank"])
208
+ end
209
+
210
+ it "should not have errors on last tasks's start_date" do
211
+ form.tasks.last.errors[:start_date].should be_empty
212
+ end
213
+ end
214
+
215
+ context "with invalid nested model only" do
216
+ let(:attributes) do {
217
+ :company_name => "dummycorp",
218
+ :project_name => "rails app",
219
+ "due_date(1i)" => "2014",
220
+ "due_date(2i)" => "10",
221
+ "due_date(3i)" => "30",
222
+ :tasks_attributes => {
223
+ "0" => {
224
+ :name => "task_1",
225
+ "start_date(1i)" => nil,
226
+ "start_date(2i)" => nil,
227
+ "start_date(3i)" => nil,
228
+ },
229
+ "1" => {
230
+ :name => "task_2",
231
+ "end_date(1i)" => "2011",
232
+ "end_date(2i)" => "12",
233
+ "end_date(3i)" => "15",
234
+ }
235
+ } }
236
+ end
237
+
238
+ before(:each) do
239
+ form.fill(attributes)
240
+ form.valid?
241
+ end
242
+
243
+ it "should be invalid" do
244
+ form.should_not be_valid
245
+ end
246
+
247
+ it "should have errors on first tasks's start_date" do
248
+ form.tasks.first.errors[:start_date].should eq(["can't be blank"])
249
+ end
250
+ end
251
+
252
+ context "with valid attributes" do
253
+ let(:attributes) do {
254
+ :company_name => "dummycorp",
255
+ :project_name => "railsapp",
256
+ "due_date(1i)" => "2014",
257
+ "due_date(2i)" => "10",
258
+ "due_date(3i)" => "30",
259
+ :tasks_attributes => {
260
+ "0" => {
261
+ :name => "task_1",
262
+ "start_date(1i)" => "2012",
263
+ "start_date(2i)" => "1",
264
+ "start_date(3i)" => "2",
265
+ },
266
+ "1" => {
267
+ :name => "task_2",
268
+ "start_date(1i)" => "2011",
269
+ "start_date(2i)" => "8",
270
+ "start_date(3i)" => "15",
271
+ "end_date(1i)" => "2011",
272
+ "end_date(2i)" => "12",
273
+ "end_date(3i)" => "15",
274
+ }
275
+ } }
276
+ end
277
+
278
+ before(:each) do
279
+ form.fill(attributes)
280
+ end
281
+
282
+ it "should be valid" do
283
+ form.should be_valid
284
+ end
285
+ end
286
+ end
287
+
288
+ describe "saving and destroying", :saving => true do
289
+ context "with invalid attributes" do
290
+ let(:attributes) do {
291
+ :company_name => "dummycorp",
292
+ :project_name => nil,
293
+ "due_date(1i)" => "2014",
294
+ "due_date(2i)" => "10",
295
+ "due_date(3i)" => "30",
296
+ :tasks_attributes => {
297
+ "0" => {
298
+ :name => "task_1",
299
+ "start_date(1i)" => "2012",
300
+ "start_date(2i)" => "1",
301
+ "start_date(3i)" => "2",
302
+ },
303
+ "1" => {
304
+ :name => "task_2",
305
+ "end_date(1i)" => "2011",
306
+ "end_date(2i)" => "12",
307
+ "end_date(3i)" => "15",
308
+ }
309
+ } }
310
+ end
311
+
312
+ before(:each) do
313
+ form.fill(attributes)
314
+ end
315
+
316
+ it "should return false on 'save'" do
317
+ form.save.should be_false
318
+ end
319
+
320
+ it "should raise error on 'save!'" do
321
+ expect{ form.save!.should be_false }.to raise_error(FreeForm::FormInvalid)
322
+ end
323
+ end
324
+
325
+ context "with valid attributes" do
326
+ let(:attributes) do {
327
+ :company_name => "dummycorp",
328
+ :project_name => "railsapp",
329
+ "due_date(1i)" => "2014",
330
+ "due_date(2i)" => "10",
331
+ "due_date(3i)" => "30",
332
+ :tasks_attributes => {
333
+ "0" => {
334
+ :name => "new_task_1",
335
+ "start_date(1i)" => "2012",
336
+ "start_date(2i)" => "1",
337
+ "start_date(3i)" => "2",
338
+ },
339
+ "1" => {
340
+ :name => "new_task_2",
341
+ "start_date(1i)" => "2011",
342
+ "start_date(2i)" => "8",
343
+ "start_date(3i)" => "15",
344
+ "end_date(1i)" => "2011",
345
+ "end_date(2i)" => "12",
346
+ "end_date(3i)" => "15",
347
+ }
348
+ } }
349
+ end
350
+
351
+ before(:each) do
352
+ form.fill(attributes)
353
+ end
354
+
355
+ describe "save", :save => true do
356
+ describe "without destroy" do
357
+ it "should return true on 'save', and call save on other models" do
358
+ form.company.should_receive(:save).and_return(true)
359
+ form.project.should_receive(:save).and_return(true)
360
+ form.tasks.first.task.should_receive(:save).and_return(true)
361
+ form.tasks.last.task.should_receive(:save).and_return(true)
362
+ form.save
363
+ end
364
+
365
+ describe "value assignment and persistence" do
366
+ before(:each) { form.save }
367
+
368
+ it "assign company values" do
369
+ company.reload
370
+ company.name.should eq("dummycorp")
371
+ end
372
+
373
+ it "assigns project values" do
374
+ project.reload
375
+ project.name.should eq("railsapp")
376
+ project.due_date.should eq(Date.new(2014, 10, 30))
377
+ end
378
+
379
+ it "assigns task_1 values" do
380
+ task_1.reload
381
+ task_1.name.should eq("new_task_1")
382
+ task_1.start_date.should eq(Date.new(2012, 1, 2))
383
+ task_1.end_date.should eq(Date.new(2014, 3, 3))
384
+ end
385
+
386
+ it "assigns task_1 values" do
387
+ task_2.reload
388
+ task_2.name.should eq("new_task_2")
389
+ task_2.start_date.should eq(Date.new(2011, 8, 15))
390
+ task_2.end_date.should eq(Date.new(2011, 12, 15))
391
+ end
392
+ end
393
+ end
394
+
395
+ describe "with destroy" do
396
+ it "destroys models on save if set" do
397
+ form._destroy = true
398
+ form.company.should_receive(:destroy).and_return(true)
399
+ form.project.should_receive(:destroy).and_return(true)
400
+ form.tasks.first.task.should_receive(:save).and_return(true)
401
+ form.tasks.last.task.should_receive(:save).and_return(true)
402
+ form.save
403
+ end
404
+
405
+ it "destroys models on save if set through attribute" do
406
+ form.fill({:_destroy => "1"})
407
+ form.company.should_receive(:destroy).and_return(true)
408
+ form.project.should_receive(:destroy).and_return(true)
409
+ form.tasks.first.task.should_receive(:save).and_return(true)
410
+ form.tasks.last.task.should_receive(:save).and_return(true)
411
+ form.save
412
+ end
413
+
414
+ describe "value assignment and persistence" do
415
+ before(:each) { form._destroy = true }
416
+ before(:each) { form.save }
417
+
418
+ it "destroys company" do
419
+ expect { company.reload }.to raise_error
420
+ end
421
+
422
+ it "destroys project" do
423
+ expect { project.reload }.to raise_error
424
+ end
425
+
426
+ it "assigns task_1 values" do
427
+ task_1.reload
428
+ task_1.name.should eq("new_task_1")
429
+ task_1.start_date.should eq(Date.new(2012, 1, 2))
430
+ task_1.end_date.should eq(Date.new(2014, 3, 3))
431
+ end
432
+
433
+ it "assigns task_1 values" do
434
+ task_2.reload
435
+ task_2.name.should eq("new_task_2")
436
+ task_2.start_date.should eq(Date.new(2011, 8, 15))
437
+ task_2.end_date.should eq(Date.new(2011, 12, 15))
438
+ end
439
+ end
440
+ end
441
+
442
+ describe "with nested destroy" do
443
+ before(:each) { form.tasks.first._destroy = true }
444
+
445
+ it "destroys nested models on save if set" do
446
+ form.company.should_receive(:save).and_return(true)
447
+ form.project.should_receive(:save).and_return(true)
448
+ form.tasks.first.task.should_receive(:destroy).and_return(true)
449
+ form.tasks.last.task.should_receive(:save).and_return(true)
450
+ form.save
451
+ end
452
+
453
+ describe "value assignment and persistence" do
454
+ before(:each) { form.save }
455
+
456
+ it "assign company values" do
457
+ company.reload
458
+ company.name.should eq("dummycorp")
459
+ end
460
+
461
+ it "assigns project values" do
462
+ project.reload
463
+ project.name.should eq("railsapp")
464
+ project.due_date.should eq(Date.new(2014, 10, 30))
465
+ end
466
+
467
+ it "destroys task_1" do
468
+ expect { task_1.reload }.to raise_error
469
+ end
470
+
471
+ it "assigns task_1 values" do
472
+ task_2.reload
473
+ task_2.name.should eq("new_task_2")
474
+ task_2.start_date.should eq(Date.new(2011, 8, 15))
475
+ task_2.end_date.should eq(Date.new(2011, 12, 15))
476
+ end
477
+ end
478
+ end
479
+ end
480
+
481
+ describe "save!", :save! => true do
482
+ describe "without destroy" do
483
+ it "should return true on 'save!', and call save! on other models" do
484
+ form.company.should_receive(:save!).and_return(true)
485
+ form.project.should_receive(:save!).and_return(true)
486
+ form.tasks.first.task.should_receive(:save!).and_return(true)
487
+ form.tasks.last.task.should_receive(:save!).and_return(true)
488
+ form.save!
489
+ end
490
+
491
+ describe "value assignment and persistence" do
492
+ before(:each) { form.save! }
493
+
494
+ it "assign company values" do
495
+ company.reload
496
+ company.name.should eq("dummycorp")
497
+ end
498
+
499
+ it "assigns project values" do
500
+ project.reload
501
+ project.name.should eq("railsapp")
502
+ project.due_date.should eq(Date.new(2014, 10, 30))
503
+ end
504
+
505
+ it "assigns task_1 values" do
506
+ task_1.reload
507
+ task_1.name.should eq("new_task_1")
508
+ task_1.start_date.should eq(Date.new(2012, 1, 2))
509
+ task_1.end_date.should eq(Date.new(2014, 3, 3))
510
+ end
511
+
512
+ it "assigns task_1 values" do
513
+ task_2.reload
514
+ task_2.name.should eq("new_task_2")
515
+ task_2.start_date.should eq(Date.new(2011, 8, 15))
516
+ task_2.end_date.should eq(Date.new(2011, 12, 15))
517
+ end
518
+ end
519
+ end
520
+
521
+ describe "with destroy" do
522
+ it "destroys models on save! if set" do
523
+ form._destroy = true
524
+ form.company.should_receive(:destroy).and_return(true)
525
+ form.project.should_receive(:destroy).and_return(true)
526
+ form.tasks.first.task.should_receive(:save!).and_return(true)
527
+ form.tasks.last.task.should_receive(:save!).and_return(true)
528
+ form.save!
529
+ end
530
+
531
+ it "destroys models on save! if set" do
532
+ form.fill({:_destroy => "1"})
533
+ form.company.should_receive(:destroy).and_return(true)
534
+ form.project.should_receive(:destroy).and_return(true)
535
+ form.tasks.first.task.should_receive(:save!).and_return(true)
536
+ form.tasks.last.task.should_receive(:save!).and_return(true)
537
+ form.save!
538
+ end
539
+
540
+ describe "value assignment and persistence" do
541
+ before(:each) { form._destroy = true }
542
+ before(:each) { form.save! }
543
+
544
+ it "destroys company" do
545
+ expect { company.reload }.to raise_error
546
+ end
547
+
548
+ it "destroys project" do
549
+ expect { project.reload }.to raise_error
550
+ end
551
+
552
+ it "assigns task_1 values" do
553
+ task_1.reload
554
+ task_1.name.should eq("new_task_1")
555
+ task_1.start_date.should eq(Date.new(2012, 1, 2))
556
+ task_1.end_date.should eq(Date.new(2014, 3, 3))
557
+ end
558
+
559
+ it "assigns task_1 values" do
560
+ task_2.reload
561
+ task_2.name.should eq("new_task_2")
562
+ task_2.start_date.should eq(Date.new(2011, 8, 15))
563
+ task_2.end_date.should eq(Date.new(2011, 12, 15))
564
+ end
565
+ end
566
+ end
567
+
568
+ describe "with nested destroy" do
569
+ it "destroys nested models on save! if set" do
570
+ form.tasks.last._destroy = true
571
+ form.company.should_receive(:save!).and_return(true)
572
+ form.project.should_receive(:save!).and_return(true)
573
+ form.tasks.first.task.should_receive(:save!).and_return(true)
574
+ form.tasks.last.task.should_receive(:destroy).and_return(true)
575
+ form.save!
576
+ end
577
+
578
+ describe "value assignment and persistence" do
579
+ before(:each) { form.tasks.first._destroy = true }
580
+ before(:each) { form.save! }
581
+
582
+ it "assign company values" do
583
+ company.reload
584
+ company.name.should eq("dummycorp")
585
+ end
586
+
587
+ it "assigns project values" do
588
+ project.reload
589
+ project.name.should eq("railsapp")
590
+ project.due_date.should eq(Date.new(2014, 10, 30))
591
+ end
592
+
593
+ it "destroys task_1" do
594
+ expect { task_1.reload }.to raise_error
595
+ end
596
+
597
+ it "assigns task_1 values" do
598
+ task_2.reload
599
+ task_2.name.should eq("new_task_2")
600
+ task_2.start_date.should eq(Date.new(2011, 8, 15))
601
+ task_2.end_date.should eq(Date.new(2011, 12, 15))
602
+ end
603
+ end
604
+ end
605
+ end
606
+ end
607
+ end
608
+ end
data/spec/spec_helper.rb CHANGED
@@ -1,8 +1,24 @@
1
+ # Configure Rails Environment
2
+ ENV["RAILS_ENV"] = "test"
3
+
4
+ require File.expand_path("../dummy/config/environment.rb", __FILE__)
1
5
  require 'rubygems'
2
6
  require 'bundler/setup'
3
7
  require 'freeform'
8
+ require 'freeform/builder/builders'
9
+ require 'freeform/builder/view_helper'
4
10
  require 'active_model'
11
+ require 'rails/all'
12
+ require 'rspec/rails'
13
+ require 'capybara/rspec'
14
+
15
+ spec = Gem::Specification.find_by_name("freeform")
16
+ gem_root = spec.gem_dir
17
+ Dir[("#{gem_root}/spec/support/**/*.rb")].each {|f| require f}
18
+
19
+ Rails.backtrace_cleaner.remove_silencers!
5
20
 
21
+ Capybara.javascript_driver = :selenium
6
22
  RSpec.configure do |config|
7
- # some (optional) config here
8
- end
23
+ config.mock_with :rspec
24
+ end