noodall-form-builder 0.4.2 → 0.5.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.
- data/Gemfile +12 -11
- data/README.rdoc +23 -2
- data/app/assets/javascripts/admin/formbuilder.js +1 -1
- data/app/controllers/noodall/admin/form_responses_controller.rb +6 -6
- data/app/helpers/forms_helper.rb +3 -7
- data/app/models/noodall/date_field.rb +5 -0
- data/app/models/noodall/field.rb +3 -2
- data/app/models/noodall/form.rb +9 -1
- data/app/models/noodall/form_response.rb +19 -39
- data/app/views/form_mailer/_form_response_fields.html.erb +1 -1
- data/app/views/noodall/admin/fields/_date_field.html.erb +14 -0
- data/app/views/noodall/admin/fields/_field.html.erb +0 -0
- data/app/views/noodall/admin/form_responses/index.html.erb +1 -1
- data/app/views/noodall/admin/forms/_field_select.html.erb +1 -0
- data/app/views/noodall/admin/forms/show.html.erb +3 -0
- data/app/views/noodall/form_responses/_form.html.erb +1 -0
- data/app/views/noodall/form_responses/fields/_datefield.html.erb +6 -0
- data/features/form_builder.feature +6 -5
- data/features/form_module.feature +1 -0
- data/features/step_definitions/cms_node_steps.rb +6 -6
- data/features/step_definitions/component_steps.rb +4 -4
- data/features/step_definitions/form_builder_steps.rb +17 -15
- data/features/step_definitions/web_steps.rb +6 -6
- data/features/support/env.rb +3 -2
- data/features/support/mm_factory_steps.rb +11 -9
- data/lib/noodall/form_builder/version.rb +1 -1
- data/script/cucumber +10 -0
- data/script/rails +6 -0
- data/spec/factories/field.rb +2 -0
- data/spec/factories/form.rb +9 -4
- data/spec/models/form_spec.rb +34 -0
- data/spec/spec_helper.rb +7 -2
- metadata +14 -8
- data/spec/noodall_form_builder_spec.rb +0 -7
data/Gemfile
CHANGED
@@ -1,24 +1,25 @@
|
|
1
1
|
source :rubygems
|
2
|
-
|
2
|
+
source "http://gems.github.com"
|
3
3
|
gemspec
|
4
4
|
|
5
|
-
gem 'mm-versionable', '0.2.5'
|
6
5
|
gem 'rails', '3.1.3'
|
7
6
|
gem 'noodall-ui'
|
8
|
-
gem 'capybara', '>= 0.3.9'
|
9
|
-
gem 'rspec-rails', '>= 2.0.0.beta'
|
10
|
-
gem 'database_cleaner'
|
11
|
-
gem 'cucumber-rails'
|
12
|
-
gem 'launchy' # So you can do Then show me the page
|
13
|
-
gem 'rmagick', :require => 'RMagick'
|
14
7
|
gem 'dragonfly', '~> 0.7.6'
|
15
|
-
gem 'factory_girl', '~> 1.3.2'
|
16
|
-
gem 'faker', '~> 0.3.1'
|
17
8
|
gem 'defensio'
|
18
|
-
gem 'email_spec'
|
19
9
|
gem 'fastercsv'
|
20
10
|
gem 'bson_ext'
|
21
11
|
|
12
|
+
group :test do
|
13
|
+
gem 'email_spec'
|
14
|
+
gem 'cucumber-rails'
|
15
|
+
gem 'rspec-rails', '>= 2.0.0.beta'
|
16
|
+
gem 'factory_girl_rails'
|
17
|
+
gem 'faker', '~> 0.3.1'
|
18
|
+
gem 'capybara', '>= 0.3.9'
|
19
|
+
gem 'database_cleaner'
|
20
|
+
gem 'launchy' # So you can do Then show me the page
|
21
|
+
end
|
22
|
+
|
22
23
|
if RUBY_VERSION < '1.9'
|
23
24
|
gem 'system_timer'
|
24
25
|
gem "ruby-debug", ">= 0.10.3"
|
data/README.rdoc
CHANGED
@@ -1,3 +1,24 @@
|
|
1
|
-
= Noodall
|
1
|
+
= Noodall Form Builder
|
2
2
|
|
3
|
-
|
3
|
+
Form building for Noodall
|
4
|
+
|
5
|
+
== Getting Started
|
6
|
+
|
7
|
+
Add to Gemfile
|
8
|
+
|
9
|
+
gem 'noodall-form-builder'
|
10
|
+
|
11
|
+
Install the gem
|
12
|
+
|
13
|
+
bundle install
|
14
|
+
|
15
|
+
Add the Form Builder routes to config/routes.rb
|
16
|
+
|
17
|
+
require 'noodall/form_builder/routes'
|
18
|
+
Noodall::FormBuilder::Routes.draw <AppNameConstantGoesHere>::Application
|
19
|
+
|
20
|
+
Add ContactForm to required slots in config/initializers/noodall.rb
|
21
|
+
|
22
|
+
Noodall::Node.slot :large, ContactForm
|
23
|
+
|
24
|
+
This project rocks and uses MIT-LICENSE.
|
@@ -1,5 +1,5 @@
|
|
1
1
|
function new_form_field(type) {
|
2
|
-
if ($.inArray(type, ['text_field', 'select', 'multiselect', 'radio', 'check_box']) == -1) {
|
2
|
+
if ($.inArray(type, ['text_field', 'select', 'multiselect', 'date_field', 'radio', 'check_box']) == -1) {
|
3
3
|
alert('Unknown field type.');
|
4
4
|
} else {
|
5
5
|
// find an index for the new form field (largest index plus one)
|
@@ -41,7 +41,7 @@ module Noodall
|
|
41
41
|
nil
|
42
42
|
end
|
43
43
|
end
|
44
|
-
response_row += [response.created_at.to_formatted_s(:
|
44
|
+
response_row += [response.created_at.to_formatted_s(:long), response.ip, response.referrer]
|
45
45
|
csv << response_row
|
46
46
|
end
|
47
47
|
end
|
@@ -67,17 +67,17 @@ module Noodall
|
|
67
67
|
|
68
68
|
def mark_as_spam
|
69
69
|
@response = @form.responses.find(params[:id])
|
70
|
-
@response.mark_as_spam!
|
70
|
+
@response.mark_as_spam!
|
71
71
|
redirect_to(noodall_admin_form_form_responses_url(@form))
|
72
72
|
end
|
73
|
-
|
73
|
+
|
74
74
|
def mark_as_not_spam
|
75
75
|
@response = @form.responses.find(params[:id])
|
76
|
-
@response.approve!
|
77
|
-
|
76
|
+
@response.approve!
|
77
|
+
|
78
78
|
FormMailer.form_response(@form, @response).deliver unless @form.email.blank?
|
79
79
|
FormMailer.form_response_thankyou(@form, @response).deliver
|
80
|
-
|
80
|
+
|
81
81
|
redirect_to(noodall_admin_form_form_responses_url(@form))
|
82
82
|
end
|
83
83
|
|
data/app/helpers/forms_helper.rb
CHANGED
@@ -1,20 +1,16 @@
|
|
1
1
|
module FormsHelper
|
2
2
|
|
3
3
|
def response_setup(form)
|
4
|
-
|
5
|
-
defaults = {}
|
6
|
-
form.fields.collect{|f| defaults[f.underscored_name.to_sym] = f.default } unless form.nil? || form.fields.nil?
|
7
|
-
|
8
|
-
Noodall::FormResponse.new(defaults)
|
4
|
+
form.responses.build
|
9
5
|
end
|
10
6
|
|
11
7
|
def field_type(field)
|
12
8
|
field_type = field._type.gsub(/^.*::/, '').downcase
|
13
|
-
|
9
|
+
|
14
10
|
if field_type == "textfield" && field.rows > 1
|
15
11
|
field_type = "textarea"
|
16
12
|
end
|
17
|
-
|
13
|
+
|
18
14
|
return field_type
|
19
15
|
end
|
20
16
|
|
data/app/models/noodall/field.rb
CHANGED
@@ -1,6 +1,7 @@
|
|
1
1
|
module Noodall
|
2
2
|
class Field
|
3
3
|
include MongoMapper::EmbeddedDocument
|
4
|
+
plugin MongoMapper::Plugins::MultiParameterAttributes
|
4
5
|
|
5
6
|
key :_type, String, :required => true
|
6
7
|
key :name, String, :required => true
|
@@ -14,11 +15,11 @@ module Noodall
|
|
14
15
|
def default_label
|
15
16
|
self.label = self.name if self.label.blank?
|
16
17
|
end
|
17
|
-
|
18
|
+
|
18
19
|
def underscored_name
|
19
20
|
name.parameterize.gsub('-','_').to_s
|
20
21
|
end
|
21
|
-
|
22
|
+
|
22
23
|
def default_class(response)
|
23
24
|
'default-value' if response.send(underscored_name.to_sym) == default
|
24
25
|
end
|
data/app/models/noodall/form.rb
CHANGED
@@ -1,7 +1,6 @@
|
|
1
1
|
module Noodall
|
2
2
|
class Form
|
3
3
|
include MongoMapper::Document
|
4
|
-
plugin MongoMapper::Plugins::MultiParameterAttributes
|
5
4
|
plugin Noodall::GlobalUpdateTime
|
6
5
|
|
7
6
|
key :title, String, :required => true
|
@@ -19,6 +18,15 @@ module Noodall
|
|
19
18
|
def spam
|
20
19
|
self.select {|r| r.spaminess >= (self.class.defensio_config['spam_threshold'] || 0.75)}
|
21
20
|
end
|
21
|
+
def build(attrs={})
|
22
|
+
doc = klass.new
|
23
|
+
apply_scope(doc)
|
24
|
+
doc.set_up_keys!
|
25
|
+
doc.attributes = attrs
|
26
|
+
@target ||= [] unless loaded?
|
27
|
+
@target << doc
|
28
|
+
doc
|
29
|
+
end
|
22
30
|
end
|
23
31
|
|
24
32
|
before_save :create_mandatory_fields!
|
@@ -2,7 +2,7 @@ module Noodall
|
|
2
2
|
class FormResponse
|
3
3
|
include MongoMapper::Document
|
4
4
|
|
5
|
-
key :name, String
|
5
|
+
key :name, String, :required => true
|
6
6
|
key :email, String, :format => /^[-a-z0-9_+\.]+\@([-a-z0-9]+\.)+[a-z0-9]{2,4}$/i
|
7
7
|
key :ip, String, :required => true
|
8
8
|
key :referrer, String, :required => true
|
@@ -15,19 +15,16 @@ module Noodall
|
|
15
15
|
|
16
16
|
attr_protected :approved
|
17
17
|
|
18
|
+
|
18
19
|
timestamps!
|
19
20
|
|
20
21
|
belongs_to :form, :class => Noodall::Form, :foreign_key => 'noodall_form_id'
|
21
22
|
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
def correct_fields?
|
27
|
-
self.form.fields.each do |f|
|
28
|
-
return false unless self.respond_to?(f.name.downcase.parameterize("_").to_sym)
|
23
|
+
# Overiden to set up keys after find
|
24
|
+
def initialize_from_database(attrs={})
|
25
|
+
super.tap do
|
26
|
+
set_up_keys!
|
29
27
|
end
|
30
|
-
return true
|
31
28
|
end
|
32
29
|
|
33
30
|
def approve!
|
@@ -46,18 +43,22 @@ module Noodall
|
|
46
43
|
self.approved == false
|
47
44
|
end
|
48
45
|
|
49
|
-
|
50
|
-
|
51
|
-
|
46
|
+
# Create appropriate MongoMapper keys for current instance
|
47
|
+
# based on the fields of the form it belongs to
|
48
|
+
def set_up_keys!
|
49
|
+
form.fields.each do |f|
|
50
|
+
class_eval do
|
51
|
+
key f.underscored_name, f.keys['default'].type, :required => f.required, :default => f.default
|
52
|
+
end
|
53
|
+
end if form
|
54
|
+
end
|
52
55
|
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
value.to_s
|
57
|
-
end
|
56
|
+
# Merge meta keys with real keys
|
57
|
+
def keys
|
58
|
+
super.merge( class_eval( 'keys' ) )
|
58
59
|
end
|
59
60
|
|
60
|
-
|
61
|
+
protected
|
61
62
|
def defensio_configuired?
|
62
63
|
defined?(Defensio) && !self.class.defensio_config.blank?
|
63
64
|
end
|
@@ -103,26 +104,5 @@ module Noodall
|
|
103
104
|
}
|
104
105
|
end
|
105
106
|
|
106
|
-
|
107
|
-
private
|
108
|
-
validate :custom_validation
|
109
|
-
|
110
|
-
def custom_validation
|
111
|
-
return true if required_fields.nil? || !self.new_record?
|
112
|
-
required_fields.each do |field|
|
113
|
-
self.errors.add(field.underscored_name.to_sym, "can't be empty") if self.send(field.underscored_name).blank?
|
114
|
-
end
|
115
|
-
return true if self.errors.empty?
|
116
|
-
end
|
117
|
-
|
118
|
-
def method_missing(method)
|
119
|
-
# If the form doesn't have a field that matches this method, act normally. Otherwise, return nil to show the field is empty.
|
120
|
-
if form.fields.select{|f| f.underscored_name.to_sym == method}.empty?
|
121
|
-
super
|
122
|
-
else
|
123
|
-
return nil
|
124
|
-
end
|
125
|
-
end
|
126
|
-
|
127
107
|
end
|
128
108
|
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
<%= fields_for "form[fields][#{index}]", field do |f| %>
|
2
|
+
<tr>
|
3
|
+
<td><%= f.hidden_field :_type %><%= f.label :name, 'Name *' %><%= f.text_field :name %></td>
|
4
|
+
<td>Date Select</td>
|
5
|
+
<td><%= f.label :label, 'Label' %><%= f.text_field :label %></td>
|
6
|
+
<td><%= f.label :default, 'Default Option' %><%= f.text_field :default %></td>
|
7
|
+
<td class="center">-</td>
|
8
|
+
<td>-</td>
|
9
|
+
<td><%= f.label :required, 'Required?' %><%= f.check_box :required %></td>
|
10
|
+
<td width="25" class="up"><a class="page_up" title="Move this field up">up</a></td>
|
11
|
+
<td width="30" class="down"><a class="page_down" title="Move this field down">down</a></td>
|
12
|
+
<td><%= link_to_function 'Delete', 'return delete_form_field(this);', :class => 'delete' %></td>
|
13
|
+
</tr>
|
14
|
+
<% end %>
|
File without changes
|
@@ -21,7 +21,7 @@
|
|
21
21
|
<% @responses.sort_by(&:created_at).reverse.each do |response| %>
|
22
22
|
<tr id="form-<%= response.id %>" class="<%=cycle('odd', 'even')%>">
|
23
23
|
<td class="edit"><%= mail_to response.email, h(response.name) %></td>
|
24
|
-
<td><%= @form.fields.collect{|f| "<strong>#{f.name}:</strong> #{response.
|
24
|
+
<td><%= @form.fields.collect{|f| "<strong>#{f.name}:</strong> #{response.send(f.underscored_name)}" }.join(", ").html_safe %></td>
|
25
25
|
<td><%= h response.created_at.to_formatted_s(:long_dot) %></td>
|
26
26
|
<td class="spam <%= 'flagged' unless response.approved %>">
|
27
27
|
<% if response.approved %>
|
@@ -5,6 +5,7 @@
|
|
5
5
|
<option value="text_field">Text</option>
|
6
6
|
<option value="select">Select Box</option>
|
7
7
|
<option value="multiselect">Multi-Select Box</option>
|
8
|
+
<option value="date_field">Date</option>
|
8
9
|
<option value="radio">Radio Buttons</option>
|
9
10
|
<option value="check_box">Check Box</option>
|
10
11
|
</select>
|
@@ -50,6 +50,9 @@
|
|
50
50
|
<p id="multiselect" class="field-help">
|
51
51
|
Similar to Select. <strong>Examples:</strong> Acceptable Contact Methods, Phone, Phone AND Email, Phone AND Text AND Mail
|
52
52
|
</p>
|
53
|
+
<p id="date_select" class="field-help">
|
54
|
+
Similar to Select but allows you to select the day, month and year.
|
55
|
+
</p>
|
53
56
|
<p id="radio" class="field-help">
|
54
57
|
<strong>Examples:</strong> Yes or No Questions, Multiple Choice<br/><br/>
|
55
58
|
The radio button only allows one option to be chosen.
|
@@ -27,11 +27,12 @@ Feature: Form builder
|
|
27
27
|
Then I should see a new field with the options "<Options>"
|
28
28
|
|
29
29
|
Examples:
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
30
|
+
| Field Type | Options |
|
31
|
+
| Text | Name, Label, Default, Rows, Required |
|
32
|
+
| Select | Name, Label, Default Option, Options, Required |
|
33
|
+
| Radio | Name, Label, Default Option, Options, Required |
|
34
|
+
| Check Box | Name, Label, Default state, Required |
|
35
|
+
| Date | Name, Label, Default, Required |
|
35
36
|
|
36
37
|
@javascript
|
37
38
|
Scenario: Reorder fields
|
@@ -8,7 +8,7 @@ When /^I click on a root$/ do
|
|
8
8
|
within("tbody tr:last") { click_link "Children" }
|
9
9
|
end
|
10
10
|
|
11
|
-
Then /^I should see a list the of the root
|
11
|
+
Then /^I should see a list the of the root's children$/ do
|
12
12
|
@_page.children.each do |child|
|
13
13
|
page.should have_content(child.title)
|
14
14
|
end
|
@@ -19,7 +19,7 @@ When /^I click on a child$/ do
|
|
19
19
|
within(:css, "tbody tr:first") { click_link "Children" }
|
20
20
|
end
|
21
21
|
|
22
|
-
Then /^I should see a list of the child
|
22
|
+
Then /^I should see a list of the child's children$/ do
|
23
23
|
@_child.children.each do |gchild|
|
24
24
|
page.should have_content(gchild.title)
|
25
25
|
end
|
@@ -50,7 +50,7 @@ Then /^I should be able to create a new child$/ do
|
|
50
50
|
page.should have_content(' was successfully created.')
|
51
51
|
end
|
52
52
|
|
53
|
-
Then /^I should see the child listed within the root
|
53
|
+
Then /^I should see the child listed within the root's children$/ do
|
54
54
|
visit noodall_admin_node_nodes_path(@_page)
|
55
55
|
page.should have_content('New Child')
|
56
56
|
end
|
@@ -63,7 +63,7 @@ Then /^I should be able to delete content$/ do
|
|
63
63
|
page.should have_content("deleted")
|
64
64
|
end
|
65
65
|
|
66
|
-
Then /^the content and all of it
|
66
|
+
Then /^the content and all of it's sub content will be removed from the website$/ do
|
67
67
|
|
68
68
|
lambda { visit node_path(@_deleted_node) }.should raise_error(MongoMapper::DocumentNotFound)
|
69
69
|
|
@@ -83,14 +83,14 @@ Then /^I should be able to move a child content to another parent$/ do
|
|
83
83
|
click_button 'Draft'
|
84
84
|
end
|
85
85
|
|
86
|
-
Then /^I should see the child listed within the other parent
|
86
|
+
Then /^I should see the child listed within the other parent's children$/ do
|
87
87
|
visit noodall_admin_node_nodes_path(@_new_parent)
|
88
88
|
within('tbody') do
|
89
89
|
page.should have_content(@_child.title)
|
90
90
|
end
|
91
91
|
end
|
92
92
|
|
93
|
-
Then /^I should be able change the order of the root
|
93
|
+
Then /^I should be able change the order of the root's children$/ do
|
94
94
|
table = table(tableish("table tr", 'td, th'))
|
95
95
|
title = table.hashes[2]['Title'] # 2 as zero index
|
96
96
|
within(:css, 'table tbody tr:nth(3)') { click_link "up" }
|
@@ -11,13 +11,13 @@ When /^(?:|I )click a "([^"]*)" component slot$/ do |slot_name|
|
|
11
11
|
end
|
12
12
|
|
13
13
|
When /^(?:|I )select the "([^\"]+)" component$/ do |component_name|
|
14
|
-
within "#fancybox-
|
14
|
+
within "#fancybox-content" do
|
15
15
|
select component_name, :from => 'Select the type of component'
|
16
16
|
end
|
17
17
|
end
|
18
18
|
|
19
19
|
When /^(?:|I )fill in the following within the component:$/ do |fields|
|
20
|
-
within "#fancybox-
|
20
|
+
within "#fancybox-content" do
|
21
21
|
fields.rows_hash.each do |name, value|
|
22
22
|
When %{I fill in "#{name}" with "#{value}"}
|
23
23
|
end
|
@@ -25,7 +25,7 @@ When /^(?:|I )fill in the following within the component:$/ do |fields|
|
|
25
25
|
end
|
26
26
|
|
27
27
|
When /^(?:|I )press "([^"]*)" within the component$/ do |button|
|
28
|
-
within "#fancybox-
|
28
|
+
within "#fancybox-content" do
|
29
29
|
click_button(button)
|
30
30
|
sleep 3
|
31
31
|
end
|
@@ -33,7 +33,7 @@ end
|
|
33
33
|
|
34
34
|
When /^(?:|I )select an image from the asset library$/ do
|
35
35
|
asset = Factory(:asset, :title => "My Image")
|
36
|
-
within "#fancybox-
|
36
|
+
within "#fancybox-content" do
|
37
37
|
pending
|
38
38
|
end
|
39
39
|
end
|
@@ -111,7 +111,7 @@ When /^a website visitor visits the content$/ do
|
|
111
111
|
end
|
112
112
|
|
113
113
|
Then /^they should see the form$/ do
|
114
|
-
|
114
|
+
step %{I should see the form I selected}
|
115
115
|
end
|
116
116
|
|
117
117
|
When /^they fill in and submit the form$/ do
|
@@ -122,24 +122,26 @@ When /^they fill in and submit the form$/ do
|
|
122
122
|
else
|
123
123
|
if field.class == Noodall::TextField
|
124
124
|
fill_in "form_response[#{field.underscored_name}]", :with => 'Weopunggggggggst'
|
125
|
+
elsif field.class == Noodall::DateField
|
126
|
+
fill_in "form_response[#{field.underscored_name}]", :with => '30/03/1976'
|
125
127
|
end
|
126
128
|
end
|
127
129
|
end
|
128
130
|
|
129
|
-
|
131
|
+
step %{they submit the form}
|
130
132
|
end
|
131
133
|
|
132
134
|
Then /^the email address of the form should receive an email detailing the information submitted$/ do
|
133
|
-
|
135
|
+
step %{"#{@_form.email}" should receive an email}
|
134
136
|
@_form.fields do |field|
|
135
|
-
|
137
|
+
step %{they should see "#{field.name}:" in the email body}
|
136
138
|
end
|
137
139
|
end
|
138
140
|
|
139
141
|
Then /^they should receive an email confirming the request has been sent$/ do
|
140
|
-
|
142
|
+
step %{"hello@example.com" should receive an email}
|
141
143
|
@_form.fields do |field|
|
142
|
-
|
144
|
+
step %{they should see "#{field.name}:" in the email body}
|
143
145
|
end
|
144
146
|
end
|
145
147
|
|
@@ -163,7 +165,7 @@ Then /^it should be rejected if the spam filter deems the response to be spam$/
|
|
163
165
|
end
|
164
166
|
|
165
167
|
Then /^the website visitor should see an spam message$/ do
|
166
|
-
|
168
|
+
step %{it should be rejected if the spam filter deems the response to be spam}
|
167
169
|
end
|
168
170
|
|
169
171
|
Then /^it should be checked against the validation speficied in the form builder$/ do
|
@@ -175,7 +177,7 @@ Then /^it should be checked against the validation speficied in the form builder
|
|
175
177
|
end
|
176
178
|
|
177
179
|
Then /^it should be rejected if the the response does not meet the validation$/ do
|
178
|
-
|
180
|
+
step %{it should be checked against the validation speficied in the form builder}
|
179
181
|
end
|
180
182
|
|
181
183
|
Then /^the website visitor should see an error message$/ do
|
@@ -183,7 +185,7 @@ Then /^the website visitor should see an error message$/ do
|
|
183
185
|
end
|
184
186
|
|
185
187
|
When /^a website visitor fills in and submits a form$/ do
|
186
|
-
|
188
|
+
step %{they fill in and submit the form}
|
187
189
|
end
|
188
190
|
|
189
191
|
When /^they submit the form$/ do
|
@@ -191,13 +193,13 @@ When /^they submit the form$/ do
|
|
191
193
|
end
|
192
194
|
|
193
195
|
When /^a form response is deemed to be spam$/ do
|
194
|
-
|
196
|
+
step %{a website visitor visits the content}
|
195
197
|
defensio_dummy = double("defensio dummy")
|
196
198
|
defensio_dummy.stub(:post_document){ [200, {'spaminess' => 1, "allow" => false}] }
|
197
199
|
defensio_dummy.stub(:put_document){ [200, {"allow" => false}] }
|
198
200
|
|
199
201
|
Noodall::FormResponse.stub(:defensio).and_return(defensio_dummy)
|
200
|
-
|
202
|
+
step %{they fill in and submit the form}
|
201
203
|
end
|
202
204
|
|
203
205
|
Then /^it should marked as spam$/ do
|
@@ -225,8 +227,8 @@ When /^I am editing the form$/ do
|
|
225
227
|
end
|
226
228
|
|
227
229
|
When /^I click the "([^\"]*)" arrow next to "([^\"]*)" twice$/ do |arrow, field|
|
228
|
-
|
229
|
-
|
230
|
+
step %{I click the "#{arrow}" arrow next to "#{field}" once}
|
231
|
+
step %{I click the "#{arrow}" arrow next to "#{field}" once}
|
230
232
|
end
|
231
233
|
|
232
234
|
Then /^the "([^"]*)" field should be at position (\d+)$/ do |field, position|
|
@@ -249,7 +251,7 @@ When /^I view the form on the website$/ do
|
|
249
251
|
@_node = Factory(:page_a)
|
250
252
|
@_node.wide_slot_0 = Factory(:contact_form, :form_id => @_form.id)
|
251
253
|
@_node.save
|
252
|
-
|
254
|
+
step %{a website visitor visits the content}
|
253
255
|
end
|
254
256
|
|
255
257
|
Then /^I should see the fields in the order I set$/ do
|
@@ -271,7 +273,7 @@ Given /^I am viewing the form's responses$/ do
|
|
271
273
|
end
|
272
274
|
|
273
275
|
Given /^I mark the response as not spam$/ do
|
274
|
-
|
276
|
+
step %{I follow "Not Spam?"} # This is tied to the current page, could be abstracted a little more
|
275
277
|
end
|
276
278
|
|
277
279
|
|
@@ -1,6 +1,6 @@
|
|
1
1
|
# IMPORTANT: This file is generated by cucumber-rails - edit at your own peril.
|
2
|
-
# It is recommended to regenerate this file in the future when you upgrade to a
|
3
|
-
# newer version of cucumber-rails. Consider adding your own code to a new file
|
2
|
+
# It is recommended to regenerate this file in the future when you upgrade to a
|
3
|
+
# newer version of cucumber-rails. Consider adding your own code to a new file
|
4
4
|
# instead of editing this one. Cucumber will automatically load all features/**/*.rb
|
5
5
|
# files.
|
6
6
|
|
@@ -62,7 +62,7 @@ end
|
|
62
62
|
When /^(?:|I )fill in the following(?: within "([^"]*)")?:$/ do |selector, fields|
|
63
63
|
with_scope(selector) do
|
64
64
|
fields.rows_hash.each do |name, value|
|
65
|
-
|
65
|
+
step %{I fill in "#{name}" with "#{value}"}
|
66
66
|
end
|
67
67
|
end
|
68
68
|
end
|
@@ -191,7 +191,7 @@ Then /^the "([^"]*)" checkbox(?: within "([^"]*)")? should not be checked$/ do |
|
|
191
191
|
end
|
192
192
|
end
|
193
193
|
end
|
194
|
-
|
194
|
+
|
195
195
|
Then /^(?:|I )should be on (.+)$/ do |page_name|
|
196
196
|
current_path = URI.parse(current_url).path
|
197
197
|
if current_path.respond_to? :should
|
@@ -205,8 +205,8 @@ Then /^(?:|I )should have the following query string:$/ do |expected_pairs|
|
|
205
205
|
query = URI.parse(current_url).query
|
206
206
|
actual_params = query ? CGI.parse(query) : {}
|
207
207
|
expected_params = {}
|
208
|
-
expected_pairs.rows_hash.each_pair{|k,v| expected_params[k] = v.split(',')}
|
209
|
-
|
208
|
+
expected_pairs.rows_hash.each_pair{|k,v| expected_params[k] = v.split(',')}
|
209
|
+
|
210
210
|
if actual_params.respond_to? :should
|
211
211
|
actual_params.should == expected_params
|
212
212
|
else
|
data/features/support/env.rb
CHANGED
@@ -10,8 +10,8 @@ require File.expand_path("../../../spec/dummy/config/environment.rb", __FILE__)
|
|
10
10
|
require 'cucumber/formatter/unicode' # Remove this line if you don't want Cucumber Unicode support
|
11
11
|
require 'cucumber/rails/rspec'
|
12
12
|
require 'cucumber/rails/world'
|
13
|
+
require 'email_spec'
|
13
14
|
require 'email_spec/cucumber'
|
14
|
-
require 'cucumber/web/tableish'
|
15
15
|
require 'cucumber/rspec/doubles'
|
16
16
|
|
17
17
|
require 'capybara/rails'
|
@@ -41,6 +41,7 @@ require 'database_cleaner/cucumber'
|
|
41
41
|
DatabaseCleaner.strategy = :truncation
|
42
42
|
|
43
43
|
require 'factory_girl'
|
44
|
+
require 'faker'
|
44
45
|
|
45
46
|
Factory.definition_file_paths = [
|
46
47
|
File.expand_path("../../../spec/factories", __FILE__)
|
@@ -49,5 +50,5 @@ Factory.find_definitions
|
|
49
50
|
|
50
51
|
require 'factory_girl/step_definitions'
|
51
52
|
require 'csv' #for checking CSV content
|
52
|
-
require 'ruby-debug'
|
53
|
+
#require 'ruby-debug'
|
53
54
|
|
@@ -1,13 +1,15 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
factory.build_class.keys
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
1
|
+
FactoryGirl.factories.each do |factory|
|
2
|
+
factory.human_names.each do |human_name|
|
3
|
+
if factory.build_class.respond_to?(:keys)
|
4
|
+
factory.build_class.keys.each_key do |key|
|
5
|
+
human_column_name = key.downcase.gsub('_', ' ')
|
6
|
+
Given /^an? #{human_name} exists with an? #{human_column_name} of "([^"]*)"$/i do |value|
|
7
|
+
Factory(factory.name, key => value)
|
8
|
+
end
|
8
9
|
|
9
|
-
|
10
|
-
|
10
|
+
Given /^(\d+) #{human_name.pluralize} exist with an? #{human_column_name} of "([^"]*)"$/i do |count, value|
|
11
|
+
count.to_i.times { Factory(factory.name, key => value) }
|
12
|
+
end
|
11
13
|
end
|
12
14
|
end
|
13
15
|
end
|
data/script/cucumber
ADDED
@@ -0,0 +1,10 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
vendored_cucumber_bin = Dir["#{File.dirname(__FILE__)}/../vendor/{gems,plugins}/cucumber*/bin/cucumber"].first
|
4
|
+
if vendored_cucumber_bin
|
5
|
+
load File.expand_path(vendored_cucumber_bin)
|
6
|
+
else
|
7
|
+
require 'rubygems' unless ENV['NO_RUBYGEMS']
|
8
|
+
require 'cucumber'
|
9
|
+
load Cucumber::BINARY
|
10
|
+
end
|
data/script/rails
ADDED
@@ -0,0 +1,6 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
#!/usr/bin/env ruby
|
3
|
+
# This command will automatically be run when you run "rails" with Rails 3 gems installed from the root of your application.
|
4
|
+
|
5
|
+
ENGINE_PATH = File.expand_path('../..', __FILE__)
|
6
|
+
load File.expand_path('../../spec/dummy/script/rails', __FILE__)
|
data/spec/factories/field.rb
CHANGED
@@ -14,3 +14,5 @@ Factory.define :radio_field, :parent => :select_field, :class => Noodall::Radio
|
|
14
14
|
end
|
15
15
|
Factory.define :check_box_field, :parent => :field, :class => Noodall::CheckBox do |field|
|
16
16
|
end
|
17
|
+
Factory.define :date_field, :parent => :field, :class => Noodall::DateField do |field|
|
18
|
+
end
|
data/spec/factories/form.rb
CHANGED
@@ -7,11 +7,16 @@ Factory.define :form, :class => Noodall::Form do |form|
|
|
7
7
|
5.times do
|
8
8
|
fields << Factory(:text_field)
|
9
9
|
end
|
10
|
-
fields << Factory(:check_box_field)
|
11
|
-
fields << Factory(:select_field)
|
12
|
-
fields << Factory(:
|
13
|
-
fields << Factory(:
|
10
|
+
fields << Factory(:check_box_field, :name => 'Check' )
|
11
|
+
fields << Factory(:select_field, :name => 'Select')
|
12
|
+
fields << Factory(:radio_field, :name => 'Radio')
|
13
|
+
fields << Factory(:date_field, :name => 'Date', :required => true)
|
14
14
|
|
15
15
|
fields
|
16
16
|
end
|
17
17
|
end
|
18
|
+
|
19
|
+
Factory.define :blank_form, :class => Noodall::Form do |form|
|
20
|
+
form.title "A Form"
|
21
|
+
form.email "hello@wearebeef.co.uk"
|
22
|
+
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Noodall::FormResponse do
|
4
|
+
|
5
|
+
it "should have methods based on it's forms fields" do
|
6
|
+
form = Factory(:form)
|
7
|
+
r = form.responses.build
|
8
|
+
test_date = Time.now
|
9
|
+
r.date = test_date
|
10
|
+
r.date.should == test_date.to_date
|
11
|
+
end
|
12
|
+
|
13
|
+
it "should validate fields marked required in it's form" do
|
14
|
+
form = Factory(:form)
|
15
|
+
r = form.responses.build()
|
16
|
+
r.save
|
17
|
+
r.errors.messages.should have_key(:date)
|
18
|
+
end
|
19
|
+
|
20
|
+
it "should not persist feilds in the class" do
|
21
|
+
form = Factory(:form)
|
22
|
+
r1 = form.responses.build
|
23
|
+
r1.save
|
24
|
+
r1.errors.messages.should have_key(:date)
|
25
|
+
|
26
|
+
form = Factory(:blank_form)
|
27
|
+
r = form.responses.build
|
28
|
+
r.save
|
29
|
+
r.errors.messages.should_not have_key(:date)
|
30
|
+
|
31
|
+
r1.save
|
32
|
+
r1.errors.messages.should have_key(:date)
|
33
|
+
end
|
34
|
+
end
|
data/spec/spec_helper.rb
CHANGED
@@ -2,6 +2,8 @@
|
|
2
2
|
ENV["RAILS_ENV"] = "test"
|
3
3
|
|
4
4
|
require File.expand_path("../dummy/config/environment.rb", __FILE__)
|
5
|
+
require 'faker'
|
6
|
+
require 'factory_girl_rails'
|
5
7
|
require "rails/test_help"
|
6
8
|
require "rspec/rails"
|
7
9
|
|
@@ -19,12 +21,15 @@ Capybara.default_selector = :css
|
|
19
21
|
# Load support files
|
20
22
|
Dir["#{File.dirname(__FILE__)}/support/**/*.rb"].each { |f| require f }
|
21
23
|
|
22
|
-
|
24
|
+
RSpec.configure do |config|
|
23
25
|
# Remove this line if you don't want Rspec's should and should_not
|
24
26
|
# methods or matchers
|
25
27
|
require 'rspec/expectations'
|
26
|
-
config.include
|
28
|
+
config.include RSpec::Matchers
|
27
29
|
|
28
30
|
# == Mock Framework
|
29
31
|
config.mock_with :rspec
|
32
|
+
|
33
|
+
config.backtrace_clean_patterns = [
|
34
|
+
]
|
30
35
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: noodall-form-builder
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.5.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -11,11 +11,11 @@ authors:
|
|
11
11
|
autorequire:
|
12
12
|
bindir: bin
|
13
13
|
cert_chain: []
|
14
|
-
date: 2012-
|
14
|
+
date: 2012-02-03 00:00:00.000000000Z
|
15
15
|
dependencies:
|
16
16
|
- !ruby/object:Gem::Dependency
|
17
17
|
name: bundler
|
18
|
-
requirement: &
|
18
|
+
requirement: &13206780 !ruby/object:Gem::Requirement
|
19
19
|
none: false
|
20
20
|
requirements:
|
21
21
|
- - ! '>='
|
@@ -23,10 +23,10 @@ dependencies:
|
|
23
23
|
version: 1.0.0
|
24
24
|
type: :development
|
25
25
|
prerelease: false
|
26
|
-
version_requirements: *
|
26
|
+
version_requirements: *13206780
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: fastercsv
|
29
|
-
requirement: &
|
29
|
+
requirement: &13206260 !ruby/object:Gem::Requirement
|
30
30
|
none: false
|
31
31
|
requirements:
|
32
32
|
- - ! '>='
|
@@ -34,7 +34,7 @@ dependencies:
|
|
34
34
|
version: '0'
|
35
35
|
type: :runtime
|
36
36
|
prerelease: false
|
37
|
-
version_requirements: *
|
37
|
+
version_requirements: *13206260
|
38
38
|
description: Functionality for building custom forms
|
39
39
|
email: []
|
40
40
|
executables: []
|
@@ -57,6 +57,7 @@ files:
|
|
57
57
|
- app/mailers/form_mailer.rb
|
58
58
|
- app/models/contact_form.rb
|
59
59
|
- app/models/noodall/check_box.rb
|
60
|
+
- app/models/noodall/date_field.rb
|
60
61
|
- app/models/noodall/field.rb
|
61
62
|
- app/models/noodall/form.rb
|
62
63
|
- app/models/noodall/form_response.rb
|
@@ -70,6 +71,8 @@ files:
|
|
70
71
|
- app/views/form_mailer/form_response.html.erb
|
71
72
|
- app/views/form_mailer/form_response_thankyou.html.erb
|
72
73
|
- app/views/noodall/admin/fields/_check_box.html.erb
|
74
|
+
- app/views/noodall/admin/fields/_date_field.html.erb
|
75
|
+
- app/views/noodall/admin/fields/_field.html.erb
|
73
76
|
- app/views/noodall/admin/fields/_multiselect.html.erb
|
74
77
|
- app/views/noodall/admin/fields/_radio.html.erb
|
75
78
|
- app/views/noodall/admin/fields/_select.html.erb
|
@@ -82,6 +85,7 @@ files:
|
|
82
85
|
- app/views/noodall/form_responses/_form.html.erb
|
83
86
|
- app/views/noodall/form_responses/create.html.erb
|
84
87
|
- app/views/noodall/form_responses/fields/_checkbox.html.erb
|
88
|
+
- app/views/noodall/form_responses/fields/_datefield.html.erb
|
85
89
|
- app/views/noodall/form_responses/fields/_multiselect.html.erb
|
86
90
|
- app/views/noodall/form_responses/fields/_radio.html.erb
|
87
91
|
- app/views/noodall/form_responses/fields/_select.html.erb
|
@@ -111,6 +115,8 @@ files:
|
|
111
115
|
- lib/noodall/form_builder/routes.rb
|
112
116
|
- lib/noodall/form_builder/version.rb
|
113
117
|
- noodall-form-builder.gemspec
|
118
|
+
- script/cucumber
|
119
|
+
- script/rails
|
114
120
|
- spec/dummy/Rakefile
|
115
121
|
- spec/dummy/app/controllers/application_controller.rb
|
116
122
|
- spec/dummy/app/helpers/application_helper.rb
|
@@ -154,7 +160,7 @@ files:
|
|
154
160
|
- spec/factories/user.rb
|
155
161
|
- spec/files/beef.png
|
156
162
|
- spec/integration/navigation_spec.rb
|
157
|
-
- spec/
|
163
|
+
- spec/models/form_spec.rb
|
158
164
|
- spec/spec_helper.rb
|
159
165
|
homepage: http://rubygems.org/gems/noodall-form-builder
|
160
166
|
licenses: []
|
@@ -170,7 +176,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
170
176
|
version: '0'
|
171
177
|
segments:
|
172
178
|
- 0
|
173
|
-
hash:
|
179
|
+
hash: 2489411277551539261
|
174
180
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
175
181
|
none: false
|
176
182
|
requirements:
|