noodall-form-builder 0.4.2 → 0.5.0
Sign up to get free protection for your applications and to get access to all the features.
- 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:
|