freeform 0.0.4 → 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +8 -17
- data/Gemfile +1 -1
- data/Gemfile.lock +150 -0
- data/MIT-LICENSE +20 -0
- data/README.md +31 -43
- data/Rakefile +32 -1
- data/freeform.gemspec +22 -15
- data/lib/freeform/builder/builder_mixin.rb +111 -0
- data/lib/freeform/builder/builders.rb +32 -0
- data/lib/freeform/builder/engine.rb +14 -0
- data/lib/freeform/builder/view_helper.rb +56 -0
- data/lib/freeform/form/form_input_key.rb +1 -1
- data/lib/freeform/form/nested.rb +17 -55
- data/lib/freeform/form/property.rb +82 -42
- data/lib/freeform/form/validation.rb +38 -11
- data/lib/freeform/form.rb +24 -27
- data/lib/freeform/version.rb +1 -1
- data/lib/freeform.rb +4 -0
- data/lib/generators/freeform/install_generator.rb +17 -0
- data/lib/tasks/freeform_tasks.rake +4 -0
- data/spec/acceptance_spec.rb +261 -155
- data/spec/builder/builder_spec.rb +215 -0
- data/spec/builder/view_helper_spec.rb +97 -0
- data/spec/dummy/README.rdoc +28 -0
- data/spec/dummy/Rakefile +6 -0
- data/spec/dummy/app/assets/images/.keep +0 -0
- data/spec/dummy/app/assets/javascripts/application.js +5 -0
- data/spec/dummy/app/assets/javascripts/jquery.js +9404 -0
- data/spec/dummy/app/assets/javascripts/jquery_events_test.js +19 -0
- data/spec/dummy/app/assets/javascripts/projects.js +2 -0
- data/spec/dummy/app/assets/javascripts/prototype.js +6082 -0
- data/spec/dummy/app/assets/javascripts/prototype_events_test.js +20 -0
- data/spec/dummy/app/assets/stylesheets/application.css +7 -0
- data/spec/dummy/app/assets/stylesheets/companies.css +4 -0
- data/spec/dummy/app/assets/stylesheets/projects.css +4 -0
- data/spec/dummy/app/controllers/application_controller.rb +3 -0
- data/spec/dummy/app/controllers/companies_controller.rb +5 -0
- data/spec/dummy/app/controllers/projects_controller.rb +11 -0
- data/spec/dummy/app/forms/milestone_form.rb +4 -0
- data/spec/dummy/app/forms/project_form.rb +11 -0
- data/spec/dummy/app/forms/task_form.rb +10 -0
- data/spec/dummy/app/helpers/application_helper.rb +2 -0
- data/spec/dummy/app/mailers/.keep +0 -0
- data/spec/dummy/app/models/.keep +0 -0
- data/spec/dummy/app/models/company.rb +5 -0
- data/spec/dummy/app/models/milestone.rb +6 -0
- data/spec/dummy/app/models/project.rb +9 -0
- data/spec/dummy/app/models/project_task.rb +3 -0
- data/spec/dummy/app/models/task.rb +7 -0
- data/spec/dummy/app/views/companies/new.html.erb +16 -0
- data/spec/dummy/app/views/layouts/application.html.erb +19 -0
- data/spec/dummy/app/views/projects/new.html.erb +13 -0
- data/spec/dummy/app/views/projects/without_intermediate_inputs.html.erb +11 -0
- data/spec/dummy/bin/bundle +3 -0
- data/spec/dummy/bin/rails +4 -0
- data/spec/dummy/bin/rake +4 -0
- data/spec/dummy/config/application.rb +35 -0
- data/spec/dummy/config/boot.rb +5 -0
- data/spec/dummy/config/database.yml +25 -0
- data/spec/dummy/config/environment.rb +5 -0
- data/spec/dummy/config/environments/development.rb +29 -0
- data/spec/dummy/config/environments/production.rb +80 -0
- data/spec/dummy/config/environments/test.rb +36 -0
- data/spec/dummy/config/initializers/backtrace_silencers.rb +7 -0
- data/spec/dummy/config/initializers/filter_parameter_logging.rb +4 -0
- data/spec/dummy/config/initializers/inflections.rb +16 -0
- data/spec/dummy/config/initializers/mime_types.rb +5 -0
- data/spec/dummy/config/initializers/secret_token.rb +13 -0
- data/spec/dummy/config/initializers/session_store.rb +3 -0
- data/spec/dummy/config/initializers/wrap_parameters.rb +14 -0
- data/spec/dummy/config/locales/en.yml +23 -0
- data/spec/dummy/config/routes.rb +5 -0
- data/spec/dummy/config.ru +4 -0
- data/spec/dummy/db/migrate/20110710143903_initial_tables.rb +38 -0
- data/spec/dummy/db/schema.rb +43 -0
- data/spec/dummy/db/test.sqlite3 +0 -0
- data/spec/dummy/lib/assets/.keep +0 -0
- data/spec/dummy/log/.keep +0 -0
- data/spec/dummy/log/development.log +0 -0
- data/spec/dummy/log/test.log +39736 -0
- data/spec/dummy/public/404.html +58 -0
- data/spec/dummy/public/422.html +58 -0
- data/spec/dummy/public/500.html +57 -0
- data/spec/dummy/public/favicon.ico +0 -0
- data/spec/dummy/tmp/cache/assets/C54/850/sprockets%2Fd484f47085686f151320ff7248bb5105 +0 -0
- data/spec/dummy/tmp/cache/assets/C76/160/sprockets%2F49c594d143212b346d11f1ecf9358103 +0 -0
- data/spec/dummy/tmp/cache/assets/C99/4D0/sprockets%2F5e30a6b911437f1428dc32c3ae182123 +0 -0
- data/spec/dummy/tmp/cache/assets/C99/7D0/sprockets%2F79513e6956e0ee8624976e041fd5636d +0 -0
- data/spec/dummy/tmp/cache/assets/CAA/C90/sprockets%2F1e6c8ee1258009385ccf5b84015424b3 +0 -0
- data/spec/dummy/tmp/cache/assets/CB2/CB0/sprockets%2F11cc8d161d71a716dd36f16849d90870 +0 -0
- data/spec/dummy/tmp/cache/assets/CB7/7F0/sprockets%2Fac97b043470f6fcc925c352f16956643 +0 -0
- data/spec/dummy/tmp/cache/assets/CBA/680/sprockets%2F912d84e091e5f2190b1ab7926de19679 +0 -0
- data/spec/dummy/tmp/cache/assets/CC7/430/sprockets%2F48e99a3e16ba3e65749e009d82546f94 +0 -0
- data/spec/dummy/tmp/cache/assets/CD8/370/sprockets%2F357970feca3ac29060c1e3861e2c0953 +0 -0
- data/spec/dummy/tmp/cache/assets/CDB/8A0/sprockets%2Faed2a2575c376263c26e93b56b57051d +0 -0
- data/spec/dummy/tmp/cache/assets/CF1/E80/sprockets%2F7735295e1e3085f2e1dc29d59a45e8e6 +0 -0
- data/spec/dummy/tmp/cache/assets/D0F/E60/sprockets%2F1123d9a479fdf5c2b8415087e2a43ec6 +0 -0
- data/spec/dummy/tmp/cache/assets/D1F/A10/sprockets%2F60317e62cb324bfd9987e8da9636fd06 +0 -0
- data/spec/dummy/tmp/cache/assets/D25/E20/sprockets%2F29ba1a4a2b611731334f54abb9e5b5d1 +0 -0
- data/spec/dummy/tmp/cache/assets/D32/A10/sprockets%2F13fe41fee1fe35b49d145bcc06610705 +0 -0
- data/spec/dummy/tmp/cache/assets/D35/760/sprockets%2F49e26620c5c743ac4cdab7703f54db06 +0 -0
- data/spec/dummy/tmp/cache/assets/D49/870/sprockets%2F90896142645585acc8baf56ad57e3afb +0 -0
- data/spec/dummy/tmp/cache/assets/D4E/1B0/sprockets%2Ff7cbd26ba1d28d48de824f0e94586655 +0 -0
- data/spec/dummy/tmp/cache/assets/D5A/EA0/sprockets%2Fd771ace226fc8215a3572e0aa35bb0d6 +0 -0
- data/spec/dummy/tmp/cache/assets/D62/F00/sprockets%2F6ac03a007f26b1c18ed3d53498ad3eb8 +0 -0
- data/spec/dummy/tmp/cache/assets/D79/BC0/sprockets%2F85a1db977361cc5130fcefb4637ff67e +0 -0
- data/spec/dummy/tmp/cache/assets/D87/1F0/sprockets%2F61c9ceafb877fb740c67416ff6f782a9 +0 -0
- data/spec/dummy/tmp/cache/assets/DA8/900/sprockets%2Fde7a2b3987b89b9d9afb268ce4204a4a +0 -0
- data/spec/dummy/tmp/cache/assets/DAD/4F0/sprockets%2F765acd1bf68dc90f7d3e61da78b1e659 +0 -0
- data/spec/dummy/tmp/cache/assets/DDC/400/sprockets%2Fcffd775d018f68ce5dba1ee0d951a994 +0 -0
- data/spec/dummy/tmp/cache/assets/E03/3F0/sprockets%2F82b37ae9eccec44c1ef44cfdd07d8534 +0 -0
- data/spec/dummy/tmp/cache/assets/E04/890/sprockets%2F2f5173deea6c795b8fdde723bb4b63af +0 -0
- data/spec/dummy/tmp/cache/assets/E0A/CA0/sprockets%2F7fe72ac1c0db1a7e8e7f59cf25e8a39e +0 -0
- data/spec/dummy/tmp/cache/assets/E20/9B0/sprockets%2F2fa6cd86b1af7bda41f5b7921cdadf10 +0 -0
- data/spec/dummy/tmp/cache/assets/E3A/A60/sprockets%2F7c72c96cfc66454caf5fc8ca0fedd4f3 +0 -0
- data/spec/dummy/tmp/cache/assets/E54/400/sprockets%2Fd0cbc16cc37efcf9dc41f242b5dbbf81 +0 -0
- data/spec/dummy/tmp/cache/assets/EB7/AB0/sprockets%2F801d29a5debdbfbfb4eef14d70d9bcdb +0 -0
- data/spec/dummy/tmp/cache/assets/F48/5E0/sprockets%2F26cd6ffcffbebbe2fd6cd1a8f0c2debc +0 -0
- data/spec/form/nested_spec.rb +75 -61
- data/spec/form/property_spec.rb +167 -14
- data/spec/form/validation_spec.rb +46 -23
- data/spec/javascript_spec.rb +60 -0
- data/spec/persistence_spec.rb +608 -0
- data/spec/spec_helper.rb +18 -2
- data/vendor/assets/javascripts/jquery_freeform.js +120 -0
- data/vendor/assets/javascripts/jquery_nested_form.js +0 -0
- data/vendor/assets/javascripts/prototype_freeform.js +69 -0
- data/vendor/assets/javascripts/prototype_nested_form.js +0 -0
- 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
|
-
|
8
|
-
end
|
23
|
+
config.mock_with :rspec
|
24
|
+
end
|