active_form 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (184) hide show
  1. data.tar.gz.sig +2 -0
  2. data/History.txt +4 -0
  3. data/License.txt +20 -0
  4. data/MIT-LICENSE +19 -0
  5. data/Manifest.txt +181 -0
  6. data/README.txt +1 -0
  7. data/Rakefile +4 -0
  8. data/config/hoe.rb +71 -0
  9. data/config/requirements.rb +17 -0
  10. data/init.rb +5 -0
  11. data/lib/active_form.rb +86 -0
  12. data/lib/active_form/core_extensions.rb +179 -0
  13. data/lib/active_form/definition.rb +72 -0
  14. data/lib/active_form/element.rb +50 -0
  15. data/lib/active_form/elements/base.rb +67 -0
  16. data/lib/active_form/elements/builder.rb +103 -0
  17. data/lib/active_form/elements/button.rb +15 -0
  18. data/lib/active_form/elements/checkbox.rb +18 -0
  19. data/lib/active_form/elements/file.rb +15 -0
  20. data/lib/active_form/elements/hidden.rb +9 -0
  21. data/lib/active_form/elements/image.rb +7 -0
  22. data/lib/active_form/elements/input.rb +23 -0
  23. data/lib/active_form/elements/password.rb +12 -0
  24. data/lib/active_form/elements/radio.rb +18 -0
  25. data/lib/active_form/elements/reset.rb +15 -0
  26. data/lib/active_form/elements/section.rb +37 -0
  27. data/lib/active_form/elements/select.rb +42 -0
  28. data/lib/active_form/elements/submit.rb +19 -0
  29. data/lib/active_form/elements/text.rb +9 -0
  30. data/lib/active_form/elements/textarea.rb +18 -0
  31. data/lib/active_form/errors.rb +73 -0
  32. data/lib/active_form/facets/checkbox_group.rb +11 -0
  33. data/lib/active_form/facets/collection_input.rb +96 -0
  34. data/lib/active_form/facets/radio_group.rb +11 -0
  35. data/lib/active_form/facets/select_date.rb +10 -0
  36. data/lib/active_form/facets/select_datetime.rb +10 -0
  37. data/lib/active_form/facets/select_day.rb +17 -0
  38. data/lib/active_form/facets/select_from_model.rb +60 -0
  39. data/lib/active_form/facets/select_hour.rb +17 -0
  40. data/lib/active_form/facets/select_minute.rb +17 -0
  41. data/lib/active_form/facets/select_month.rb +46 -0
  42. data/lib/active_form/facets/select_numeric_range.rb +59 -0
  43. data/lib/active_form/facets/select_second.rb +17 -0
  44. data/lib/active_form/facets/select_time.rb +10 -0
  45. data/lib/active_form/facets/select_timebased.rb +145 -0
  46. data/lib/active_form/facets/select_weekday.rb +46 -0
  47. data/lib/active_form/facets/select_year.rb +24 -0
  48. data/lib/active_form/mixins/attribute_methods.rb +33 -0
  49. data/lib/active_form/mixins/casting.rb +152 -0
  50. data/lib/active_form/mixins/collection_element_methods.rb +204 -0
  51. data/lib/active_form/mixins/common_methods.rb +350 -0
  52. data/lib/active_form/mixins/container_methods.rb +417 -0
  53. data/lib/active_form/mixins/css_methods.rb +70 -0
  54. data/lib/active_form/mixins/element_methods.rb +314 -0
  55. data/lib/active_form/mixins/javascript_methods.rb +99 -0
  56. data/lib/active_form/mixins/loader_methods.rb +72 -0
  57. data/lib/active_form/mixins/option_element_methods.rb +61 -0
  58. data/lib/active_form/mixins/validation_methods.rb +253 -0
  59. data/lib/active_form/validator.rb +47 -0
  60. data/lib/active_form/validators/alpha.rb +9 -0
  61. data/lib/active_form/validators/alphanum.rb +9 -0
  62. data/lib/active_form/validators/base.rb +132 -0
  63. data/lib/active_form/validators/digits.rb +9 -0
  64. data/lib/active_form/validators/email.rb +29 -0
  65. data/lib/active_form/validators/format.rb +15 -0
  66. data/lib/active_form/validators/length_range.rb +24 -0
  67. data/lib/active_form/validators/number.rb +9 -0
  68. data/lib/active_form/validators/option_count.rb +24 -0
  69. data/lib/active_form/validators/proc.rb +22 -0
  70. data/lib/active_form/validators/required.rb +9 -0
  71. data/lib/active_form/validators/set.rb +21 -0
  72. data/lib/active_form/validators/time_range.rb +30 -0
  73. data/lib/active_form/validators/uri.rb +54 -0
  74. data/lib/active_form/version.rb +9 -0
  75. data/lib/active_form/views/fieldsets.rb +34 -0
  76. data/lib/active_form/views/plain.rb +32 -0
  77. data/lib/active_form/views/tables.rb +28 -0
  78. data/lib/active_form/widget.rb +43 -0
  79. data/lib/active_form/widgets/base.rb +28 -0
  80. data/lib/loob/uri_validator.rb +140 -0
  81. data/lib/rails/acts_as_dropdown/MIT-LICENSE +20 -0
  82. data/lib/rails/acts_as_dropdown/acts_as_dropdown.rb +119 -0
  83. data/lib/rails/acts_as_dropdown/dropdown.rb +27 -0
  84. data/lib/rails/controller_helper.rb +19 -0
  85. data/lib/rails/model/loader.rb +206 -0
  86. data/lib/rails/view_helper.rb +20 -0
  87. data/samples/html/css/style.css +175 -0
  88. data/samples/html/js/effects.js +958 -0
  89. data/samples/html/js/prototype.js +2006 -0
  90. data/samples/html/js/validation.js +228 -0
  91. data/samples/html/plain_view.html +77 -0
  92. data/samples/html/sample001.html +158 -0
  93. data/samples/html/sample002.html +76 -0
  94. data/samples/html/sample003.html +34 -0
  95. data/samples/layouts/default.rhtml +18 -0
  96. data/samples/layouts/plain.rhtml +21 -0
  97. data/samples/layouts/sample003.rhtml +25 -0
  98. data/samples/plain_view.rb +58 -0
  99. data/samples/sample001.rb +111 -0
  100. data/samples/sample002.rb +92 -0
  101. data/samples/sample003.rb +30 -0
  102. data/script/destroy +14 -0
  103. data/script/generate +14 -0
  104. data/script/txt2html +74 -0
  105. data/setup.rb +1585 -0
  106. data/tasks/deployment.rake +34 -0
  107. data/tasks/environment.rake +7 -0
  108. data/tasks/website.rake +17 -0
  109. data/test/elements/test_base_element.rb +159 -0
  110. data/test/elements/test_builder_element.rb +81 -0
  111. data/test/elements/test_button_element.rb +12 -0
  112. data/test/elements/test_checkbox_element.rb +233 -0
  113. data/test/elements/test_file_element.rb +20 -0
  114. data/test/elements/test_hidden_element.rb +11 -0
  115. data/test/elements/test_image_element.rb +11 -0
  116. data/test/elements/test_input_element.rb +39 -0
  117. data/test/elements/test_password_element.rb +16 -0
  118. data/test/elements/test_radio_element.rb +197 -0
  119. data/test/elements/test_reset_element.rb +12 -0
  120. data/test/elements/test_section_element.rb +162 -0
  121. data/test/elements/test_select_element.rb +364 -0
  122. data/test/elements/test_submit_element.rb +12 -0
  123. data/test/elements/test_text_element.rb +91 -0
  124. data/test/elements/test_textarea_element.rb +23 -0
  125. data/test/facets/test_checkbox_group_element.rb +388 -0
  126. data/test/facets/test_radio_group_element.rb +312 -0
  127. data/test/facets/test_select_date_element.rb +211 -0
  128. data/test/facets/test_select_datetime_element.rb +56 -0
  129. data/test/facets/test_select_day_element.rb +37 -0
  130. data/test/facets/test_select_from_model_element.rb +86 -0
  131. data/test/facets/test_select_hour_element.rb +37 -0
  132. data/test/facets/test_select_minute_element.rb +52 -0
  133. data/test/facets/test_select_month_element.rb +79 -0
  134. data/test/facets/test_select_numeric_range_element.rb +14 -0
  135. data/test/facets/test_select_second_element.rb +48 -0
  136. data/test/facets/test_select_time_element.rb +148 -0
  137. data/test/facets/test_select_weekday_element.rb +71 -0
  138. data/test/facets/test_select_year_element.rb +73 -0
  139. data/test/fixtures/author.rb +11 -0
  140. data/test/fixtures/authors.yml +0 -0
  141. data/test/fixtures/book.rb +14 -0
  142. data/test/fixtures/books.yml +8 -0
  143. data/test/fixtures/categories.yml +0 -0
  144. data/test/fixtures/categorization.rb +2 -0
  145. data/test/fixtures/categorizations.yml +0 -0
  146. data/test/fixtures/category.rb +8 -0
  147. data/test/fixtures/publisher.rb +5 -0
  148. data/test/fixtures/publishers.yml +10 -0
  149. data/test/fixtures/schema.rb +43 -0
  150. data/test/rails/test_model_autodefinition.rb +121 -0
  151. data/test/rails/test_model_loader.rb +61 -0
  152. data/test/resources/elements/chunky.rb +11 -0
  153. data/test/resources/forms/demo.rb +5 -0
  154. data/test/resources/models/book.rb +8 -0
  155. data/test/resources/models/register_publisher.rb +5 -0
  156. data/test/resources/sections/demo.rb +6 -0
  157. data/test/resources/sections/foo.rb +6 -0
  158. data/test/resources/validators/foo.rb +9 -0
  159. data/test/resources/widgets/custom.rb +13 -0
  160. data/test/test_active_form.rb +1050 -0
  161. data/test/test_casting.rb +124 -0
  162. data/test/test_definition.rb +68 -0
  163. data/test/test_definition_class.rb +118 -0
  164. data/test/test_element_class.rb +201 -0
  165. data/test/test_helper.rb +74 -0
  166. data/test/test_javascript.rb +234 -0
  167. data/test/test_load_definition.rb +68 -0
  168. data/test/test_load_element.rb +35 -0
  169. data/test/test_load_section_element.rb +43 -0
  170. data/test/test_load_validator.rb +31 -0
  171. data/test/test_load_widget.rb +93 -0
  172. data/test/test_validation.rb +722 -0
  173. data/test/validators/test_validates_as_alpha.rb +26 -0
  174. data/test/validators/test_validates_as_alphanum.rb +26 -0
  175. data/test/validators/test_validates_as_digits.rb +26 -0
  176. data/test/validators/test_validates_as_email.rb +29 -0
  177. data/test/validators/test_validates_as_number.rb +26 -0
  178. data/test/validators/test_validates_as_uri.rb +128 -0
  179. data/test/validators/test_validates_with_format.rb +26 -0
  180. data/test/validators/test_validates_within_length_range.rb +46 -0
  181. data/test/validators/test_validates_within_set.rb +46 -0
  182. data/test/validators/test_validates_within_time_range.rb +53 -0
  183. metadata +307 -0
  184. metadata.gz.sig +4 -0
