freeform 0.0.4 → 1.0.0

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 (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