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.
- 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
|