@@ -0,0 +1,20 @@
1
+ require 'test_helper'
2
+
3
+ class TestFileElement < Test::Unit::TestCase
4
+
5
+ def test_set_attributes
6
+ [:title, :lang, :size, :accept].each do |attribute|
7
+ assert ActiveForm::Element::File.element_attribute_names.include?(attribute)
8
+ end
9
+ elem = ActiveForm::Element::File.new :elem, :size => 20, :accept => 'image/jpeg image/jpg image/png'
10
+ expected = {"name"=>"elem", "class"=>"elem_file", "id"=>"elem", "size"=>20, "type"=>"file", "accept"=>"image/jpeg image/jpg image/png"}
11
+ assert_equal expected, elem.element_attributes
12
+ end
13
+
14
+ def test_element_to_html
15
+ elem = ActiveForm::Element::File.new :elem
16
+ expected = %|<input class="elem_file" id="elem" name="elem" type="file"/>\n|
17
+ assert_equal expected, elem.to_html
18
+ end
19
+
20
+ end
@@ -0,0 +1,11 @@
1
+ require 'test_helper'
2
+
3
+ class TestHiddenElement < Test::Unit::TestCase
4
+
5
+ def test_element_to_html
6
+ elem = ActiveForm::Element::Hidden.new :elem, :value => 'test'
7
+ expected = %|<input id="elem" name="elem" type="hidden" value="test"/>\n|
8
+ assert_equal expected, elem.to_html
9
+ end
10
+
11
+ end
@@ -0,0 +1,11 @@
1
+ require 'test_helper'
2
+
3
+ class TestImageElement < Test::Unit::TestCase
4
+
5
+ def test_element_to_html
6
+ elem = ActiveForm::Element::Image.new :elem
7
+ expected = %|<input class="elem_image" id="elem" name="elem" type="image"/>\n|
8
+ assert_equal expected, elem.to_html
9
+ end
10
+
11
+ end
@@ -0,0 +1,39 @@
1
+ require 'test_helper'
2
+
3
+ class TestInputElement < Test::Unit::TestCase
4
+
5
+ def test_set_attributes
6
+ [:title, :lang, :type, :value].each do |attribute|
7
+ assert ActiveForm::Element::Input.element_attribute_names.include?(attribute)
8
+ end
9
+
10
+ elem = ActiveForm::Element::Input.new :elem, :type => 'password', :value => 'secret'
11
+ expected = {"name"=>"elem", "class"=>"elem_input", "type"=>"password", "id"=>"elem", "value"=>"secret"}
12
+ assert_equal expected, elem.element_attributes
13
+ end
14
+
15
+ def test_element_to_html
16
+ elem = ActiveForm::Element::Input.new :elem, :type => 'hidden'
17
+ expected = %|<input class="elem_input" id="elem" name="elem" type="hidden"/>\n|
18
+ assert_equal expected, elem.to_html
19
+ end
20
+
21
+ def test_autocomplete_off
22
+ elem = ActiveForm::Element::Input.new :elem, :type => 'text', :autocomplete_off => true
23
+ expected = %|<input autocomplete="off" class="elem_input" id="elem" name="elem" type="text"/>\n|
24
+ assert_equal expected, elem.to_html
25
+ end
26
+
27
+ def test_accesskey_attribute
28
+ elem = ActiveForm::Element::Input.new :elem, :type => 'text', :accesskey => 'f'
29
+ expected = %|<input accesskey="f" class="elem_input" id="elem" name="elem" type="text"/>\n|
30
+ assert_equal expected, elem.to_html
31
+ end
32
+
33
+ def test_tabindex_attribute
34
+ elem = ActiveForm::Element::Input.new :elem, :type => 'text', :tabindex => '2'
35
+ expected = %|<input class="elem_input" id="elem" name="elem" tabindex="2" type="text"/>\n|
36
+ assert_equal expected, elem.to_html
37
+ end
38
+
39
+ end
@@ -0,0 +1,16 @@
1
+ require 'test_helper'
2
+
3
+ class TestPasswordElement < Test::Unit::TestCase
4
+
5
+ def test_element_to_html
6
+ elem = ActiveForm::Element::Password.new :elem, :value => 'secret'
7
+ expected = %|<input class="elem_password" id="elem" name="elem" size="30" type="password" value="secret"/>\n|
8
+ assert_equal expected, elem.to_html
9
+ end
10
+
11
+ def test_render_frozen
12
+ elem = ActiveForm::Element::Password.new :elem, :value => 'secret', :frozen => true
13
+ assert_equal '&#8226;&#8226;&#8226;&#8226;&#8226;&#8226;', elem.to_html
14
+ end
15
+
16
+ end
@@ -0,0 +1,197 @@
1
+ require 'test_helper'
2
+
3
+ class TestRadioElement < Test::Unit::TestCase
4
+
5
+ def test_standard_values
6
+ elem = ActiveForm::Element::Radio.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_radio" id="elem" name="elem" type="radio" value="1"/>\n|
13
+ assert_equal expected, elem.to_html
14
+ end
15
+
16
+ def test_element_to_html
17
+ elem = ActiveForm::Element::Radio.new :elem, :option => 'yes'
18
+ assert !elem.checked?
19
+ assert_equal nil, elem.value
20
+ expected = %|<input class="elem_radio" id="elem" name="elem" type="radio" value="yes"/>\n|
21
+ assert_equal expected, elem.to_html
22
+
23
+ elem = ActiveForm::Element::Radio.new :elem, :option => 'yes', :checked => true
24
+ assert elem.checked?
25
+ assert_equal 'yes', elem.value
26
+ expected = %|<input checked="checked" class="elem_radio" id="elem" name="elem" type="radio" value="yes"/>\n|
27
+ assert_equal expected, elem.to_html
28
+ end
29
+
30
+ def test_set_options
31
+ elem = ActiveForm::Element::Radio.new :elem, :options => ['yes', 'no']
32
+ assert !elem.checked?
33
+ expected = %|<input class="elem_radio" id="elem" name="elem" type="radio" 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_radio" id="elem" name="elem" type="radio" value="yes"/>\n|
39
+ assert_equal expected, elem.to_html
40
+ end
41
+
42
+ def test_unknown_value
43
+ elem = ActiveForm::Element::Radio.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::Radio.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::Radio.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::Radio.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.radio_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::Radio.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.radio_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
+ end
@@ -0,0 +1,12 @@
1
+ require 'test_helper'
2
+
3
+ class TestResetElement < Test::Unit::TestCase
4
+
5
+ def test_element_to_html
6
+ elem = ActiveForm::Element::Reset.new :elem, :label => 'Reset data'
7
+ assert !elem.labelled?
8
+ expected = %|<input class="elem_reset" id="elem" name="elem" type="reset" value="Reset data"/>\n|
9
+ assert_equal expected, elem.to_html
10
+ end
11
+
12
+ end
@@ -0,0 +1,162 @@
1
+ require 'test_helper'
2
+
3
+ class TestSectionElement < Test::Unit::TestCase
4
+
5
+ def test_standard_attributes
6
+ assert ActiveForm::Element::Section.element_attribute_names.include?(:title)
7
+ assert ActiveForm::Element::Section.element_attribute_names.include?(:lang)
8
+ elem = ActiveForm::Element::Section.new :elem
9
+ assert elem.respond_to?(:title=)
10
+ assert elem.respond_to?(:style=)
11
+ assert elem.respond_to?(:class=)
12
+ assert elem.respond_to?(:lang=)
13
+ assert_equal Hash.new, elem.attributes
14
+ expected = {"class"=>"active_section", "id"=>"elem"}
15
+ assert_equal expected, elem.element_attributes
16
+ end
17
+
18
+ def test_set_standard_attributes
19
+ elem = ActiveForm::Element::Section.new :section, :title => 'My Element', :lang => 'nl-nl'
20
+ expected = {"title"=>"My Element", "lang"=>"nl-nl"}
21
+ assert_equal expected, elem.attributes
22
+ expected = {"id"=>"section", "class"=>"active_section", "title"=>"My Element", "lang"=>"nl-nl"}
23
+ assert_equal expected, elem.element_attributes
24
+ end
25
+
26
+ def test_standard_option_flags
27
+ section = ActiveForm::Element::Section.new :section
28
+ [:frozen, :hidden, :disabled, :readonly, :required].each do |method|
29
+ assert ActiveForm::Element::Section.element_option_flag_names.include?(method)
30
+ assert section.respond_to?("#{method}")
31
+ assert section.respond_to?("#{method}=")
32
+ assert section.respond_to?("#{method}?")
33
+ end
34
+ end
35
+
36
+ def test_render_label
37
+ section = ActiveForm::Element::Section.new :section, :label => 'My Section'
38
+ assert_equal %|<span class="label">My Section</span>\n|, section.render_label
39
+ section.hidden = true
40
+ assert_equal %|<span class="hidden label">My Section</span>\n|, section.render_label
41
+ section.hidden = false; section.required = true; section.frozen = true
42
+ assert_equal %|<span class="inactive required label">My Section</span>\n|, section.render_label
43
+ end
44
+
45
+ end
46
+
47
+ ActiveForm::Element::Section::create :person_name do |s|
48
+
49
+ s.text_element :firstname, :title => 'First Name'
50
+ s.text_element :lastname, :title => 'Last Name'
51
+
52
+ end
53
+
54
+ ActiveForm::Element::Section::create :message do |s|
55
+
56
+ s.text_element :subject
57
+ s.textarea_element :message
58
+
59
+ end
60
+
61
+ class TestSectionElementClass < Test::Unit::TestCase
62
+
63
+ def test_get_and_build_group
64
+ assert_equal ActiveForm::PersonNameSection, ActiveForm::Element::Section.get(:person_name)
65
+ section = ActiveForm::Element::Section.build(:person_name)
66
+ assert_kind_of ActiveForm::PersonNameSection, section
67
+ assert_equal [:firstname, :lastname], section.collect(&:name)
68
+ end
69
+
70
+ def test_append_section_to_form
71
+ form = ActiveForm::compose :form
72
+ form << ActiveForm::Element::Section.build(:person_name, :person)
73
+ form << ActiveForm::Element::Section.build(:message)
74
+ form << ActiveForm::Element::Submit.new(:send)
75
+ assert_equal [:person, :message, :send], form.collect(&:name)
76
+ assert_equal [:firstname, :lastname], form[:person].collect(&:name)
77
+ assert_equal [:subject, :message], form[:message].collect(&:name)
78
+ end
79
+
80
+ def test_append_and_use_section_binding
81
+ items = []
82
+ items << { :id => 1, :firstname => 'Fred', :lastname => 'Flintstone' }
83
+ items << { :id => 2, :firstname => 'Barney', :lastname => 'Rubble' }
84
+
85
+ person_wrapper = proc do |builder, elem, render|
86
+ builder.fieldset(:class => 'section') {
87
+ builder.legend(elem.label, :class => 'section')
88
+ builder.div(:id => "section-#{elem.identifier}", &render)
89
+ }
90
+ end
91
+
92
+ form = ActiveForm::compose :form
93
+ form.section :people do |s|
94
+ items.each do |item|
95
+ element_id = "person_#{item[:id]}"
96
+ s.append_section [:person_name, element_id, { :label => "#{item[:firstname]} #{item[:lastname]}", :element_wrapper => person_wrapper }]
97
+ s[element_id].values = item # do this here, so the container has been registered to the item's group
98
+ end
99
+ end
100
+
101
+ assert_equal [:person_1, :person_2], form[:people].collect(&:name)
102
+ form.values['people']['person_1']['firstname'] = 'Wilma'
103
+ assert_equal 'Wilma', form[:people][:person_1][:firstname].value
104
+
105
+ expected = [{"firstname"=>"Wilma", "id"=>1, "lastname"=>"Flintstone"}, {"firstname"=>"Barney", "id"=>2, "lastname"=>"Rubble"}]
106
+ assert_equal expected, form[:people].collect { |person| person.values }
107
+
108
+ expected = %|<form action="#form" class="active_form" id="form" method="post">
109
+ <fieldset class="section">
110
+ <legend class="section">Fred Flintstone</legend>
111
+ <div id="section-form_people_person_1">
112
+ <input class="elem_text" id="form_people_person_1_firstname" name="form[people][person_1][firstname]" size="30" title="First Name" type="text" value="Wilma"/>
113
+ <input class="elem_text" id="form_people_person_1_lastname" name="form[people][person_1][lastname]" size="30" title="Last Name" type="text" value="Flintstone"/>
114
+ </div>
115
+ </fieldset>
116
+ <fieldset class="section">
117
+ <legend class="section">Barney Rubble</legend>
118
+ <div id="section-form_people_person_2">
119
+ <input class="elem_text" id="form_people_person_2_firstname" name="form[people][person_2][firstname]" size="30" title="First Name" type="text" value="Barney"/>
120
+ <input class="elem_text" id="form_people_person_2_lastname" name="form[people][person_2][lastname]" size="30" title="Last Name" type="text" value="Rubble"/>
121
+ </div>
122
+ </fieldset>
123
+ </form>\n|
124
+ assert_equal expected, form.to_html
125
+ end
126
+
127
+ def test_append_section
128
+ form = ActiveForm::compose :form
129
+ form.append_section :person_name
130
+ form.append_section :message
131
+ form.submit_element :send
132
+ assert_equal [:person_name, :message, :send], form.collect(&:name)
133
+ assert_equal [:firstname, :lastname], form[:person_name].collect(&:name)
134
+ end
135
+
136
+ def test_append_sections
137
+ form = ActiveForm::compose :form
138
+ form.append_sections :person_name, :message
139
+ form.submit_element :send
140
+ assert_equal [:person_name, :message, :send], form.collect(&:name)
141
+ assert_equal [:firstname, :lastname], form[:person_name].collect(&:name)
142
+ end
143
+
144
+ def test_append_sections_using_array_syntax
145
+ form = ActiveForm::compose :form
146
+ form.append_sections [:person_name, :name], [:message, :email, { :label => "E-Mail" }]
147
+ form.submit_element :send
148
+ assert_equal [:name, :email, :send], form.collect(&:name)
149
+ assert_equal ['Name', 'E-Mail', 'Send'], form.collect(&:label)
150
+ assert_equal [:firstname, :lastname], form[:name].collect(&:name)
151
+ end
152
+
153
+ def test_append_section_using_concat_syntax
154
+ form = ActiveForm::compose :form
155
+ form << :person_name
156
+ form << :message
157
+ form.submit_element :send
158
+ assert_equal [:person_name, :message, :send], form.collect(&:name)
159
+ assert_equal [:firstname, :lastname], form[:person_name].collect(&:name)
160
+ end
161
+
162
+ end