active_form 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- data.tar.gz.sig +2 -0
- data/History.txt +4 -0
- data/License.txt +20 -0
- data/MIT-LICENSE +19 -0
- data/Manifest.txt +181 -0
- data/README.txt +1 -0
- data/Rakefile +4 -0
- data/config/hoe.rb +71 -0
- data/config/requirements.rb +17 -0
- data/init.rb +5 -0
- data/lib/active_form.rb +86 -0
- data/lib/active_form/core_extensions.rb +179 -0
- data/lib/active_form/definition.rb +72 -0
- data/lib/active_form/element.rb +50 -0
- data/lib/active_form/elements/base.rb +67 -0
- data/lib/active_form/elements/builder.rb +103 -0
- data/lib/active_form/elements/button.rb +15 -0
- data/lib/active_form/elements/checkbox.rb +18 -0
- data/lib/active_form/elements/file.rb +15 -0
- data/lib/active_form/elements/hidden.rb +9 -0
- data/lib/active_form/elements/image.rb +7 -0
- data/lib/active_form/elements/input.rb +23 -0
- data/lib/active_form/elements/password.rb +12 -0
- data/lib/active_form/elements/radio.rb +18 -0
- data/lib/active_form/elements/reset.rb +15 -0
- data/lib/active_form/elements/section.rb +37 -0
- data/lib/active_form/elements/select.rb +42 -0
- data/lib/active_form/elements/submit.rb +19 -0
- data/lib/active_form/elements/text.rb +9 -0
- data/lib/active_form/elements/textarea.rb +18 -0
- data/lib/active_form/errors.rb +73 -0
- data/lib/active_form/facets/checkbox_group.rb +11 -0
- data/lib/active_form/facets/collection_input.rb +96 -0
- data/lib/active_form/facets/radio_group.rb +11 -0
- data/lib/active_form/facets/select_date.rb +10 -0
- data/lib/active_form/facets/select_datetime.rb +10 -0
- data/lib/active_form/facets/select_day.rb +17 -0
- data/lib/active_form/facets/select_from_model.rb +60 -0
- data/lib/active_form/facets/select_hour.rb +17 -0
- data/lib/active_form/facets/select_minute.rb +17 -0
- data/lib/active_form/facets/select_month.rb +46 -0
- data/lib/active_form/facets/select_numeric_range.rb +59 -0
- data/lib/active_form/facets/select_second.rb +17 -0
- data/lib/active_form/facets/select_time.rb +10 -0
- data/lib/active_form/facets/select_timebased.rb +145 -0
- data/lib/active_form/facets/select_weekday.rb +46 -0
- data/lib/active_form/facets/select_year.rb +24 -0
- data/lib/active_form/mixins/attribute_methods.rb +33 -0
- data/lib/active_form/mixins/casting.rb +152 -0
- data/lib/active_form/mixins/collection_element_methods.rb +204 -0
- data/lib/active_form/mixins/common_methods.rb +350 -0
- data/lib/active_form/mixins/container_methods.rb +417 -0
- data/lib/active_form/mixins/css_methods.rb +70 -0
- data/lib/active_form/mixins/element_methods.rb +314 -0
- data/lib/active_form/mixins/javascript_methods.rb +99 -0
- data/lib/active_form/mixins/loader_methods.rb +72 -0
- data/lib/active_form/mixins/option_element_methods.rb +61 -0
- data/lib/active_form/mixins/validation_methods.rb +253 -0
- data/lib/active_form/validator.rb +47 -0
- data/lib/active_form/validators/alpha.rb +9 -0
- data/lib/active_form/validators/alphanum.rb +9 -0
- data/lib/active_form/validators/base.rb +132 -0
- data/lib/active_form/validators/digits.rb +9 -0
- data/lib/active_form/validators/email.rb +29 -0
- data/lib/active_form/validators/format.rb +15 -0
- data/lib/active_form/validators/length_range.rb +24 -0
- data/lib/active_form/validators/number.rb +9 -0
- data/lib/active_form/validators/option_count.rb +24 -0
- data/lib/active_form/validators/proc.rb +22 -0
- data/lib/active_form/validators/required.rb +9 -0
- data/lib/active_form/validators/set.rb +21 -0
- data/lib/active_form/validators/time_range.rb +30 -0
- data/lib/active_form/validators/uri.rb +54 -0
- data/lib/active_form/version.rb +9 -0
- data/lib/active_form/views/fieldsets.rb +34 -0
- data/lib/active_form/views/plain.rb +32 -0
- data/lib/active_form/views/tables.rb +28 -0
- data/lib/active_form/widget.rb +43 -0
- data/lib/active_form/widgets/base.rb +28 -0
- data/lib/loob/uri_validator.rb +140 -0
- data/lib/rails/acts_as_dropdown/MIT-LICENSE +20 -0
- data/lib/rails/acts_as_dropdown/acts_as_dropdown.rb +119 -0
- data/lib/rails/acts_as_dropdown/dropdown.rb +27 -0
- data/lib/rails/controller_helper.rb +19 -0
- data/lib/rails/model/loader.rb +206 -0
- data/lib/rails/view_helper.rb +20 -0
- data/samples/html/css/style.css +175 -0
- data/samples/html/js/effects.js +958 -0
- data/samples/html/js/prototype.js +2006 -0
- data/samples/html/js/validation.js +228 -0
- data/samples/html/plain_view.html +77 -0
- data/samples/html/sample001.html +158 -0
- data/samples/html/sample002.html +76 -0
- data/samples/html/sample003.html +34 -0
- data/samples/layouts/default.rhtml +18 -0
- data/samples/layouts/plain.rhtml +21 -0
- data/samples/layouts/sample003.rhtml +25 -0
- data/samples/plain_view.rb +58 -0
- data/samples/sample001.rb +111 -0
- data/samples/sample002.rb +92 -0
- data/samples/sample003.rb +30 -0
- data/script/destroy +14 -0
- data/script/generate +14 -0
- data/script/txt2html +74 -0
- data/setup.rb +1585 -0
- data/tasks/deployment.rake +34 -0
- data/tasks/environment.rake +7 -0
- data/tasks/website.rake +17 -0
- data/test/elements/test_base_element.rb +159 -0
- data/test/elements/test_builder_element.rb +81 -0
- data/test/elements/test_button_element.rb +12 -0
- data/test/elements/test_checkbox_element.rb +233 -0
- data/test/elements/test_file_element.rb +20 -0
- data/test/elements/test_hidden_element.rb +11 -0
- data/test/elements/test_image_element.rb +11 -0
- data/test/elements/test_input_element.rb +39 -0
- data/test/elements/test_password_element.rb +16 -0
- data/test/elements/test_radio_element.rb +197 -0
- data/test/elements/test_reset_element.rb +12 -0
- data/test/elements/test_section_element.rb +162 -0
- data/test/elements/test_select_element.rb +364 -0
- data/test/elements/test_submit_element.rb +12 -0
- data/test/elements/test_text_element.rb +91 -0
- data/test/elements/test_textarea_element.rb +23 -0
- data/test/facets/test_checkbox_group_element.rb +388 -0
- data/test/facets/test_radio_group_element.rb +312 -0
- data/test/facets/test_select_date_element.rb +211 -0
- data/test/facets/test_select_datetime_element.rb +56 -0
- data/test/facets/test_select_day_element.rb +37 -0
- data/test/facets/test_select_from_model_element.rb +86 -0
- data/test/facets/test_select_hour_element.rb +37 -0
- data/test/facets/test_select_minute_element.rb +52 -0
- data/test/facets/test_select_month_element.rb +79 -0
- data/test/facets/test_select_numeric_range_element.rb +14 -0
- data/test/facets/test_select_second_element.rb +48 -0
- data/test/facets/test_select_time_element.rb +148 -0
- data/test/facets/test_select_weekday_element.rb +71 -0
- data/test/facets/test_select_year_element.rb +73 -0
- data/test/fixtures/author.rb +11 -0
- data/test/fixtures/authors.yml +0 -0
- data/test/fixtures/book.rb +14 -0
- data/test/fixtures/books.yml +8 -0
- data/test/fixtures/categories.yml +0 -0
- data/test/fixtures/categorization.rb +2 -0
- data/test/fixtures/categorizations.yml +0 -0
- data/test/fixtures/category.rb +8 -0
- data/test/fixtures/publisher.rb +5 -0
- data/test/fixtures/publishers.yml +10 -0
- data/test/fixtures/schema.rb +43 -0
- data/test/rails/test_model_autodefinition.rb +121 -0
- data/test/rails/test_model_loader.rb +61 -0
- data/test/resources/elements/chunky.rb +11 -0
- data/test/resources/forms/demo.rb +5 -0
- data/test/resources/models/book.rb +8 -0
- data/test/resources/models/register_publisher.rb +5 -0
- data/test/resources/sections/demo.rb +6 -0
- data/test/resources/sections/foo.rb +6 -0
- data/test/resources/validators/foo.rb +9 -0
- data/test/resources/widgets/custom.rb +13 -0
- data/test/test_active_form.rb +1050 -0
- data/test/test_casting.rb +124 -0
- data/test/test_definition.rb +68 -0
- data/test/test_definition_class.rb +118 -0
- data/test/test_element_class.rb +201 -0
- data/test/test_helper.rb +74 -0
- data/test/test_javascript.rb +234 -0
- data/test/test_load_definition.rb +68 -0
- data/test/test_load_element.rb +35 -0
- data/test/test_load_section_element.rb +43 -0
- data/test/test_load_validator.rb +31 -0
- data/test/test_load_widget.rb +93 -0
- data/test/test_validation.rb +722 -0
- data/test/validators/test_validates_as_alpha.rb +26 -0
- data/test/validators/test_validates_as_alphanum.rb +26 -0
- data/test/validators/test_validates_as_digits.rb +26 -0
- data/test/validators/test_validates_as_email.rb +29 -0
- data/test/validators/test_validates_as_number.rb +26 -0
- data/test/validators/test_validates_as_uri.rb +128 -0
- data/test/validators/test_validates_with_format.rb +26 -0
- data/test/validators/test_validates_within_length_range.rb +46 -0
- data/test/validators/test_validates_within_set.rb +46 -0
- data/test/validators/test_validates_within_time_range.rb +53 -0
- metadata +307 -0
- metadata.gz.sig +4 -0
@@ -0,0 +1,34 @@
|
|
1
|
+
desc 'Release the website and new gem version'
|
2
|
+
task :deploy => [:check_version, :website, :release] do
|
3
|
+
puts "Remember to create SVN tag:"
|
4
|
+
puts "svn copy svn+ssh://#{rubyforge_username}@rubyforge.org/var/svn/#{PATH}/trunk " +
|
5
|
+
"svn+ssh://#{rubyforge_username}@rubyforge.org/var/svn/#{PATH}/tags/REL-#{VERS} "
|
6
|
+
puts "Suggested comment:"
|
7
|
+
puts "Tagging release #{CHANGES}"
|
8
|
+
end
|
9
|
+
|
10
|
+
desc 'Runs tasks website_generate and install_gem as a local deployment of the gem'
|
11
|
+
task :local_deploy => [:website_generate, :install_gem]
|
12
|
+
|
13
|
+
task :check_version do
|
14
|
+
unless ENV['VERSION']
|
15
|
+
puts 'Must pass a VERSION=x.y.z release version'
|
16
|
+
exit
|
17
|
+
end
|
18
|
+
unless ENV['VERSION'] == VERS
|
19
|
+
puts "Please update your version.rb to match the release version, currently #{VERS}"
|
20
|
+
exit
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
desc 'Install the package as a gem, without generating documentation(ri/rdoc)'
|
25
|
+
task :install_gem_no_doc => [:clean, :package] do
|
26
|
+
sh "#{'sudo ' unless Hoe::WINDOZE }gem install pkg/*.gem --no-rdoc --no-ri"
|
27
|
+
end
|
28
|
+
|
29
|
+
namespace :manifest do
|
30
|
+
desc 'Recreate Manifest.txt to include ALL files'
|
31
|
+
task :refresh do
|
32
|
+
`rake check_manifest | patch -p0 > Manifest.txt`
|
33
|
+
end
|
34
|
+
end
|
data/tasks/website.rake
ADDED
@@ -0,0 +1,17 @@
|
|
1
|
+
desc 'Generate website files'
|
2
|
+
task :website_generate => :ruby_env do
|
3
|
+
(Dir['website/**/*.txt'] - Dir['website/version*.txt']).each do |txt|
|
4
|
+
sh %{ #{RUBY_APP} script/txt2html #{txt} > #{txt.gsub(/txt$/,'html')} }
|
5
|
+
end
|
6
|
+
end
|
7
|
+
|
8
|
+
desc 'Upload website files to rubyforge'
|
9
|
+
task :website_upload do
|
10
|
+
host = "#{rubyforge_username}@rubyforge.org"
|
11
|
+
remote_dir = "/var/www/gforge-projects/#{PATH}/"
|
12
|
+
local_dir = 'website'
|
13
|
+
sh %{rsync -aCv #{local_dir}/ #{host}:#{remote_dir}}
|
14
|
+
end
|
15
|
+
|
16
|
+
desc 'Generate and upload website files'
|
17
|
+
task :website => [:website_generate, :website_upload, :publish_docs]
|
@@ -0,0 +1,159 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
ActiveForm::Element::Base::create :sample_input do
|
4
|
+
|
5
|
+
def render_element(builder = create_builder)
|
6
|
+
builder.input(element_attributes)
|
7
|
+
builder.input(element_attributes)
|
8
|
+
builder.input(element_attributes)
|
9
|
+
end
|
10
|
+
|
11
|
+
end
|
12
|
+
|
13
|
+
ActiveForm::Element::modify :sample_input do
|
14
|
+
|
15
|
+
def render_element(builder = create_builder)
|
16
|
+
builder.textarea(formatted_value, element_attributes)
|
17
|
+
end
|
18
|
+
|
19
|
+
end
|
20
|
+
|
21
|
+
class TestBaseElement < Test::Unit::TestCase
|
22
|
+
|
23
|
+
def test_standard_attributes
|
24
|
+
assert ActiveForm::Element::Base.element_attribute_names.include?(:title)
|
25
|
+
assert ActiveForm::Element::Base.element_attribute_names.include?(:lang)
|
26
|
+
elem = ActiveForm::Element::Base.new :elem
|
27
|
+
assert elem.respond_to?(:title=)
|
28
|
+
assert elem.respond_to?(:style=)
|
29
|
+
assert elem.respond_to?(:class=)
|
30
|
+
assert elem.respond_to?(:lang=)
|
31
|
+
assert_equal Hash.new, elem.attributes
|
32
|
+
expected = {"name"=>"elem", "class"=>"elem_base", "id"=>"elem"}
|
33
|
+
assert_equal expected, elem.element_attributes
|
34
|
+
end
|
35
|
+
|
36
|
+
def test_set_standard_attributes
|
37
|
+
elem = ActiveForm::Element::Base.new :elem, :title => 'My Element', :lang => 'nl-nl', :unknown => 'will be skipped'
|
38
|
+
expected = {"title"=>"My Element", "lang"=>"nl-nl"}
|
39
|
+
assert_equal expected, elem.attributes
|
40
|
+
expected = {"name"=>"elem", "class"=>"elem_base", "title"=>"My Element", "id"=>"elem", "lang"=>"nl-nl"}
|
41
|
+
assert_equal expected, elem.element_attributes
|
42
|
+
end
|
43
|
+
|
44
|
+
def test_set_custom_attributes
|
45
|
+
elem = ActiveForm::Element::Base.new :elem, :unknown => 'will be skipped'
|
46
|
+
expected = {}
|
47
|
+
assert_equal expected, elem.attributes
|
48
|
+
elem.attributes[:custom] = 'attribute'
|
49
|
+
expected = {"custom"=>"attribute"}
|
50
|
+
assert_equal expected, elem.attributes
|
51
|
+
end
|
52
|
+
|
53
|
+
def test_standard_option_flags
|
54
|
+
elem = ActiveForm::Element::Base.new :elem
|
55
|
+
[:frozen, :hidden, :disabled, :readonly, :required].each do |method|
|
56
|
+
assert ActiveForm::Element::Base.element_option_flag_names.include?(method)
|
57
|
+
assert elem.respond_to?("#{method}")
|
58
|
+
assert elem.respond_to?("#{method}=")
|
59
|
+
assert elem.respond_to?("#{method}?")
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
def test_option_flags_in_css_class
|
64
|
+
elem = ActiveForm::Element::Base.new :elem, :frozen => true, :hidden => true, :disabled => true, :readonly => true, :required => true
|
65
|
+
elem.css_class += "special"
|
66
|
+
assert_equal "elem_base special", elem.css_class.to_s
|
67
|
+
assert_equal "frozen hidden disabled readonly required", elem.runtime_css_class.to_s
|
68
|
+
assert_equal "elem_base special frozen hidden disabled readonly required", elem.css
|
69
|
+
end
|
70
|
+
|
71
|
+
def test_option_flags_in_css_style
|
72
|
+
elem = ActiveForm::Element::Base.new :elem, :frozen => true, :hidden => true, :disabled => true, :required => true
|
73
|
+
assert_equal "", elem.css_style.to_s
|
74
|
+
assert_equal "display: none", elem.style
|
75
|
+
assert_equal elem.runtime_css_style.to_s, elem.style
|
76
|
+
end
|
77
|
+
|
78
|
+
def test_label_css
|
79
|
+
elem = ActiveForm::Element::Base.new :elem, :hidden => true
|
80
|
+
assert_equal "hidden", elem.label_css
|
81
|
+
elem = ActiveForm::Element::Base.new :elem, :hidden => true, :required => true
|
82
|
+
assert_equal "hidden required", elem.label_css
|
83
|
+
[:frozen, :readonly, :disabled].each do |flag|
|
84
|
+
elem = ActiveForm::Element::Base.new :elem, flag => true
|
85
|
+
assert_equal "inactive", elem.label_css
|
86
|
+
end
|
87
|
+
end
|
88
|
+
|
89
|
+
def test_frozen_flag_inheritance
|
90
|
+
form = ActiveForm::compose :form
|
91
|
+
elem = form.text_element :elem
|
92
|
+
section = form.section :section, :frozen => true
|
93
|
+
nested = section.text_element :nested
|
94
|
+
assert !form.frozen?; assert !elem.frozen?; assert section.frozen?; assert nested.frozen?
|
95
|
+
elem.frozen = true
|
96
|
+
assert !form.frozen?; assert elem.frozen?; assert section.frozen?; assert nested.frozen?
|
97
|
+
elem.frozen = false
|
98
|
+
assert !form.frozen?; assert !elem.frozen?; assert section.frozen?; assert nested.frozen?
|
99
|
+
form.frozen = true
|
100
|
+
assert form.frozen?; assert elem.frozen?; assert section.frozen?; assert nested.frozen?
|
101
|
+
end
|
102
|
+
|
103
|
+
def test_render_label
|
104
|
+
elem = ActiveForm::Element::Base.new :elem, :label => 'My Element'
|
105
|
+
assert elem.labelled?
|
106
|
+
assert_equal %|<label for="elem">My Element</label>\n|, elem.render_label
|
107
|
+
elem.hidden = true
|
108
|
+
assert_equal %|<label class="hidden" for="elem">My Element</label>\n|, elem.render_label
|
109
|
+
elem.hidden = false; elem.required = true; elem.frozen = true
|
110
|
+
assert_equal %|<label class="inactive required" for="elem">My Element</label>\n|, elem.render_label
|
111
|
+
end
|
112
|
+
|
113
|
+
def test_frozen_element
|
114
|
+
elem = ActiveForm::Element::Base.new :elem, :frozen => true
|
115
|
+
assert elem.frozen?
|
116
|
+
assert_equal "elem_base", elem.css_class.to_s
|
117
|
+
assert_equal "frozen", elem.runtime_css_class.to_s
|
118
|
+
assert_equal "elem_base frozen", elem.css
|
119
|
+
assert_equal %|<label class="inactive" for="elem">Elem</label>\n|, elem.render_label
|
120
|
+
elem.frozen = false
|
121
|
+
assert !elem.frozen?
|
122
|
+
assert_equal "elem_base", elem.css
|
123
|
+
assert_equal %|<label for="elem">Elem</label>\n|, elem.render_label
|
124
|
+
end
|
125
|
+
|
126
|
+
def test_render_input
|
127
|
+
elem = ActiveForm::Element::Base.new :elem
|
128
|
+
assert_equal elem.render_element, elem.render_input
|
129
|
+
elem = ActiveForm::Element::Base.new :elem, :frozen => true
|
130
|
+
assert elem.frozen?
|
131
|
+
assert_equal elem.render_frozen, elem.render_input
|
132
|
+
end
|
133
|
+
|
134
|
+
def test_element_to_html
|
135
|
+
elem = ActiveForm::Element::Base.new :elem
|
136
|
+
expected = %|<span class="elem_base" id="elem">Elem</span>\n|
|
137
|
+
assert_equal expected, elem.to_html
|
138
|
+
end
|
139
|
+
|
140
|
+
def test_to_label
|
141
|
+
elem = ActiveForm::Element::Base.new :elem, :label => 'My Element'
|
142
|
+
assert_equal elem.render_label, elem.to_label
|
143
|
+
end
|
144
|
+
|
145
|
+
def test_to_input
|
146
|
+
elem = ActiveForm::Element::Base.new :elem
|
147
|
+
assert_equal elem.render_element, elem.to_input
|
148
|
+
elem = ActiveForm::Element::Base.new :elem, :frozen => true
|
149
|
+
assert elem.frozen?
|
150
|
+
assert_equal elem.render_frozen, elem.to_input
|
151
|
+
end
|
152
|
+
|
153
|
+
def test_modified_element_class_definition
|
154
|
+
elem = ActiveForm::Element::SampleInput.new :elem, :value => 'Some text...'
|
155
|
+
expected = %|<textarea class="elem_sample_input" id="elem" name="elem">Some text...</textarea>\n|
|
156
|
+
assert_equal expected, elem.to_html
|
157
|
+
end
|
158
|
+
|
159
|
+
end
|
@@ -0,0 +1,81 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
ActiveForm::Element::Builder::create :some_snippet do |builder, elem|
|
4
|
+
|
5
|
+
builder.h1('A preset element')
|
6
|
+
builder.p('Just an example of what you can do...')
|
7
|
+
|
8
|
+
end
|
9
|
+
|
10
|
+
class TestBuilderElement < Test::Unit::TestCase
|
11
|
+
|
12
|
+
def test_element_to_html
|
13
|
+
elem = ActiveForm::Element::Builder.new :elem, :html => 'raw html string'
|
14
|
+
assert_equal %|raw html string\n|, elem.to_html
|
15
|
+
|
16
|
+
elem = ActiveForm::Element::Builder.new :elem do |builder, e|
|
17
|
+
builder.div('built with block')
|
18
|
+
end
|
19
|
+
assert_equal %|<div>built with block</div>\n|, elem.to_html
|
20
|
+
|
21
|
+
elem = ActiveForm::Element::Builder.new :elem, :html => 'raw html string and builder block' do |builder, e|
|
22
|
+
builder.div(e.value)
|
23
|
+
end
|
24
|
+
assert_equal %|<div>raw html string and builder block</div>\n|, elem.to_html
|
25
|
+
end
|
26
|
+
|
27
|
+
def test_build_html
|
28
|
+
form = ActiveForm::compose :form do |f|
|
29
|
+
f.html :named do |builder, e|
|
30
|
+
builder.h1('My Pretty form')
|
31
|
+
builder.dl {
|
32
|
+
e.container.get_elements_of_type(:text).each do |e|
|
33
|
+
builder.dt(e.label)
|
34
|
+
builder.dd(e.value)
|
35
|
+
end
|
36
|
+
}
|
37
|
+
end
|
38
|
+
f.text_element :name
|
39
|
+
f.text_element :city
|
40
|
+
f.html { |builder, e| builder.hr }
|
41
|
+
end
|
42
|
+
form.values = { :name => 'Fred', :city => 'Bedrock' }
|
43
|
+
expected = %|<form action="#form" class="active_form" id="form" method="post">
|
44
|
+
<h1>My Pretty form</h1>
|
45
|
+
<dl>
|
46
|
+
<dt>Name</dt>
|
47
|
+
<dd>Fred</dd>
|
48
|
+
<dt>City</dt>
|
49
|
+
<dd>Bedrock</dd>
|
50
|
+
</dl>
|
51
|
+
<input class="elem_text" id="form_name" name="form[name]" size="30" type="text" value="Fred"/>
|
52
|
+
<input class="elem_text" id="form_city" name="form[city]" size="30" type="text" value="Bedrock"/>
|
53
|
+
<hr/>
|
54
|
+
</form>\n|
|
55
|
+
assert_equal expected, form.to_html
|
56
|
+
end
|
57
|
+
|
58
|
+
def test_add_raw_string
|
59
|
+
form = ActiveForm::compose :form
|
60
|
+
form << '<h1>My Form</h1>'
|
61
|
+
form.text_element :name
|
62
|
+
form << '<hr />'
|
63
|
+
expected = %|<form action="#form" class="active_form" id="form" method="post">
|
64
|
+
<h1>My Form</h1>
|
65
|
+
<input class="elem_text" id="form_name" name="form[name]" size="30" type="text"/>
|
66
|
+
<hr />
|
67
|
+
</form>\n|
|
68
|
+
assert_equal expected, form.to_html
|
69
|
+
end
|
70
|
+
|
71
|
+
def test_add_predefined_html_snippet_element
|
72
|
+
form = ActiveForm::compose :form
|
73
|
+
form.some_snippet_element
|
74
|
+
expected = %|<form action="#form" class="active_form" id="form" method="post">
|
75
|
+
<h1>A preset element</h1>
|
76
|
+
<p>Just an example of what you can do...</p>
|
77
|
+
</form>\n|
|
78
|
+
assert_equal expected, form.to_html
|
79
|
+
end
|
80
|
+
|
81
|
+
end
|
@@ -0,0 +1,12 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
class TestButtonElement < Test::Unit::TestCase
|
4
|
+
|
5
|
+
def test_element_to_html
|
6
|
+
elem = ActiveForm::Element::Button.new :elem, :label => 'Do it!'
|
7
|
+
assert !elem.labelled?
|
8
|
+
expected = %|<input class="elem_button" id="elem" name="elem" type="button" value="Do it!"/>\n|
|
9
|
+
assert_equal expected, elem.to_html
|
10
|
+
end
|
11
|
+
|
12
|
+
end
|
@@ -0,0 +1,233 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
class TestCheckboxElement < Test::Unit::TestCase
|
4
|
+
|
5
|
+
def test_standard_values
|
6
|
+
elem = ActiveForm::Element::Checkbox.new :elem
|
7
|
+
assert_equal nil, elem.fallback_value
|
8
|
+
assert_equal 1, elem.checked_value
|
9
|
+
assert_equal nil, elem.export_value
|
10
|
+
elem.checked = true
|
11
|
+
assert_equal 1, elem.export_value
|
12
|
+
expected = %|<input checked="checked" class="elem_checkbox" id="elem" name="elem" type="checkbox" value="1"/>\n|
|
13
|
+
assert_equal expected, elem.to_html
|
14
|
+
end
|
15
|
+
|
16
|
+
def test_element_to_html
|
17
|
+
elem = ActiveForm::Element::Checkbox.new :elem, :option => 'yes'
|
18
|
+
assert !elem.checked?
|
19
|
+
assert_equal nil, elem.value
|
20
|
+
expected = %|<input class="elem_checkbox" id="elem" name="elem" type="checkbox" value="yes"/>\n|
|
21
|
+
assert_equal expected, elem.to_html
|
22
|
+
|
23
|
+
elem = ActiveForm::Element::Checkbox.new :elem, :option => 'yes', :checked => true
|
24
|
+
assert elem.checked?
|
25
|
+
assert_equal 'yes', elem.value
|
26
|
+
expected = %|<input checked="checked" class="elem_checkbox" id="elem" name="elem" type="checkbox" value="yes"/>\n|
|
27
|
+
assert_equal expected, elem.to_html
|
28
|
+
end
|
29
|
+
|
30
|
+
def test_set_options
|
31
|
+
elem = ActiveForm::Element::Checkbox.new :elem, :options => ['yes', 'no']
|
32
|
+
assert !elem.checked?
|
33
|
+
expected = %|<input class="elem_checkbox" id="elem" name="elem" type="checkbox" value="yes"/>\n|
|
34
|
+
assert_equal expected, elem.to_html
|
35
|
+
|
36
|
+
elem.value = 'yes'
|
37
|
+
assert elem.checked?
|
38
|
+
expected = %|<input checked="checked" class="elem_checkbox" id="elem" name="elem" type="checkbox" value="yes"/>\n|
|
39
|
+
assert_equal expected, elem.to_html
|
40
|
+
end
|
41
|
+
|
42
|
+
def test_unknown_value
|
43
|
+
elem = ActiveForm::Element::Checkbox.new :elem, :option => 'yes'
|
44
|
+
elem.value = 'unknown'
|
45
|
+
assert !elem.checked?
|
46
|
+
assert_equal nil, elem.element_value
|
47
|
+
|
48
|
+
elem.value = 'yes'
|
49
|
+
assert elem.checked?
|
50
|
+
assert_equal 'yes', elem.element_value
|
51
|
+
|
52
|
+
elem = ActiveForm::Element::Checkbox.new :elem, :options => ['yes', 'no']
|
53
|
+
elem.value = 'unknown'
|
54
|
+
assert !elem.checked?
|
55
|
+
assert_equal 'no', elem.element_value
|
56
|
+
|
57
|
+
elem.value = 'yes'
|
58
|
+
assert elem.checked?
|
59
|
+
assert_equal 'yes', elem.element_value
|
60
|
+
end
|
61
|
+
|
62
|
+
def test_set_checked
|
63
|
+
elem = ActiveForm::Element::Checkbox.new :elem, :options => ['yes', 'no'], :checked => true
|
64
|
+
assert elem.checked?
|
65
|
+
assert_equal 'yes', elem.checked_value
|
66
|
+
assert_equal 'no', elem.fallback_value
|
67
|
+
assert_equal 'yes', elem.export_value
|
68
|
+
assert_equal 'yes', elem.element_value
|
69
|
+
|
70
|
+
elem.checked = false
|
71
|
+
assert !elem.checked?
|
72
|
+
assert_equal 'yes', elem.checked_value
|
73
|
+
assert_equal 'no', elem.fallback_value
|
74
|
+
assert_equal 'no', elem.export_value
|
75
|
+
assert_equal 'no', elem.element_value
|
76
|
+
|
77
|
+
elem.checked = true
|
78
|
+
assert elem.checked?
|
79
|
+
assert_equal 'yes', elem.checked_value
|
80
|
+
assert_equal 'no', elem.fallback_value
|
81
|
+
assert_equal 'yes', elem.export_value
|
82
|
+
assert_equal 'yes', elem.element_value
|
83
|
+
end
|
84
|
+
|
85
|
+
def test_on_off_value
|
86
|
+
elem = ActiveForm::Element::Checkbox.new :elem, :options => ['yes', 'no']
|
87
|
+
assert !elem.checked?
|
88
|
+
assert_equal 'yes', elem.checked_value
|
89
|
+
assert_equal 'no', elem.fallback_value
|
90
|
+
assert_equal 'no', elem.export_value
|
91
|
+
assert_equal 'no', elem.element_value
|
92
|
+
|
93
|
+
elem.update_from_params('yes')
|
94
|
+
assert elem.checked?
|
95
|
+
assert_equal 'yes', elem.element_value
|
96
|
+
|
97
|
+
elem.update_from_params('no')
|
98
|
+
assert !elem.checked?
|
99
|
+
assert_equal 'no', elem.element_value
|
100
|
+
|
101
|
+
elem.update_from_params(nil)
|
102
|
+
assert !elem.checked?
|
103
|
+
assert_equal 'no', elem.element_value
|
104
|
+
end
|
105
|
+
|
106
|
+
def test_update_from_params
|
107
|
+
form = ActiveForm::compose :myform do |f|
|
108
|
+
f.text_element :first_name
|
109
|
+
f.text_element :last_name
|
110
|
+
f.checkbox_element :confirm, :options => ['yes', 'no'], :value => 'yes'
|
111
|
+
f.submit_element :send
|
112
|
+
end
|
113
|
+
assert form[:confirm].checked?
|
114
|
+
|
115
|
+
params = { :myform => { :first_name => 'Fred', :last_name => 'Flintstone', :confirm => 'yes' } }
|
116
|
+
form.update_from_params(params)
|
117
|
+
assert form[:confirm].checked?
|
118
|
+
|
119
|
+
params = { :myform => { :first_name => 'Fred', :last_name => 'Flintstone', :confirm => 'no' } }
|
120
|
+
form.update_from_params(params)
|
121
|
+
assert !form[:confirm].checked?
|
122
|
+
form[:confirm].checked = true
|
123
|
+
|
124
|
+
params = { :myform => { :first_name => 'Fred', :last_name => 'Flintstone', :confirm => nil } }
|
125
|
+
form.update_from_params(params)
|
126
|
+
assert !form[:confirm].checked?
|
127
|
+
form[:confirm].checked = true
|
128
|
+
|
129
|
+
params = { :myform => { :first_name => 'Fred', :last_name => 'Flintstone', :confirm => nil } }
|
130
|
+
form.update_from_params(params)
|
131
|
+
assert !form[:confirm].checked?
|
132
|
+
form[:confirm].checked = true
|
133
|
+
|
134
|
+
params = { :myform => { :first_name => 'Fred', :last_name => 'Flintstone' } }
|
135
|
+
form.update_from_params(params)
|
136
|
+
assert !form[:confirm].checked?
|
137
|
+
end
|
138
|
+
|
139
|
+
def test_if_checked
|
140
|
+
elem = ActiveForm::Element::Checkbox.new :elem, :option => 'yes'
|
141
|
+
assert_equal 'yes', elem.checked_value
|
142
|
+
assert_equal nil, elem.fallback_value
|
143
|
+
assert_equal nil, elem.export_value
|
144
|
+
assert_equal nil, elem.element_value
|
145
|
+
assert !elem.active?
|
146
|
+
assert !elem.checked?
|
147
|
+
assert !elem.selected?
|
148
|
+
|
149
|
+
elem.update_from_params('yes')
|
150
|
+
assert elem.active?
|
151
|
+
assert elem.checked?
|
152
|
+
assert elem.selected?
|
153
|
+
assert_equal 'yes', elem.element_value
|
154
|
+
|
155
|
+
elem.update_from_params('no')
|
156
|
+
assert !elem.checked?
|
157
|
+
assert_equal nil, elem.element_value
|
158
|
+
|
159
|
+
elem.update_from_params(nil)
|
160
|
+
assert !elem.checked?
|
161
|
+
assert_equal nil, elem.element_value
|
162
|
+
end
|
163
|
+
|
164
|
+
def test_required_validation
|
165
|
+
form = ActiveForm::compose :myform do |f|
|
166
|
+
f.text_element :first_name
|
167
|
+
f.text_element :last_name
|
168
|
+
f.checkbox_element :confirm, :options => ['yes', 'no'], :required => true
|
169
|
+
f.submit_element :send
|
170
|
+
end
|
171
|
+
|
172
|
+
assert_equal 0, form[:confirm].element_errors.length
|
173
|
+
assert_equal '', form[:confirm].validation_advice
|
174
|
+
|
175
|
+
validator = form[:confirm].validators.detect { |v| v.code == 'required' }
|
176
|
+
assert_kind_of ActiveForm::Validator::Proc, validator
|
177
|
+
assert !form.validate
|
178
|
+
expected = %|<div class="validation-advice advice-confirm" id="advice-validate-confirm-myform_confirm">Confirm: validation failed</div>\n|
|
179
|
+
assert_equal expected, form[:confirm].validation_advice
|
180
|
+
|
181
|
+
form[:confirm].value = 'no'
|
182
|
+
assert !form.validate
|
183
|
+
assert_equal expected, form[:confirm].validation_advice
|
184
|
+
|
185
|
+
form[:confirm].value = 'yes'
|
186
|
+
assert form.validate
|
187
|
+
assert_equal '', form[:confirm].validation_advice
|
188
|
+
|
189
|
+
form[:confirm].required_message = 'you need to confirm this'
|
190
|
+
assert_equal 'you need to confirm this', validator.message
|
191
|
+
|
192
|
+
form[:confirm].required = false
|
193
|
+
validator = form[:confirm].validators.detect { |v| v.code == 'required' }
|
194
|
+
assert_equal nil, validator
|
195
|
+
end
|
196
|
+
|
197
|
+
def test_set_values_beforehand
|
198
|
+
person = { :first_name => 'Fred', :last_name => 'Flintstone', :confirm => 'yes' }
|
199
|
+
|
200
|
+
form = ActiveForm::compose :myform, :values => person do |f|
|
201
|
+
f.text_element :first_name, :required => true
|
202
|
+
f.text_element :last_name, :required => true
|
203
|
+
f.checkbox_element :confirm, :options => ['yes', 'no'], :required => true
|
204
|
+
f.submit_element :send
|
205
|
+
end
|
206
|
+
|
207
|
+
assert form[:confirm].checked?
|
208
|
+
expected = %|<input checked="checked" class="elem_checkbox required" id="myform_confirm" name="myform[confirm]" type="checkbox" value="yes"/>\n|
|
209
|
+
assert_equal expected, form[:confirm].to_html
|
210
|
+
end
|
211
|
+
|
212
|
+
def test_add_multiple_radio_elements
|
213
|
+
form = ActiveForm::compose :myform do |f|
|
214
|
+
f.checkbox_element :elem_a, :option => 'A', :group => :choice
|
215
|
+
f.checkbox_element :elem_b, :option => 'B', :group => :choice, :checked => true
|
216
|
+
end
|
217
|
+
assert !form[:elem_a].checked?
|
218
|
+
assert form[:elem_b].checked?
|
219
|
+
|
220
|
+
assert_equal 'A', form[:elem_a].checked_value
|
221
|
+
assert_equal 'B', form[:elem_b].checked_value
|
222
|
+
|
223
|
+
assert_equal 'myform[choice][]', form[:elem_a].element_name
|
224
|
+
assert_equal 'myform[choice][]', form[:elem_b].element_name
|
225
|
+
|
226
|
+
assert_equal 'myform_elem_a', form[:elem_a].identifier
|
227
|
+
assert_equal 'myform_elem_b', form[:elem_b].identifier
|
228
|
+
|
229
|
+
expected = { "choice" => ["B"] }
|
230
|
+
assert_equal expected, form.export_values
|
231
|
+
end
|
232
|
+
|
233
|
+
end
|