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
File without changes
|
@@ -0,0 +1,14 @@
|
|
1
|
+
class Book < ActiveRecord::Base
|
2
|
+
|
3
|
+
validates_presence_of :title, :isbn
|
4
|
+
validates_format_of :isbn, :with => /(\d[- ]?){9,9}([0-9xX])/
|
5
|
+
|
6
|
+
has_and_belongs_to_many :authors
|
7
|
+
belongs_to :publisher
|
8
|
+
|
9
|
+
belongs_to :categorization
|
10
|
+
has_many :categories, :through => :categorizations
|
11
|
+
|
12
|
+
acts_as_dropdown
|
13
|
+
|
14
|
+
end
|
File without changes
|
File without changes
|
@@ -0,0 +1,10 @@
|
|
1
|
+
pragprog:
|
2
|
+
id: 1
|
3
|
+
name: The Pragmatic Programmers
|
4
|
+
created_at: <%= 5.minutes.ago.to_s :db %>
|
5
|
+
updated_at: <%= 5.minutes.ago.to_s :db %>
|
6
|
+
oreilly:
|
7
|
+
id: 2
|
8
|
+
name: O'Reilly
|
9
|
+
created_at: <%= 5.minutes.ago.to_s :db %>
|
10
|
+
updated_at: <%= 5.minutes.ago.to_s :db %>
|
@@ -0,0 +1,43 @@
|
|
1
|
+
ActiveRecord::Schema.define(:version => 1) do
|
2
|
+
|
3
|
+
create_table "authors", :force => true do |t|
|
4
|
+
t.column "first_name", :string
|
5
|
+
t.column "last_name", :string
|
6
|
+
t.column "birth_date", :date
|
7
|
+
t.column "created_at", :datetime
|
8
|
+
t.column "updated_at", :datetime
|
9
|
+
end
|
10
|
+
|
11
|
+
create_table "authors_books", :force => true do |t|
|
12
|
+
t.column "author_id", :integer
|
13
|
+
t.column "book_id", :integer
|
14
|
+
end
|
15
|
+
|
16
|
+
create_table "books", :force => true do |t|
|
17
|
+
t.column "title", :string
|
18
|
+
t.column "isbn", :string
|
19
|
+
t.column "publication_date", :date
|
20
|
+
t.column "publisher_id", :integer, :default => 1
|
21
|
+
t.column "created_at", :datetime
|
22
|
+
t.column "updated_at", :datetime
|
23
|
+
end
|
24
|
+
|
25
|
+
create_table "categories", :force => true do |t|
|
26
|
+
t.column "name", :string, :limit => 64
|
27
|
+
t.column "description", :string
|
28
|
+
end
|
29
|
+
|
30
|
+
create_table "categorizations", :force => true do |t|
|
31
|
+
t.column "category_id", :integer
|
32
|
+
t.column "book_id", :integer
|
33
|
+
t.column "created_at", :datetime
|
34
|
+
t.column "updated_at", :datetime
|
35
|
+
end
|
36
|
+
|
37
|
+
create_table "publishers", :force => true do |t|
|
38
|
+
t.column "name", :string
|
39
|
+
t.column "created_at", :datetime
|
40
|
+
t.column "updated_at", :datetime
|
41
|
+
end
|
42
|
+
|
43
|
+
end
|
@@ -0,0 +1,121 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
class TestModelAutoDefinition < Test::Unit::TestCase
|
4
|
+
|
5
|
+
fixtures :authors, :books, :categories, :categorizations, :publishers
|
6
|
+
|
7
|
+
def test_model_instance_attribute
|
8
|
+
book = books(:awdr)
|
9
|
+
form = ActiveForm::Model::build(book)
|
10
|
+
assert form.respond_to?(:model_instance)
|
11
|
+
assert form.respond_to?(:model_instance=)
|
12
|
+
assert_equal book, form.model_instance
|
13
|
+
end
|
14
|
+
|
15
|
+
def test_form_name_from_model
|
16
|
+
form = ActiveForm::Model::build(Book.new)
|
17
|
+
assert_equal :book_form, form.name
|
18
|
+
end
|
19
|
+
|
20
|
+
def test_form_name_from_args
|
21
|
+
form = ActiveForm::Model::build(Book.new, :myform)
|
22
|
+
assert_equal :myform, form.name
|
23
|
+
end
|
24
|
+
|
25
|
+
def test_new_record_values
|
26
|
+
form = ActiveForm::Model::build(Book.new)
|
27
|
+
assert_equal '', form[:title].export_value
|
28
|
+
assert_equal '', form[:isbn].export_value
|
29
|
+
assert_kind_of Date, form[:publication_date].export_value
|
30
|
+
assert_equal 1, form[:publisher_id].export_value
|
31
|
+
assert_kind_of Time, form[:created_at].export_value
|
32
|
+
assert_kind_of Time, form[:updated_at].export_value
|
33
|
+
end
|
34
|
+
|
35
|
+
def test_date_defaults_to_now
|
36
|
+
form = ActiveForm::Model::build(Book.new)
|
37
|
+
now_date = Date.today.to_s
|
38
|
+
assert_equal now_date, form[:publication_date].export_value.to_s
|
39
|
+
end
|
40
|
+
|
41
|
+
def test_time_defaults_to_now
|
42
|
+
form = ActiveForm::Model::build(Book.new)
|
43
|
+
now_time = Time.now.to_s.gsub(/(\d\d:\d\d):(\d\d)/, '\1:00')
|
44
|
+
assert_equal now_time, form[:created_at].export_value.to_s
|
45
|
+
assert_equal now_time, form[:updated_at].export_value.to_s
|
46
|
+
end
|
47
|
+
|
48
|
+
def test_override_time_defaults
|
49
|
+
current_time = Time.local(2004, 1, 1, 13, 15, 5)
|
50
|
+
current_time_string = current_time.to_s.gsub(/(\d\d:\d\d):(\d\d)/, '\1:00')
|
51
|
+
assert_equal "Thu Jan 01 13:15:00 +0100 2004", current_time_string
|
52
|
+
book = Book.new(:created_at => current_time)
|
53
|
+
form = ActiveForm::Model::build(book)
|
54
|
+
assert_equal current_time_string, form[:created_at].export_value.to_s
|
55
|
+
end
|
56
|
+
|
57
|
+
def test_difference_between_two_build_methods
|
58
|
+
form = ActiveForm::Model::build(Book.new)
|
59
|
+
assert_equal [:id, :title, :isbn, :publication_date, :publisher_id, :created_at, :updated_at], form.collect(&:name)
|
60
|
+
form = ActiveForm::Model::build!(Book.new)
|
61
|
+
assert_equal [:id, :title, :isbn, :publication_date, :publisher_id, :created_at, :updated_at, :submit], form.collect(&:name)
|
62
|
+
end
|
63
|
+
|
64
|
+
def test_form_elements_for_new_book
|
65
|
+
form = ActiveForm::Model::build(Book.new)
|
66
|
+
assert_kind_of ActiveForm::Definition, form
|
67
|
+
form.submit_element
|
68
|
+
assert_equal [:id, :title, :isbn, :publication_date, :publisher_id, :created_at, :updated_at, :submit], form.collect(&:name)
|
69
|
+
assert_equal ["Id", "Title", "Isbn", "Publication date", "Publisher", "Created at", "Updated at", "Submit"], form.collect(&:label)
|
70
|
+
assert_equal [:hidden, :text, :text, :select_date, :select_from_model, :select_datetime, :select_datetime, :submit], form.collect(&:element_type)
|
71
|
+
assert_equal [:integer, :string, :string, :date, :integer, :time, :time, nil], form.collect(&:type_cast)
|
72
|
+
end
|
73
|
+
|
74
|
+
def test_form_elements_for_new_author
|
75
|
+
form = ActiveForm::Model::build(Author.new)
|
76
|
+
form.submit_element
|
77
|
+
assert_equal [:id, :first_name, :last_name, :birth_date, :created_at, :updated_at, :submit], form.collect(&:name)
|
78
|
+
assert_equal ["Id", "First name", "Last name", "Birth date", "Created at", "Updated at", "Submit"], form.collect(&:label)
|
79
|
+
assert_equal [:hidden, :text, :text, :select_date, :select_datetime, :select_datetime, :submit], form.collect(&:element_type)
|
80
|
+
assert_equal [:integer, :string, :string, :date, :time, :time, nil], form.collect(&:type_cast)
|
81
|
+
end
|
82
|
+
|
83
|
+
def test_form_elements_for_book
|
84
|
+
form = ActiveForm::Model::build(books(:awdr))
|
85
|
+
assert_equal 1, form[:id].export_value
|
86
|
+
assert_equal 'Agile Web Development with Rails', form[:title].export_value
|
87
|
+
assert_equal '0-9766940-0-X', form[:isbn].export_value
|
88
|
+
assert_equal '2005-08-01', form[:publication_date].export_value.to_s
|
89
|
+
assert_equal 1, form[:publisher_id].export_value
|
90
|
+
end
|
91
|
+
|
92
|
+
def test_validate_form_with_ar_validations
|
93
|
+
form = ActiveForm::Model::build(Book.new)
|
94
|
+
assert !form.validate
|
95
|
+
assert_equal ["ar_blank", "ar_blank", "ar_invalid"], form.all_errors.collect(&:code)
|
96
|
+
assert_equal ["Title: can't be blank", "Isbn: can't be blank", "Isbn: is invalid"], form.all_errors.collect(&:message)
|
97
|
+
assert_equal ["Title: can't be blank", "Isbn: can't be blank"], form.initial_errors.collect(&:message)
|
98
|
+
assert_equal 1, form[:title].errors.length
|
99
|
+
assert_equal 2, form[:isbn].errors.length
|
100
|
+
end
|
101
|
+
|
102
|
+
def test_localization_of_ar_error_messages
|
103
|
+
translations = {
|
104
|
+
'book_form_title_label' => 'Titel',
|
105
|
+
'book_form_title_validates_ar_blank' => 'Geef een titel op',
|
106
|
+
'book_form_isbn_label' => 'ISBN nummer',
|
107
|
+
'book_form_isbn_validates_ar_blank' => 'Geef het ISBN nummer',
|
108
|
+
'book_form_isbn_validates_ar_invalid' => 'Onjuist ISBN nummer formaat'
|
109
|
+
}
|
110
|
+
form = ActiveForm::Model::build(Book.new)
|
111
|
+
form.define_localizer { |formname, elemname, key| translations[ [formname, elemname, key].compact.join('_') ] }
|
112
|
+
assert !form.validate
|
113
|
+
expected = ["Geef een titel op", "Geef het ISBN nummer", "Onjuist ISBN nummer formaat"]
|
114
|
+
assert_equal expected, form.all_errors.collect(&:message)
|
115
|
+
end
|
116
|
+
|
117
|
+
def test_aggregations
|
118
|
+
|
119
|
+
end
|
120
|
+
|
121
|
+
end
|
@@ -0,0 +1,61 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
class TestModelLoader < Test::Unit::TestCase
|
4
|
+
|
5
|
+
fixtures :authors, :books, :categories, :categorizations, :publishers
|
6
|
+
|
7
|
+
def setup
|
8
|
+
ActiveForm::Definition.load_paths << File.join(File.dirname(__FILE__), '..', 'resources', 'models')
|
9
|
+
end
|
10
|
+
|
11
|
+
def test_load_model_form
|
12
|
+
form = ActiveForm::Model::load!(Book.new)
|
13
|
+
assert_kind_of ActiveForm::BookForm, form
|
14
|
+
assert_equal [:id, :title, :isbn, :publication_date, :publisher_id, :submit], form.collect(&:name)
|
15
|
+
assert_equal [:integer, :string, :string, :date, :integer, nil], form.collect(&:type_cast)
|
16
|
+
assert_equal [:day, :month, :year], form[:publication_date].collect(&:name)
|
17
|
+
assert_equal "", form[:title].value
|
18
|
+
assert_equal 1, form[:publisher_id].value
|
19
|
+
end
|
20
|
+
|
21
|
+
def test_load_model_for_record
|
22
|
+
form = ActiveForm::Model::load(books(:awdr))
|
23
|
+
assert_kind_of ActiveForm::BookForm, form
|
24
|
+
assert_equal 1, form[:id].export_value
|
25
|
+
assert_equal 'Agile Web Development with Rails', form[:title].export_value
|
26
|
+
assert_equal '0-9766940-0-X', form[:isbn].export_value
|
27
|
+
assert_equal '2005-08-01', form[:publication_date].export_value.to_s
|
28
|
+
assert_equal 1, form[:publisher_id].export_value
|
29
|
+
end
|
30
|
+
|
31
|
+
def test_load_specific_form
|
32
|
+
form = ActiveForm::Model::load(:register, publishers(:pragprog))
|
33
|
+
assert_kind_of ActiveForm::RegisterPublisherForm, form
|
34
|
+
assert_equal [:id, :name], form.collect(&:name)
|
35
|
+
assert_equal 1, form[:id].export_value
|
36
|
+
assert_equal 'The Pragmatic Programmers', form[:name].export_value
|
37
|
+
end
|
38
|
+
|
39
|
+
def test_difference_between_two_load_methods
|
40
|
+
form = ActiveForm::Model::load(publishers(:pragprog))
|
41
|
+
assert_equal [:id, :name, :created_at, :updated_at], form.collect(&:name)
|
42
|
+
form = ActiveForm::Model::load!(publishers(:pragprog))
|
43
|
+
assert_equal [:id, :name, :created_at, :updated_at, :submit], form.collect(&:name)
|
44
|
+
end
|
45
|
+
|
46
|
+
def test_validate_form_with_ar_validations
|
47
|
+
form = ActiveForm::Model::load(Book.new)
|
48
|
+
assert_kind_of ActiveForm::BookForm, form
|
49
|
+
assert !form.validate
|
50
|
+
assert_equal ["ar_blank", "ar_blank", "ar_invalid"], form.all_errors.collect(&:code)
|
51
|
+
assert_equal ["Title: can't be blank", "Isbn: can't be blank", "Isbn: is invalid"], form.all_errors.collect(&:message)
|
52
|
+
assert_equal ["Title: can't be blank", "Isbn: can't be blank"], form.initial_errors.collect(&:message)
|
53
|
+
assert_equal 1, form[:title].errors.length
|
54
|
+
assert_equal 2, form[:isbn].errors.length
|
55
|
+
end
|
56
|
+
|
57
|
+
def teardown
|
58
|
+
ActiveForm::Definition.load_paths.clear
|
59
|
+
end
|
60
|
+
|
61
|
+
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
ActiveForm::Widget::create :custom do |w|
|
2
|
+
|
3
|
+
w.text_element :firstname, :title => 'First Name'
|
4
|
+
w.text_element :lastname, :title => 'Last Name'
|
5
|
+
|
6
|
+
def w.render_element(builder = create_builder)
|
7
|
+
builder.table {
|
8
|
+
builder.tr { builder.td { label_for_firstname(builder) }; builder.td { label_for_lastname(builder) } }
|
9
|
+
builder.tr { builder.td { html_for_firstname(builder) }; builder.td { html_for_lastname(builder) } }
|
10
|
+
}
|
11
|
+
end
|
12
|
+
|
13
|
+
end
|
@@ -0,0 +1,1050 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
class TestActiveForm < Test::Unit::TestCase
|
4
|
+
|
5
|
+
def test_common_stub_instance_methods
|
6
|
+
assert ActiveForm::Definition.instance_methods.include?('to_html')
|
7
|
+
assert ActiveForm::Element::Base.instance_methods.include?('to_html')
|
8
|
+
assert ActiveForm::Element::Section.instance_methods.include?('to_html')
|
9
|
+
end
|
10
|
+
|
11
|
+
def test_element_module_loading
|
12
|
+
assert ActiveForm::Element::load(:text)
|
13
|
+
assert ActiveForm::Element::load(:section)
|
14
|
+
assert_raises(ActiveForm::Element::NotFoundException) do
|
15
|
+
ActiveForm::Element::load(:unknown)
|
16
|
+
end
|
17
|
+
assert ActiveForm::Element::loaded?(:text)
|
18
|
+
assert ActiveForm::Element::loaded?(:section)
|
19
|
+
assert !ActiveForm::Element::loaded?(:unknown)
|
20
|
+
end
|
21
|
+
|
22
|
+
def test_element_module_create
|
23
|
+
assert_kind_of ActiveForm::Element::Text, ActiveForm::Element::build(:text, :test_element)
|
24
|
+
assert_kind_of ActiveForm::Element::Section, ActiveForm::Element::build(:section, :test_element)
|
25
|
+
assert_nil ActiveForm::Element::build(:unknown, :test_element)
|
26
|
+
end
|
27
|
+
|
28
|
+
def test_element_module_type_existence
|
29
|
+
assert ActiveForm::Element::exists?(:text)
|
30
|
+
assert ActiveForm::Element::exists?(:section)
|
31
|
+
assert !ActiveForm::Element::exists?(:unknown)
|
32
|
+
end
|
33
|
+
|
34
|
+
def test_is_element_by_module
|
35
|
+
assert ActiveForm::Element::element?(ActiveForm::Element::Text)
|
36
|
+
assert ActiveForm::Element::element?(ActiveForm::Element::Section)
|
37
|
+
assert ActiveForm::Element::element?(ActiveForm::Definition)
|
38
|
+
assert !ActiveForm::Element::element?(ActiveForm)
|
39
|
+
end
|
40
|
+
|
41
|
+
def test_is_element_by_class
|
42
|
+
assert ActiveForm::Definition.element?
|
43
|
+
assert ActiveForm::compose(:form).element?
|
44
|
+
assert ActiveForm::Element::Base.element?
|
45
|
+
assert ActiveForm::Element::Base.new(:element).element?
|
46
|
+
assert ActiveForm::Element::Section.element?
|
47
|
+
assert ActiveForm::Element::Section.new(:section).element?
|
48
|
+
end
|
49
|
+
|
50
|
+
def test_is_container
|
51
|
+
assert ActiveForm::Definition.container?
|
52
|
+
assert ActiveForm::compose(:test_form).container?
|
53
|
+
assert !ActiveForm::Element::Base.container?
|
54
|
+
assert !ActiveForm::Element::Base.new(:test_element).container?
|
55
|
+
assert ActiveForm::Element::Section.container?
|
56
|
+
assert ActiveForm::Element::Section.new(:test_group).container?
|
57
|
+
end
|
58
|
+
|
59
|
+
def test_element_name
|
60
|
+
form = ActiveForm::compose :test_form
|
61
|
+
assert_equal :test_form, form.name
|
62
|
+
section = ActiveForm::Element::Section.new :test_group
|
63
|
+
assert_equal :test_group, section.name
|
64
|
+
elem = ActiveForm::Element::Base.new :test_element
|
65
|
+
assert_equal :test_element, elem.name
|
66
|
+
end
|
67
|
+
|
68
|
+
def test_element_type
|
69
|
+
form = ActiveForm::compose :test_form
|
70
|
+
assert_equal :form, form.element_type
|
71
|
+
section = ActiveForm::Element::Section.new :test_group
|
72
|
+
assert_equal :section, section.element_type
|
73
|
+
elem = ActiveForm::Element::Base.new :test_element
|
74
|
+
assert_equal :base, elem.element_type
|
75
|
+
elem = ActiveForm::Element::Text.new :test_element
|
76
|
+
assert_equal :text, elem.element_type
|
77
|
+
end
|
78
|
+
|
79
|
+
def test_container_reference
|
80
|
+
form = ActiveForm::compose :test_form
|
81
|
+
assert_equal nil, form.container
|
82
|
+
assert !form.contained?
|
83
|
+
elem = ActiveForm::Element::Base.new form, :element
|
84
|
+
assert_equal form, elem.container
|
85
|
+
assert elem.contained?
|
86
|
+
section = ActiveForm::Element::Section.new form, :element
|
87
|
+
assert_equal form, section.container
|
88
|
+
assert section.contained?
|
89
|
+
end
|
90
|
+
|
91
|
+
def test_standalone_identifier
|
92
|
+
form = ActiveForm::compose :test_form
|
93
|
+
assert_equal "test_form", form.identifier
|
94
|
+
section = ActiveForm::Element::Section.new :test_section
|
95
|
+
assert_equal "test_section", section.identifier
|
96
|
+
elem = ActiveForm::Element::Base.new :test_element
|
97
|
+
assert_equal "test_element", elem.identifier
|
98
|
+
end
|
99
|
+
|
100
|
+
def test_nested_identifier
|
101
|
+
form = ActiveForm::compose :form
|
102
|
+
assert_equal "form", form.identifier
|
103
|
+
section = ActiveForm::Element::Section.new(form, :section)
|
104
|
+
assert_equal "form_section", section.identifier
|
105
|
+
elem = ActiveForm::Element::Base.new(form, :element)
|
106
|
+
assert_equal "form_element", elem.identifier
|
107
|
+
end
|
108
|
+
|
109
|
+
def test_nested_section_identifier
|
110
|
+
form = ActiveForm::compose :form
|
111
|
+
assert_equal "form", form.identifier
|
112
|
+
section = ActiveForm::Element::Section.new(form, :section_a)
|
113
|
+
assert_equal "form_section_a", section.identifier
|
114
|
+
elem_a = ActiveForm::Element::Base.new(section, :element_a)
|
115
|
+
assert_equal "form_section_a_element_a", elem_a.identifier
|
116
|
+
elem_b = ActiveForm::Element::Base.new(section, :element_b)
|
117
|
+
assert_equal "form_section_a_element_b", elem_b.identifier
|
118
|
+
end
|
119
|
+
|
120
|
+
def test_nested_definition_identifier
|
121
|
+
form_a = ActiveForm::compose :form_a
|
122
|
+
assert_equal "form_a", form_a.identifier
|
123
|
+
form_b = ActiveForm::compose form_a, :form_b
|
124
|
+
assert_equal "form_a_form_b", form_b.identifier
|
125
|
+
form_c = ActiveForm::compose form_b, :form_c
|
126
|
+
assert_equal "form_a_form_b_form_c", form_c.identifier
|
127
|
+
elem = ActiveForm::Element::Base.new(form_c, :element)
|
128
|
+
assert_equal "form_a_form_b_form_c_element", elem.identifier
|
129
|
+
end
|
130
|
+
|
131
|
+
def test_nested_section_identifier
|
132
|
+
form = ActiveForm::compose :form
|
133
|
+
assert_equal "form", form.identifier
|
134
|
+
section_a = ActiveForm::Element::Section.new(form, :section_a)
|
135
|
+
assert_equal "form_section_a", section_a.identifier
|
136
|
+
section_b = ActiveForm::Element::Section.new(section_a, :section_b)
|
137
|
+
assert_equal "form_section_a_section_b", section_b.identifier
|
138
|
+
section_c = ActiveForm::Element::Section.new(section_b, :section_c)
|
139
|
+
assert_equal "form_section_a_section_b_section_c", section_c.identifier
|
140
|
+
elem = ActiveForm::Element::Base.new(section_c, :element)
|
141
|
+
assert_equal "form_section_a_section_b_section_c_element", elem.identifier
|
142
|
+
end
|
143
|
+
|
144
|
+
def test_nested_section_name
|
145
|
+
form = ActiveForm::compose :form
|
146
|
+
assert_equal "form", form.element_name
|
147
|
+
section = ActiveForm::Element::Section.new(form, :section_a)
|
148
|
+
assert_equal "form[section_a]", section.element_name
|
149
|
+
elem_a = ActiveForm::Element::Base.new(section, :element_a)
|
150
|
+
assert_equal "form[section_a][element_a]", elem_a.element_name
|
151
|
+
elem_b = ActiveForm::Element::Base.new(section, :element_b)
|
152
|
+
assert_equal "form[section_a][element_b]", elem_b.element_name
|
153
|
+
end
|
154
|
+
|
155
|
+
def test_nested_definition_name
|
156
|
+
form_a = ActiveForm::compose :form_a
|
157
|
+
assert_equal "form_a", form_a.element_name
|
158
|
+
form_b = ActiveForm::compose form_a, :form_b
|
159
|
+
assert_equal "form_a[form_b]", form_b.element_name
|
160
|
+
form_c = ActiveForm::compose form_b, :form_c
|
161
|
+
assert_equal "form_a[form_b][form_c]", form_c.element_name
|
162
|
+
elem = ActiveForm::Element::Base.new(form_c, :element)
|
163
|
+
assert_equal "form_a[form_b][form_c][element]", elem.element_name
|
164
|
+
end
|
165
|
+
|
166
|
+
def test_nested_section_name
|
167
|
+
form = ActiveForm::compose :form
|
168
|
+
assert_equal "form", form.element_name
|
169
|
+
section_a = ActiveForm::Element::Section.new(form, :section_a)
|
170
|
+
assert_equal "form[section_a]", section_a.element_name
|
171
|
+
section_b = ActiveForm::Element::Section.new(section_a, :section_b)
|
172
|
+
assert_equal "form[section_a][section_b]", section_b.element_name
|
173
|
+
section_c = ActiveForm::Element::Section.new(section_b, :section_c)
|
174
|
+
assert_equal "form[section_a][section_b][section_c]", section_c.element_name
|
175
|
+
elem = ActiveForm::Element::Base.new(section_c, :element)
|
176
|
+
assert_equal "form[section_a][section_b][section_c][element]", elem.element_name
|
177
|
+
end
|
178
|
+
|
179
|
+
def test_default_element_label
|
180
|
+
form = ActiveForm::compose :form do |f|
|
181
|
+
f.text_element :element_a
|
182
|
+
f.text_element :element_b, :label => 'B-label'
|
183
|
+
f.text_element :element_c
|
184
|
+
f.section :section_a do |s|
|
185
|
+
s.text_element :element_d
|
186
|
+
s.text_element :element_e
|
187
|
+
end
|
188
|
+
end
|
189
|
+
assert_equal 'Element A', form[:element_a].label
|
190
|
+
assert_equal 'B-label', form[:element_b].label
|
191
|
+
assert_equal 'Element D', form[:section_a][:element_d].label
|
192
|
+
assert_equal 'form[section_a][element_d]', form[:section_a][:element_d].element_name
|
193
|
+
end
|
194
|
+
|
195
|
+
def test_set_elements
|
196
|
+
elem_a = ActiveForm::Element::build(:text, :element_a)
|
197
|
+
elem_b = ActiveForm::Element::build(:text, :element_b)
|
198
|
+
elem_c = ActiveForm::Element::build(:text, :element_c)
|
199
|
+
form = ActiveForm::compose :form
|
200
|
+
form.elements = [elem_a, elem_b, elem_c]
|
201
|
+
assert_equal [:element_a, :element_b, :element_c], form.element_names
|
202
|
+
end
|
203
|
+
|
204
|
+
def test_insert_one_loose_element
|
205
|
+
form = ActiveForm::compose :form
|
206
|
+
elem_a = ActiveForm::Element::build(:text, :element_a)
|
207
|
+
assert form.insert_element(elem_a)
|
208
|
+
elem_b = ActiveForm::Element::build(:text, :element_b)
|
209
|
+
assert form.insert_element(elem_b)
|
210
|
+
assert_equal [:element_a, :element_b], form.element_names
|
211
|
+
elem_c = ActiveForm::Element::build(:text, :element_c)
|
212
|
+
elem_d = ActiveForm::Element::build(:text, :element_d)
|
213
|
+
assert form << elem_c << elem_d
|
214
|
+
assert_equal [:element_a, :element_b, :element_c, :element_d], form.element_names
|
215
|
+
end
|
216
|
+
|
217
|
+
def test_insert_multiple_loose_elements
|
218
|
+
elem_a = ActiveForm::Element::build(:text, :element_a)
|
219
|
+
elem_b = ActiveForm::Element::build(:text, :element_b)
|
220
|
+
elem_c = ActiveForm::Element::build(:text, :element_c)
|
221
|
+
form = ActiveForm::compose :form
|
222
|
+
form.insert_elements(elem_a, elem_b, elem_c)
|
223
|
+
assert_equal [:element_a, :element_b, :element_c], form.element_names
|
224
|
+
form = ActiveForm::compose :form
|
225
|
+
form.insert_elements([elem_a, elem_b, elem_c])
|
226
|
+
assert_equal [:element_a, :element_b, :element_c], form.element_names
|
227
|
+
end
|
228
|
+
|
229
|
+
def test_insert_one_element_at
|
230
|
+
elem_a = ActiveForm::Element::build(:text, :element_a)
|
231
|
+
elem_b = ActiveForm::Element::build(:text, :element_b)
|
232
|
+
elem_c = ActiveForm::Element::build(:text, :element_c)
|
233
|
+
elem_d = ActiveForm::Element::build(:text, :element_d)
|
234
|
+
form = ActiveForm::compose :form
|
235
|
+
form.insert_element(elem_a, 0)
|
236
|
+
form.insert_element(elem_b, 0)
|
237
|
+
form.insert_element(elem_c, 0)
|
238
|
+
assert_equal [:element_c, :element_b, :element_a], form.element_names
|
239
|
+
form = ActiveForm::compose :form
|
240
|
+
form.insert_element(elem_a)
|
241
|
+
form.insert_element(elem_b)
|
242
|
+
form.insert_element(elem_c, 0)
|
243
|
+
assert_equal [:element_c, :element_a, :element_b], form.element_names
|
244
|
+
form.insert_element(elem_d, 2)
|
245
|
+
assert_equal [:element_c, :element_a, :element_d, :element_b], form.element_names
|
246
|
+
end
|
247
|
+
|
248
|
+
def test_insert_multiple_elements_at
|
249
|
+
elem_a = ActiveForm::Element::build(:text, :element_a)
|
250
|
+
elem_b = ActiveForm::Element::build(:text, :element_b)
|
251
|
+
elem_c = ActiveForm::Element::build(:text, :element_c)
|
252
|
+
elem_d = ActiveForm::Element::build(:text, :element_d)
|
253
|
+
form = ActiveForm::compose :form
|
254
|
+
form.insert_elements(elem_a, elem_b)
|
255
|
+
form.insert_elements(elem_c, elem_d, 1)
|
256
|
+
assert_equal [:element_a, :element_c, :element_d, :element_b], form.element_names
|
257
|
+
end
|
258
|
+
|
259
|
+
# define element methods:
|
260
|
+
|
261
|
+
def test_define_element
|
262
|
+
form = ActiveForm::compose :form
|
263
|
+
assert form.define_element(:text, :element_a)
|
264
|
+
assert_equal 1, form.elements.length
|
265
|
+
assert_equal :element_a, form.elements.last.name
|
266
|
+
assert form.element_names.include?(:element_a)
|
267
|
+
assert form.define_element(:text, :element_b)
|
268
|
+
assert_equal 2, form.elements.length
|
269
|
+
assert_equal :element_b, form.elements.last.name
|
270
|
+
assert form.element_names.include?(:element_b)
|
271
|
+
end
|
272
|
+
|
273
|
+
def test_define_element_at
|
274
|
+
form = ActiveForm::compose :form
|
275
|
+
assert form.define_element_at(0, :text, :element_a)
|
276
|
+
assert form.define_element_at(0, :text, :element_b)
|
277
|
+
assert form.define_element_at(1, :text, :element_c)
|
278
|
+
assert form.define_element_at(2, :text, :element_d)
|
279
|
+
assert_equal [:element_b, :element_c, :element_d, :element_a], form.element_names
|
280
|
+
end
|
281
|
+
|
282
|
+
def test_define_element_at_top
|
283
|
+
form = ActiveForm::compose :form
|
284
|
+
assert form.define_element_at_top(:text, :element_a)
|
285
|
+
assert form.define_element_at_top(:text, :element_b)
|
286
|
+
assert form.define_element_at_top(:text, :element_c)
|
287
|
+
assert_equal [:element_c, :element_b, :element_a], form.element_names
|
288
|
+
end
|
289
|
+
|
290
|
+
def test_define_element_at_bottom
|
291
|
+
form = ActiveForm::compose :form
|
292
|
+
assert form.define_element_at_bottom(:text, :element_a)
|
293
|
+
assert form.define_element_at_bottom(:text, :element_b)
|
294
|
+
assert form.define_element_at_bottom(:text, :element_c)
|
295
|
+
assert_equal [:element_a, :element_b, :element_c], form.element_names
|
296
|
+
end
|
297
|
+
|
298
|
+
def test_define_element_using_syntactic_sugar
|
299
|
+
form = ActiveForm::compose :form
|
300
|
+
form.text_element :element_a, :label => 'a text element'
|
301
|
+
form.hidden_element :element_b, :label => 'a hidden element'
|
302
|
+
form.password_element :element_c, :label => 'a password element'
|
303
|
+
assert_equal [:element_a, :element_b, :element_c], form.elements.collect(&:name)
|
304
|
+
assert_equal [:text, :hidden, :password], form.elements.collect(&:element_type)
|
305
|
+
assert_equal ['a text element', 'a hidden element', 'a password element'], form.elements.collect(&:label)
|
306
|
+
end
|
307
|
+
|
308
|
+
def test_define_element_initialize_with_options_and_attributes
|
309
|
+
form = ActiveForm::compose :form
|
310
|
+
form.text_element :element_a, :label => 'test label', :css_style => 'color: red', :css_class => 'special'
|
311
|
+
assert_equal 'test label', form.elements.first.label
|
312
|
+
assert_equal 'color: red', form.elements.first.css_style.to_s
|
313
|
+
assert_equal 'special', form.elements.first.css_class.to_s
|
314
|
+
end
|
315
|
+
|
316
|
+
def test_define_element_with_block
|
317
|
+
form = ActiveForm::compose :form
|
318
|
+
form.define_element :text, :element_a do |e|
|
319
|
+
e.css_class << 'special'
|
320
|
+
e.css_style = 'color: red'
|
321
|
+
end
|
322
|
+
expected = { "type" => "text", "name"=>"form[element_a]", "class"=>"elem_text special", "id"=>"form_element_a", "style"=>"color: red", "value"=>"", "size"=>30 }
|
323
|
+
assert_equal expected, form[:element_a].element_attributes
|
324
|
+
end
|
325
|
+
|
326
|
+
def test_update_attributes_and_options_on_sample_element
|
327
|
+
form = ActiveForm::compose :form
|
328
|
+
elem = form.extended_sample_element :element_a, :label => 'test label', :css_style => 'color: red', :css_class => 'special', :flipped => true
|
329
|
+
assert elem.flipped?
|
330
|
+
assert_equal 'test label', form.elements.first.label
|
331
|
+
assert_equal 'special', form.elements.first.css_class.to_s
|
332
|
+
elem.update :label => 'changed label', :css_class => 'other', :flipped => false, :flopped => true
|
333
|
+
assert !elem.flipped?
|
334
|
+
assert elem.flopped?
|
335
|
+
assert_equal 'changed label', form.elements.first.label
|
336
|
+
assert_equal 'other', form.elements.first.css_class.to_s
|
337
|
+
end
|
338
|
+
|
339
|
+
def test_update_attributes_and_options_on_text_element
|
340
|
+
form = ActiveForm::compose :form
|
341
|
+
elem = form.text_element :element_a, :label => 'test label', :css_style => 'color: red', :css_class => 'special'
|
342
|
+
assert_equal 'test label', form.elements.first.label
|
343
|
+
assert_equal 'special', form.elements.first.css_class.to_s
|
344
|
+
elem.update :label => 'changed label', :css_class => 'other'
|
345
|
+
assert_equal 'changed label', form.elements.first.label
|
346
|
+
assert_equal 'other', form.elements.first.css_class.to_s
|
347
|
+
end
|
348
|
+
|
349
|
+
def test_update_all_elements
|
350
|
+
form = ActiveForm::compose :form do |f|
|
351
|
+
f.text_element :element_a, :label => 'one', :description => 'this is the first'
|
352
|
+
f.text_element :element_b, :label => 'two', :description => 'this is the second'
|
353
|
+
f.text_element :element_c, :label => 'three', :description => 'this is the third'
|
354
|
+
end
|
355
|
+
assert_equal ['one', 'two', 'three'], form.elements.collect(&:label)
|
356
|
+
assert_equal ['this is the first', 'this is the second', 'this is the third'], form.elements.collect(&:description)
|
357
|
+
form.update_elements(:description => nil)
|
358
|
+
assert_equal [nil, nil, nil], form.elements.collect(&:description)
|
359
|
+
form.update_elements(:label => 'new', :css_class => 'marked')
|
360
|
+
assert_equal ['new', 'new', 'new'], form.elements.collect(&:label)
|
361
|
+
assert_equal ['marked', 'marked', 'marked'], form.elements.collect { |e| e.css_class.to_s }
|
362
|
+
end
|
363
|
+
|
364
|
+
def test_update_some_elements
|
365
|
+
form = ActiveForm::compose :form do |f|
|
366
|
+
f.text_element :element_a, :label => 'one'
|
367
|
+
f.text_element :element_b, :label => 'two'
|
368
|
+
f.text_element :element_c, :label => 'three'
|
369
|
+
end
|
370
|
+
assert_equal ['one', 'two', 'three'], form.elements.collect(&:label)
|
371
|
+
form.update_elements(:element_a, :element_c, :label => 'new')
|
372
|
+
assert_equal ['new', 'two', 'new'], form.elements.collect(&:label)
|
373
|
+
form.update_elements(:element_b, :element_c, :css_class => 'marked')
|
374
|
+
assert_equal ['elem_text', 'marked', 'marked'], form.elements.collect { |e| e.css_class.to_s }
|
375
|
+
end
|
376
|
+
|
377
|
+
def test_index_of_element
|
378
|
+
form = ActiveForm::compose :form
|
379
|
+
form.define_element(:text, :element_a)
|
380
|
+
form.define_element(:text, :element_b)
|
381
|
+
form.define_element(:text, :element_c)
|
382
|
+
assert_equal 0, form.index_of_element(:element_a)
|
383
|
+
assert_equal 1, form.index_of_element(:element_b)
|
384
|
+
assert_equal 2, form.index_of_element(:element_c)
|
385
|
+
end
|
386
|
+
|
387
|
+
def test_get_element_by_index
|
388
|
+
form = ActiveForm::compose :form
|
389
|
+
elem_a = form.define_element(:text, :element_a)
|
390
|
+
elem_b = form.define_element(:text, :element_b)
|
391
|
+
elem_c = form.define_element(:text, :element_c)
|
392
|
+
assert_equal elem_a, form.get_element_by_index(0)
|
393
|
+
assert_equal elem_b, form.get_element_by_index(1)
|
394
|
+
assert_equal elem_c, form.get_element_by_index(2)
|
395
|
+
end
|
396
|
+
|
397
|
+
def test_if_container_element_exists
|
398
|
+
form = ActiveForm::compose :form
|
399
|
+
form.define_element(:text, :element_a)
|
400
|
+
form.define_element(:text, :element_b)
|
401
|
+
assert form.element_exists?(:element_a)
|
402
|
+
assert form.element_exists?(:element_b)
|
403
|
+
assert !form.element_exists?(:unknown)
|
404
|
+
end
|
405
|
+
|
406
|
+
def test_reset_elements
|
407
|
+
form = ActiveForm::compose :form
|
408
|
+
form.define_element(:text, :element_a)
|
409
|
+
form.define_element(:text, :element_b)
|
410
|
+
assert_equal [:element_a, :element_b], form.element_names
|
411
|
+
assert_equal 2, form.elements.length
|
412
|
+
assert_equal 2, form.name_to_index_lookup.length
|
413
|
+
form.reset_elements!
|
414
|
+
assert_equal [], form.element_names
|
415
|
+
assert_equal 0, form.elements.length
|
416
|
+
assert_equal 0, form.name_to_index_lookup.length
|
417
|
+
end
|
418
|
+
|
419
|
+
def test_name_to_index_lookup_assignment_fails
|
420
|
+
form = ActiveForm::compose :form
|
421
|
+
assert_raises(NoMethodError) { form.name_to_index_lookup = Hash.new }
|
422
|
+
end
|
423
|
+
|
424
|
+
def test_container_set_and_replace_element
|
425
|
+
form = ActiveForm::compose :form
|
426
|
+
elem_a = form.define_element(:text, :element_a)
|
427
|
+
elem_b = form.define_element(:text, :element_b)
|
428
|
+
assert_equal [elem_a, elem_b], form.elements
|
429
|
+
good_replacement = ActiveForm::Element::build(:section, :element_b)
|
430
|
+
assert form.set_element(:element_b, good_replacement)
|
431
|
+
assert_equal [elem_a, good_replacement], form.elements
|
432
|
+
new_replacement = ActiveForm::Element::build(:text, :element_a)
|
433
|
+
form[:element_a] = new_replacement
|
434
|
+
assert_equal [new_replacement, good_replacement], form.elements
|
435
|
+
bad_replacement = ActiveForm::Element::build(:section, :element_c)
|
436
|
+
assert_raises(ActiveForm::Element::MismatchException) { form.set_element(:element_b, bad_replacement) }
|
437
|
+
end
|
438
|
+
|
439
|
+
def test_container_get_element
|
440
|
+
form = ActiveForm::compose :form
|
441
|
+
elem_a = form.define_element(:text, :element_a)
|
442
|
+
elem_b = form.define_element(:text, :element_b)
|
443
|
+
elem_c = form.define_element(:text, :element_c)
|
444
|
+
assert_equal elem_a, form.get_element(:element_a)
|
445
|
+
assert_equal elem_b, form.get_element(:element_b)
|
446
|
+
assert_equal elem_c, form.get_element(:element_c)
|
447
|
+
end
|
448
|
+
|
449
|
+
def test_container_get_element_with_hash_syntax
|
450
|
+
form = ActiveForm::compose :form
|
451
|
+
elem_a = form.define_element(:text, :element_a)
|
452
|
+
elem_b = form.define_element(:text, :element_b)
|
453
|
+
elem_c = form.define_element(:text, :element_c)
|
454
|
+
assert_equal elem_a, form[:element_a]
|
455
|
+
assert_equal elem_b, form[:element_b]
|
456
|
+
assert_equal elem_c, form[:element_c]
|
457
|
+
end
|
458
|
+
|
459
|
+
def test_container_get_element_at
|
460
|
+
form = ActiveForm::compose :form
|
461
|
+
elem_a = form.define_element(:text, :element_a)
|
462
|
+
elem_b = form.define_element(:text, :element_b)
|
463
|
+
elem_c = form.define_element(:text, :element_c)
|
464
|
+
assert_equal elem_a, form.element_at(0)
|
465
|
+
assert_equal elem_b, form.element_at(1)
|
466
|
+
assert_equal elem_c, form.element_at(2)
|
467
|
+
end
|
468
|
+
|
469
|
+
def test_container_remove_element
|
470
|
+
form = ActiveForm::compose :form do |f|
|
471
|
+
f.define_element(:text, :element_a)
|
472
|
+
f.define_element(:text, :element_b)
|
473
|
+
f.define_element(:text, :element_c)
|
474
|
+
f.define_element(:text, :element_d)
|
475
|
+
end
|
476
|
+
assert_equal [:element_a, :element_b, :element_c, :element_d], form.collect(&:name)
|
477
|
+
expected = {:element_a=>0, :element_c=>2, :element_b=>1, :element_d=>3}
|
478
|
+
assert_equal expected, form.name_to_index_lookup
|
479
|
+
assert form.remove_element(:element_b)
|
480
|
+
assert_equal [:element_a, :element_c, :element_d], form.collect(&:name)
|
481
|
+
expected = {:element_a=>0, :element_c=>1, :element_d=>2}
|
482
|
+
assert form.remove_elements(:element_a, :element_d)
|
483
|
+
assert_equal [:element_c], form.collect(&:name)
|
484
|
+
expected = {:element_c=>0}
|
485
|
+
end
|
486
|
+
|
487
|
+
def test_container_remove_element_at
|
488
|
+
form = ActiveForm::compose :form do |f|
|
489
|
+
f.define_element(:text, :element_a)
|
490
|
+
f.define_element(:text, :element_b)
|
491
|
+
f.define_element(:text, :element_c)
|
492
|
+
f.define_element(:text, :element_d)
|
493
|
+
end
|
494
|
+
assert_equal [:element_a, :element_b, :element_c, :element_d], form.collect(&:name)
|
495
|
+
expected = {:element_a=>0, :element_c=>2, :element_b=>1, :element_d=>3}
|
496
|
+
assert_equal expected, form.name_to_index_lookup
|
497
|
+
assert form.remove_element_at(1)
|
498
|
+
assert_equal [:element_a, :element_c, :element_d], form.collect(&:name)
|
499
|
+
expected = {:element_a=>0, :element_c=>1, :element_d=>2}
|
500
|
+
assert form.remove_elements_at(0, 2)
|
501
|
+
assert_equal [:element_c], form.collect(&:name)
|
502
|
+
expected = {:element_c=>0}
|
503
|
+
end
|
504
|
+
|
505
|
+
def test_container_remove_elements_of_type
|
506
|
+
form = ActiveForm::compose :form do |f|
|
507
|
+
f.define_element(:text, :element_a)
|
508
|
+
f.define_element(:password, :element_b)
|
509
|
+
f.define_element(:textarea, :element_c)
|
510
|
+
f.define_element(:submit, :element_d)
|
511
|
+
end
|
512
|
+
assert_equal [:element_a, :element_b, :element_c, :element_d], form.collect(&:name)
|
513
|
+
form.remove_elements_of_type(:text)
|
514
|
+
assert_equal [:element_b, :element_c, :element_d], form.collect(&:name)
|
515
|
+
form.remove_elements_of_type(:submit, :textarea)
|
516
|
+
assert_equal [:element_b], form.collect(&:name)
|
517
|
+
end
|
518
|
+
|
519
|
+
# value handling
|
520
|
+
|
521
|
+
def test_unbound_element_value
|
522
|
+
elem = ActiveForm::Element::build(:text, :elem_a)
|
523
|
+
elem.element_value = 'one'
|
524
|
+
assert_equal 'one', elem.element_value
|
525
|
+
end
|
526
|
+
|
527
|
+
def test_bound_element_value
|
528
|
+
form = ActiveForm::compose :form
|
529
|
+
elem = form.text_element :elem_a
|
530
|
+
expected = {"elem_a"=>nil}
|
531
|
+
assert_equal expected, form.values
|
532
|
+
elem.element_value = 'value'
|
533
|
+
expected = { "elem_a" => 'value' }
|
534
|
+
assert_equal expected, form.values
|
535
|
+
form.values[:elem_a] = 'changed'
|
536
|
+
assert_equal 'changed', elem.element_value
|
537
|
+
end
|
538
|
+
|
539
|
+
def test_assign_values
|
540
|
+
values = { :elem_b => "two", :elem_a => "one" }
|
541
|
+
form = ActiveForm::compose :form, :values => values do |f|
|
542
|
+
f.text_element :elem_a
|
543
|
+
f.text_element :elem_b
|
544
|
+
end
|
545
|
+
assert_equal 'one', form[:elem_a].element_value
|
546
|
+
assert_equal 'two', form[:elem_b].element_value
|
547
|
+
|
548
|
+
form[:elem_a].element_value = 'new'
|
549
|
+
assert_equal 'new', form[:elem_a].element_value
|
550
|
+
values[:elem_b] = 'other'
|
551
|
+
assert_equal 'other', form[:elem_b].element_value
|
552
|
+
form[:elem_b].element_value = 'changed'
|
553
|
+
assert_equal 'changed', values[:elem_b]
|
554
|
+
end
|
555
|
+
|
556
|
+
# formatting and casting
|
557
|
+
|
558
|
+
def test_define_formatting_filter
|
559
|
+
filter = lambda { |value| value.join(' ') }
|
560
|
+
elem = ActiveForm::Element::build :text, :elem_a, :formatting_filter => filter
|
561
|
+
assert_equal 'a b c', elem.formatting_filter(['a', 'b', 'c'])
|
562
|
+
elem = ActiveForm::Element::build :text, :elem_a do |e|
|
563
|
+
filter = e.define_formatting_filter { |value| value.join('-') }
|
564
|
+
end
|
565
|
+
assert_equal 'a-b-c', elem.formatting_filter(['a', 'b', 'c'])
|
566
|
+
end
|
567
|
+
|
568
|
+
def test_define_casting_filter
|
569
|
+
filter = lambda { |value| value.split(' ') }
|
570
|
+
elem = ActiveForm::Element::build :text, :elem_a, :casting_filter => filter
|
571
|
+
assert_equal ['a', 'b', 'c'], elem.casting_filter('a b c')
|
572
|
+
elem = ActiveForm::Element::build :text, :elem_a do |e|
|
573
|
+
filter = e.define_casting_filter { |value| value.split('-') }
|
574
|
+
end
|
575
|
+
assert_equal ['a', 'b', 'c'], elem.casting_filter('a-b-c')
|
576
|
+
end
|
577
|
+
|
578
|
+
def test_internal_element_value
|
579
|
+
form = ActiveForm::compose :contact_form do |f|
|
580
|
+
f.text_element :firstname, :value => %w{ F r e d } do |e|
|
581
|
+
e.define_formatting_filter { |value| value.join }
|
582
|
+
e.define_casting_filter { |value| value.split('') }
|
583
|
+
end
|
584
|
+
f.text_element :lastname, :value => 'flintstone' do |e|
|
585
|
+
e.define_formatting_filter { |value| value.upcase }
|
586
|
+
e.define_casting_filter { |value| value.downcase }
|
587
|
+
end
|
588
|
+
end
|
589
|
+
assert_equal ["F", "r", "e", "d"], form[:firstname].element_value
|
590
|
+
assert_equal 'Fred', form[:firstname].formatted_value
|
591
|
+
form[:firstname].value = 'Barney'
|
592
|
+
assert_equal ["B", "a", "r", "n", "e", "y"], form[:firstname].element_value
|
593
|
+
assert_equal 'Barney', form[:firstname].formatted_value
|
594
|
+
|
595
|
+
assert_equal 'flintstone', form[:lastname].element_value
|
596
|
+
assert_equal 'FLINTSTONE', form[:lastname].formatted_value
|
597
|
+
form[:lastname].value = 'RUBBLE'
|
598
|
+
assert_equal 'rubble', form[:lastname].element_value
|
599
|
+
assert_equal 'RUBBLE', form[:lastname].formatted_value
|
600
|
+
end
|
601
|
+
|
602
|
+
def test_nested_value_assignment
|
603
|
+
values = ActiveForm::Values.new
|
604
|
+
values[:section_a] = {}
|
605
|
+
values[:section_a][:section_b] = {}
|
606
|
+
values[:section_a][:section_b][:section_c] = {}
|
607
|
+
values[:section_a][:section_b][:section_c][:element] = 'test value'
|
608
|
+
|
609
|
+
form = ActiveForm::compose :form, :values => values do |f|
|
610
|
+
f.section :section_a do |ga|
|
611
|
+
ga.section :section_b do |gb|
|
612
|
+
gb.section :section_c do |gc|
|
613
|
+
elem = gc.text_element :element
|
614
|
+
end
|
615
|
+
end
|
616
|
+
end
|
617
|
+
end
|
618
|
+
|
619
|
+
assert_equal :element, form[:section_a][:section_b][:section_c][:element].name
|
620
|
+
assert_equal :section_c, form[:section_a][:section_b][:section_c].name
|
621
|
+
assert_equal :section_b, form[:section_a][:section_b].name
|
622
|
+
assert_equal :section_a, form[:section_a].name
|
623
|
+
|
624
|
+
assert_equal values[:section_a][:section_b][:section_c][:element], form[:section_a][:section_b][:section_c][:element].element_value
|
625
|
+
assert_equal values[:section_a][:section_b][:section_c], form[:section_a][:section_b][:section_c].element_value
|
626
|
+
assert_equal values[:section_a][:section_b], form[:section_a][:section_b].element_value
|
627
|
+
assert_equal values[:section_a], form[:section_a].element_value
|
628
|
+
assert_equal values, form.element_value
|
629
|
+
|
630
|
+
assert_equal values[:section_a][:section_b][:section_c][:element], form[:section_a][:section_b][:section_c][:element].values
|
631
|
+
assert_equal values[:section_a][:section_b][:section_c], form[:section_a][:section_b][:section_c].values
|
632
|
+
assert_equal values[:section_a][:section_b], form[:section_a][:section_b].values
|
633
|
+
assert_equal values[:section_a], form[:section_a].values
|
634
|
+
assert_equal values, form.values
|
635
|
+
|
636
|
+
values[:section_a][:section_b][:section_c][:element] = 'changed value'
|
637
|
+
assert_equal 'changed value', form[:section_a][:section_b][:section_c][:element].element_value
|
638
|
+
expected = { "element" => "changed value" }
|
639
|
+
assert_equal expected, form[:section_a][:section_b][:section_c].element_value
|
640
|
+
|
641
|
+
form[:section_a][:section_b][:section_c][:element].element_value = 'new value'
|
642
|
+
assert_equal 'new value', form[:section_a][:section_b][:section_c][:element].element_value
|
643
|
+
assert_equal 'new value', values[:section_a][:section_b][:section_c][:element]
|
644
|
+
expected = { "element" => "new value" }
|
645
|
+
assert_equal expected, form[:section_a][:section_b][:section_c].element_value
|
646
|
+
|
647
|
+
new_values = { "section_c" => { "element" => "other value" } }
|
648
|
+
form[:section_a][:section_b].update_values(new_values)
|
649
|
+
assert_equal new_values, form[:section_a][:section_b].values
|
650
|
+
assert_equal "other value", form[:section_a][:section_b][:section_c][:element].element_value
|
651
|
+
|
652
|
+
new_values = ActiveForm::Values.new
|
653
|
+
new_values[:section_a] = {}
|
654
|
+
new_values[:section_a][:section_b] = {}
|
655
|
+
new_values[:section_a][:section_b][:section_c] = {}
|
656
|
+
new_values[:section_a][:section_b][:section_c][:element] = 'updated value'
|
657
|
+
|
658
|
+
form.update_values(new_values)
|
659
|
+
assert_equal values[:section_a][:section_b][:section_c][:element], form[:section_a][:section_b][:section_c][:element].element_value
|
660
|
+
|
661
|
+
form.update_values({}, true)
|
662
|
+
assert_equal nil, form[:section_a][:section_b][:section_c][:element].element_value
|
663
|
+
expected = { "element" => nil }
|
664
|
+
assert_equal expected, form[:section_a][:section_b][:section_c].element_value
|
665
|
+
expected = { "section_c"=> { "element" => nil } }
|
666
|
+
assert_equal expected , form[:section_a][:section_b].element_value
|
667
|
+
expected = { "section_b" => { "section_c"=> { "element" => nil } } }
|
668
|
+
assert_equal expected, form[:section_a].element_value
|
669
|
+
expected = { "section_a" => { "section_b" => { "section_c"=> { "element" => nil } } } }
|
670
|
+
assert_equal expected, form.element_value
|
671
|
+
|
672
|
+
new_values = { "section_c" => { "element" => "other value" } }
|
673
|
+
form[:section_a][:section_b].update_values(new_values)
|
674
|
+
assert_equal new_values, form[:section_a][:section_b].values
|
675
|
+
assert_equal "other value", form[:section_a][:section_b][:section_c][:element].element_value
|
676
|
+
end
|
677
|
+
|
678
|
+
def test_more_nested_tests_one
|
679
|
+
|
680
|
+
values = ActiveForm::Values.new
|
681
|
+
|
682
|
+
form = ActiveForm::compose :form, :values => values do |f|
|
683
|
+
f.section :section_a do |ga|
|
684
|
+
ga.section :section_b do |gb|
|
685
|
+
gb.section :section_c do |gc|
|
686
|
+
gc.text_element :element do |e|
|
687
|
+
e.define_formatting_filter { |value| value.join }
|
688
|
+
e.define_casting_filter { |value| value.is_a?(Array) ? value : value.split('') }
|
689
|
+
end
|
690
|
+
end
|
691
|
+
end
|
692
|
+
end
|
693
|
+
end
|
694
|
+
|
695
|
+
params = Hash.new
|
696
|
+
params[:form] = {}
|
697
|
+
params[:form][:section_a] = {}
|
698
|
+
params[:form][:section_a][:section_b] = {}
|
699
|
+
params[:form][:section_a][:section_b][:section_c] = {}
|
700
|
+
params[:form][:section_a][:section_b][:section_c][:element] = 'Fred'
|
701
|
+
|
702
|
+
form[:section_a][:section_b][:section_c][:element].element_value = ["B", "a", "r", "n", "e", "y"]
|
703
|
+
|
704
|
+
assert_equal ["B", "a", "r", "n", "e", "y"], form[:section_a][:section_b][:section_c][:element].element_value
|
705
|
+
expected = {"section_a"=>{"section_b"=>{"section_c"=>{"element"=>["B", "a", "r", "n", "e", "y"]}}}}
|
706
|
+
assert_equal expected, form.values
|
707
|
+
|
708
|
+
form.update_from_params(params)
|
709
|
+
|
710
|
+
assert_equal ["F", "r", "e", "d"], form[:section_a][:section_b][:section_c][:element].element_value
|
711
|
+
assert_equal 'Fred', form[:section_a][:section_b][:section_c][:element].formatted_value
|
712
|
+
expected = {"section_a"=>{"section_b"=>{"section_c"=>{"element"=>["F", "r", "e", "d"]}}}}
|
713
|
+
assert_equal expected, form.values
|
714
|
+
|
715
|
+
form[:section_a][:section_b][:section_c][:element].element_value = ["B", "a", "r", "n", "e", "y"]
|
716
|
+
|
717
|
+
assert_equal ["B", "a", "r", "n", "e", "y"], form[:section_a][:section_b][:section_c][:element].element_value
|
718
|
+
assert_equal 'Barney', form[:section_a][:section_b][:section_c][:element].formatted_value
|
719
|
+
expected = {"section_a"=>{"section_b"=>{"section_c"=>{"element"=>["B", "a", "r", "n", "e", "y"]}}}}
|
720
|
+
assert_equal expected, form.values
|
721
|
+
|
722
|
+
params[:form][:section_a][:section_b][:section_c][:element] = 'Betty'
|
723
|
+
form.update_from_params(params)
|
724
|
+
|
725
|
+
assert_equal ["B", "e", "t", "t", "y"], form[:section_a][:section_b][:section_c][:element].element_value
|
726
|
+
assert_equal 'Betty', form[:section_a][:section_b][:section_c][:element].formatted_value
|
727
|
+
expected = {"section_a"=>{"section_b"=>{"section_c"=>{"element"=>["B", "e", "t", "t", "y"]}}}}
|
728
|
+
assert_equal expected, form.values
|
729
|
+
|
730
|
+
form[:section_a][:section_b][:section_c][:element].element_value = 'Wilma'
|
731
|
+
|
732
|
+
assert_equal ["W", "i", "l", "m", "a"], form[:section_a][:section_b][:section_c][:element].element_value
|
733
|
+
assert_equal 'Wilma', form[:section_a][:section_b][:section_c][:element].formatted_value
|
734
|
+
expected = {"section_a"=>{"section_b"=>{"section_c"=>{"element"=>["W", "i", "l", "m", "a"]}}}}
|
735
|
+
assert_equal expected, form.values
|
736
|
+
|
737
|
+
form[:section_a][:section_b][:section_c][:element].element_value = ['P', 'e', 'b', 'b', 'l', 'e', 's']
|
738
|
+
|
739
|
+
ref = form[:section_a][:section_b][:section_c][:element]
|
740
|
+
|
741
|
+
assert_equal ['P', 'e', 'b', 'b', 'l', 'e', 's'], form[:section_a][:section_b][:section_c][:element].element_value
|
742
|
+
assert_equal 'Pebbles', form[:section_a][:section_b][:section_c][:element].formatted_value
|
743
|
+
expected = {"section_a"=>{"section_b"=>{"section_c"=>{"element"=>['P', 'e', 'b', 'b', 'l', 'e', 's']}}}}
|
744
|
+
assert_equal ['P', 'e', 'b', 'b', 'l', 'e', 's'], ref.element_value
|
745
|
+
assert_equal expected, form.values
|
746
|
+
|
747
|
+
form.params = {"form"=>{"section_a"=>{"section_b"=>{"section_c"=>{"element"=>'Other'}}}}}
|
748
|
+
assert_equal 'Other', form[:section_a][:section_b][:section_c][:element].formatted_value
|
749
|
+
assert_equal ["O", "t", "h", "e", "r"], form[:section_a][:section_b][:section_c][:element].element_value
|
750
|
+
assert_equal ["O", "t", "h", "e", "r"], ref.element_value
|
751
|
+
end
|
752
|
+
|
753
|
+
def test_more_nested_tests
|
754
|
+
|
755
|
+
values = ActiveForm::Values.new
|
756
|
+
|
757
|
+
form = ActiveForm::compose :form, :values => values do |f|
|
758
|
+
f.section :section_a do |ga|
|
759
|
+
ga.section :section_b do |gb|
|
760
|
+
gb.section :section_c do |gc|
|
761
|
+
gc.text_element :element do |e|
|
762
|
+
e.define_formatting_filter { |value| value.to_s }
|
763
|
+
e.define_casting_filter { |value| value.to_i }
|
764
|
+
end
|
765
|
+
end
|
766
|
+
end
|
767
|
+
end
|
768
|
+
end
|
769
|
+
|
770
|
+
params = Hash.new
|
771
|
+
params[:form] = {}
|
772
|
+
params[:form][:section_a] = {}
|
773
|
+
params[:form][:section_a][:section_b] = {}
|
774
|
+
params[:form][:section_a][:section_b][:section_c] = {}
|
775
|
+
params[:form][:section_a][:section_b][:section_c][:element] = '123'
|
776
|
+
|
777
|
+
form[:section_a][:section_b][:section_c][:element].element_value = 456
|
778
|
+
|
779
|
+
assert_equal 456, form[:section_a][:section_b][:section_c][:element].element_value
|
780
|
+
assert_equal '456', form[:section_a][:section_b][:section_c][:element].formatted_value
|
781
|
+
expected = {"section_a"=>{"section_b"=>{"section_c"=>{"element"=>456}}}}
|
782
|
+
assert_equal expected, form.values
|
783
|
+
|
784
|
+
form.update_from_params(params)
|
785
|
+
|
786
|
+
assert_equal 123, form[:section_a][:section_b][:section_c][:element].element_value
|
787
|
+
assert_equal '123', form[:section_a][:section_b][:section_c][:element].formatted_value
|
788
|
+
expected = {"section_a"=>{"section_b"=>{"section_c"=>{"element"=>123}}}}
|
789
|
+
assert_equal expected, form.values
|
790
|
+
|
791
|
+
form[:section_a][:section_b][:section_c][:element].element_value = '456'
|
792
|
+
|
793
|
+
expected = {"section_b"=>{"section_c"=>{"element"=>456}}}
|
794
|
+
assert_equal expected, form[:section_a].element_value
|
795
|
+
|
796
|
+
assert_equal 456, form[:section_a][:section_b][:section_c][:element].element_value
|
797
|
+
expected = {"section_a"=>{"section_b"=>{"section_c"=>{"element"=>456}}}}
|
798
|
+
assert_equal expected, form.values
|
799
|
+
|
800
|
+
params[:form][:section_a][:section_b][:section_c][:element] = '789'
|
801
|
+
form.update_from_params(params)
|
802
|
+
|
803
|
+
assert_equal 789, form[:section_a][:section_b][:section_c][:element].element_value
|
804
|
+
expected = {"section_a"=>{"section_b"=>{"section_c"=>{"element"=>789}}}}
|
805
|
+
assert_equal expected, form.values
|
806
|
+
|
807
|
+
form[:section_a][:section_b][:section_c][:element].element_value = '007'
|
808
|
+
|
809
|
+
assert_equal 7, form[:section_a][:section_b][:section_c][:element].element_value
|
810
|
+
expected = {"section_a"=>{"section_b"=>{"section_c"=>{"element"=>7}}}}
|
811
|
+
assert_equal expected, form.values
|
812
|
+
end
|
813
|
+
|
814
|
+
def test_custom_value_object
|
815
|
+
obj = CustomValueObject.new
|
816
|
+
form = ActiveForm::compose :form, :binding => obj do |f|
|
817
|
+
f.text_element :name
|
818
|
+
f.text_element :city
|
819
|
+
end
|
820
|
+
|
821
|
+
obj.value['name'] = 'Fred Flintstone'
|
822
|
+
obj.value['city'] = 'Bedrock'
|
823
|
+
|
824
|
+
assert_equal 'Fred Flintstone', form[:name].element_value
|
825
|
+
assert_equal 'Bedrock', form[:city].element_value
|
826
|
+
|
827
|
+
form[:city].element_value = 'Yellowstone'
|
828
|
+
assert_equal 'Yellowstone', form[:city].element_value
|
829
|
+
assert_equal 'Yellowstone', obj.value['city']
|
830
|
+
|
831
|
+
form.params = { "form" => { "city" => "Bricktown" } }
|
832
|
+
assert_equal 'Bricktown', form[:city].element_value
|
833
|
+
assert_equal 'Bricktown', obj.value['city']
|
834
|
+
end
|
835
|
+
|
836
|
+
def test_custom_value_object_binding
|
837
|
+
form = ActiveForm::compose :form do |f|
|
838
|
+
f.text_element :name
|
839
|
+
f.text_element :city
|
840
|
+
end
|
841
|
+
|
842
|
+
obj = form.bind_to(CustomValueObject.new)
|
843
|
+
form.params = { "form" => { "name" => "Fred Flintstone", "city" => "Bricktown" } }
|
844
|
+
|
845
|
+
assert_equal 'Fred Flintstone', form[:name].element_value
|
846
|
+
assert_equal 'Fred Flintstone', obj.value['name']
|
847
|
+
assert_equal 'Bricktown', form[:city].element_value
|
848
|
+
assert_equal 'Bricktown', obj.value['city']
|
849
|
+
end
|
850
|
+
|
851
|
+
def test_default_fallback_value
|
852
|
+
form = ActiveForm::compose :form do |f|
|
853
|
+
f.text_element :name, :default => 'anonymous'
|
854
|
+
f.text_element :language, :default => 'EN', :value => 'NL'
|
855
|
+
end
|
856
|
+
assert_equal nil, form[:name].value
|
857
|
+
assert_equal 'anonymous', form[:name].fallback_value
|
858
|
+
assert_equal 'anonymous', form[:name].export_value
|
859
|
+
assert_equal 'NL', form[:language].value
|
860
|
+
assert_equal 'EN', form[:language].fallback_value
|
861
|
+
assert_equal 'NL', form[:language].export_value
|
862
|
+
form[:language].value = nil
|
863
|
+
assert_equal nil, form[:language].value
|
864
|
+
assert_equal 'EN', form[:language].fallback_value
|
865
|
+
assert_equal 'EN', form[:language].export_value
|
866
|
+
form[:language].value = " "
|
867
|
+
assert_equal ' ', form[:language].value
|
868
|
+
assert_equal 'EN', form[:language].fallback_value
|
869
|
+
assert_equal 'EN', form[:language].export_value
|
870
|
+
end
|
871
|
+
|
872
|
+
def test_export_values_with_default_values
|
873
|
+
form = ActiveForm::compose :form do |f|
|
874
|
+
f.text_element :name, :default => 'anonymous'
|
875
|
+
f.section :details do |s|
|
876
|
+
s.text_element :city
|
877
|
+
s.text_element :district
|
878
|
+
s.text_element :country, :default => 'US'
|
879
|
+
s.section :specs do |gg|
|
880
|
+
gg.text_element :specification, :default => 'special'
|
881
|
+
end
|
882
|
+
end
|
883
|
+
end
|
884
|
+
assert_equal nil, form[:name].value
|
885
|
+
assert_equal 'anonymous', form[:name].fallback_value
|
886
|
+
assert_equal 'anonymous', form[:name].export_value
|
887
|
+
|
888
|
+
expected = {"name"=>nil, "details"=>{"city"=>nil, "specs"=>{"specification"=>nil}, "district"=>nil, "country"=>nil}}
|
889
|
+
assert_equal expected, form.values
|
890
|
+
|
891
|
+
expected = {"name"=>"anonymous", "details"=>{"city"=>nil, "specs"=>{"specification"=>"special"}, "district"=>nil, "country"=>"US"}}
|
892
|
+
assert_equal expected, form.export_values
|
893
|
+
|
894
|
+
form[:details][:country].value = 'BE'
|
895
|
+
expected = {"name"=>"anonymous", "details"=>{"city"=>nil, "specs"=>{"specification"=>"special"}, "district"=>nil, "country"=>"BE"}}
|
896
|
+
assert_equal expected, form.values(true) # equivalent to export_values
|
897
|
+
|
898
|
+
form[:name].value = 'Fred Flintstone'
|
899
|
+
assert_equal 'Fred Flintstone', form[:name].value
|
900
|
+
assert_equal 'anonymous', form[:name].fallback_value
|
901
|
+
assert_equal 'Fred Flintstone', form[:name].export_value
|
902
|
+
end
|
903
|
+
|
904
|
+
def test_localizer
|
905
|
+
translations = {
|
906
|
+
'contact_form_firstname_label' => 'Voornaam',
|
907
|
+
'contact_form_lastname_label' => 'Achternaam',
|
908
|
+
'contact_form_country_label' => 'Land',
|
909
|
+
'contact_form_password_label' => 'Wachtwoord',
|
910
|
+
'contact_form_password_new_label' => 'Nieuw wachtwoord',
|
911
|
+
'contact_form_password_confirm_label' => 'Wachtwoord bevestiging'
|
912
|
+
}
|
913
|
+
form = ActiveForm::compose :contact_form do |f|
|
914
|
+
f.define_localizer { |formname, elemname, key| translations[ [formname, elemname, key].compact.join('_') ] }
|
915
|
+
f.text_element :firstname
|
916
|
+
f.text_element :lastname
|
917
|
+
f.text_element :country
|
918
|
+
f.section :password do |s|
|
919
|
+
s.password_element :new
|
920
|
+
s.password_element :confirm
|
921
|
+
end
|
922
|
+
end
|
923
|
+
assert form.localized?
|
924
|
+
assert form[:firstname].localized?
|
925
|
+
assert form[:password][:confirm].localized?
|
926
|
+
form.elements.each do |e|
|
927
|
+
assert_equal translations[e.identifier + '_label'], e.label
|
928
|
+
end
|
929
|
+
end
|
930
|
+
|
931
|
+
def test_localizer_fallback
|
932
|
+
translations = {
|
933
|
+
'contact_form_firstname_title' => 'Uw voornaam',
|
934
|
+
'contact_form_firstname_label' => 'Voornaam',
|
935
|
+
'contact_form_lastname_label' => 'Achternaam',
|
936
|
+
'contact_form_country_label' => nil
|
937
|
+
}
|
938
|
+
form = ActiveForm::compose :contact_form do |f|
|
939
|
+
f.define_localizer { |formname, elemname, key| translations[ [formname, elemname, key].compact.join('_') ] }
|
940
|
+
f.text_element :firstname, :title => 'Your firstname'
|
941
|
+
f.text_element :lastname, :title => 'Your familyname'
|
942
|
+
f.text_element :country
|
943
|
+
f.password_element :password
|
944
|
+
end
|
945
|
+
assert form.localized?
|
946
|
+
assert_equal 'Uw voornaam', form[:firstname].title
|
947
|
+
assert_equal 'Voornaam', form[:firstname].label
|
948
|
+
assert_equal 'Achternaam', form[:lastname].label
|
949
|
+
assert_equal 'Your familyname', form[:lastname].title
|
950
|
+
assert_equal 'Country', form[:country].label
|
951
|
+
assert_equal 'Password', form[:password].label
|
952
|
+
end
|
953
|
+
|
954
|
+
def test_form_submitted
|
955
|
+
form = ActiveForm::compose :form do |f|
|
956
|
+
f.text_element :name
|
957
|
+
f.text_element :language
|
958
|
+
f.submit_element :send
|
959
|
+
end
|
960
|
+
assert !form.submitted?
|
961
|
+
# coming from click on submit button
|
962
|
+
form[:send].value = 'Send'
|
963
|
+
assert form.submitted?
|
964
|
+
end
|
965
|
+
|
966
|
+
def test_render_individual_element
|
967
|
+
form = ActiveForm::compose :form do |f|
|
968
|
+
f.text_element :name
|
969
|
+
f.text_element :language
|
970
|
+
f.submit_element :send
|
971
|
+
end
|
972
|
+
expected = %|<label for="form_name">Name</label>\n|
|
973
|
+
assert_equal expected, form.label_for_name
|
974
|
+
expected = %|<input class="elem_text" id="form_name" name="form[name]" size="30" type="text"/>\n|
|
975
|
+
assert_equal expected, form.html_for_name
|
976
|
+
assert_equal form[:language].to_html, form.html_for_language
|
977
|
+
assert_equal form[:send].to_html, form.html_for_send
|
978
|
+
end
|
979
|
+
|
980
|
+
end
|
981
|
+
|
982
|
+
# class TestHtmlRendering < Test::Unit::TestCase
|
983
|
+
#
|
984
|
+
# def test_truth
|
985
|
+
#
|
986
|
+
# form = ActiveForm::compose :form do |f|
|
987
|
+
# f.text_element :elem_a
|
988
|
+
# f.text_element :elem_b
|
989
|
+
# f.section :section, :class => 'specialsection' do |s|
|
990
|
+
# g.text_element :elem_a, :style => 'color: red' do |e|
|
991
|
+
# e.define_formatting_filter { |value| value.join(', ') }
|
992
|
+
# e.define_casting_filter { |value| value.split(/,\s+/) }
|
993
|
+
# end
|
994
|
+
# g.text_element :elem_b, :class => 'specialelem'
|
995
|
+
# g.section :section do |s|
|
996
|
+
# g.text_element :elem_a, :disabled => true
|
997
|
+
# g.text_element :elem_b, :readonly => true
|
998
|
+
# end
|
999
|
+
# end
|
1000
|
+
# end
|
1001
|
+
#
|
1002
|
+
# form.define_form :one do |f|
|
1003
|
+
# f.text_element :sub_a
|
1004
|
+
# f.text_element :sub_b
|
1005
|
+
# end
|
1006
|
+
#
|
1007
|
+
# form.define_form :two do |f|
|
1008
|
+
# f.text_element :sub_a
|
1009
|
+
# f.text_element :sub_b do |e|
|
1010
|
+
# e.onblur = "alert('yes!')"
|
1011
|
+
# end
|
1012
|
+
# end
|
1013
|
+
#
|
1014
|
+
# ActiveForm::Definition.define_container_wrapper do |builder, elem, render|
|
1015
|
+
# builder.form(elem.element_attributes) {
|
1016
|
+
# builder.table(:border => 1) {
|
1017
|
+
# builder.thead { builder.tr { builder.th(elem.label, :colspan => 2) } }
|
1018
|
+
# builder.tbody { elem.render_elements(builder) }
|
1019
|
+
# }
|
1020
|
+
# builder << elem.script_tag
|
1021
|
+
# }
|
1022
|
+
# end
|
1023
|
+
#
|
1024
|
+
# ActiveForm::Definition.define_element_wrapper do |builder, elem, render|
|
1025
|
+
# style = StyleAttribute.new
|
1026
|
+
# style << 'margin: 20px'
|
1027
|
+
# style << 'display: none' if elem.hidden?
|
1028
|
+
# builder.tr { builder.td { builder.table(:border => 1, :style => style, &render) } }
|
1029
|
+
# end
|
1030
|
+
#
|
1031
|
+
# ActiveForm::Element::Base.define_element_wrapper do |builder, elem, render|
|
1032
|
+
# builder.tr(:class => 'label') { builder.td(:colspan => 2) { elem.render_label(builder) } }
|
1033
|
+
# builder.tr(:id => "elem_#{elem.identifier}", :class => elem.css, :style => elem.style) { builder.td(:class => 'elem', :colspan => 2, &render) }
|
1034
|
+
# end
|
1035
|
+
#
|
1036
|
+
# ActiveForm::Element::Section.define_element_wrapper do |builder, elem, render|
|
1037
|
+
# builder.tr { builder.td { builder.table(:border => 1, :style => 'background: orange; margin: 20px', &render) } }
|
1038
|
+
# end
|
1039
|
+
#
|
1040
|
+
# form.update_from_params(:form => { :elem_a => 'test', :elem_b => 'tester', :section => { :elem_a => 'one, two, three' }, :two => { :sub_a => 'subvalue' } })
|
1041
|
+
#
|
1042
|
+
# #form.display
|
1043
|
+
#
|
1044
|
+
# ActiveForm::Definition.reset_element_wrapper
|
1045
|
+
# ActiveForm::Definition.reset_container_wrapper
|
1046
|
+
# ActiveForm::Element::Base.reset_element_wrapper
|
1047
|
+
# ActiveForm::Element::Section.reset_element_wrapper
|
1048
|
+
# end
|
1049
|
+
#
|
1050
|
+
# end
|