sinatra_more 0.1.9 → 0.1.10
Sign up to get free protection for your applications and to get access to all the features.
- data/README.rdoc +10 -2
- data/TODO +2 -6
- data/VERSION +1 -1
- data/lib/sinatra_more/markup_plugin/form_builder/abstract_form_builder.rb +23 -17
- data/lib/sinatra_more/markup_plugin/form_builder/standard_form_builder.rb +1 -1
- data/lib/sinatra_more/markup_plugin/form_helpers.rb +37 -9
- data/lib/sinatra_more/markup_plugin/format_helpers.rb +14 -1
- data/sinatra_more.gemspec +1 -1
- data/test/fixtures/markup_app/app.rb +1 -0
- data/test/fixtures/markup_app/views/form_for.erb +2 -0
- data/test/fixtures/markup_app/views/form_for.haml +2 -0
- data/test/fixtures/markup_app/views/form_tag.erb +2 -0
- data/test/fixtures/markup_app/views/form_tag.haml +2 -0
- data/test/markup_plugin/test_form_builder.rb +37 -5
- data/test/markup_plugin/test_form_helpers.rb +41 -4
- data/test/markup_plugin/test_format_helpers.rb +17 -0
- metadata +1 -1
data/README.rdoc
CHANGED
@@ -114,6 +114,7 @@ methods should be very familiar to anyone who has used rails view helpers.
|
|
114
114
|
|
115
115
|
* <tt>form_tag(url, options={}, &block)</tt>
|
116
116
|
* Constructs a form without object based on options
|
117
|
+
* Supports form methods 'put' and 'delete' through hidden field
|
117
118
|
* <tt>form_tag('/register', :class => 'example') { ... }</tt>
|
118
119
|
* <tt>field_set_tag(*args, &block)</tt>
|
119
120
|
* Constructs a field_set to group fields with given options
|
@@ -126,6 +127,9 @@ methods should be very familiar to anyone who has used rails view helpers.
|
|
126
127
|
* Constructs a label tag from the given options
|
127
128
|
* <tt>label_tag :username, :class => 'long-label'</tt>
|
128
129
|
* <tt>label_tag(:username, :class => 'blocked-label') { ... }</tt>
|
130
|
+
* <tt>hidden_field_tag(name, options={})</tt>
|
131
|
+
* Constructs a hidden field input from the given options
|
132
|
+
* <tt>hidden_field_tag :session_key, :value => 'secret'</tt>
|
129
133
|
* <tt>text_field_tag(name, options={})</tt>
|
130
134
|
* Constructs a text field input from the given options
|
131
135
|
* <tt>text_field_tag :username, :class => 'long'</tt>
|
@@ -144,7 +148,7 @@ methods should be very familiar to anyone who has used rails view helpers.
|
|
144
148
|
|
145
149
|
A form_tag might look like:
|
146
150
|
|
147
|
-
- form_tag '/
|
151
|
+
- form_tag '/destroy', :class => 'destroy-form', :method => 'delete' do
|
148
152
|
= flash_tag(:notice)
|
149
153
|
- field_set_tag do
|
150
154
|
%p
|
@@ -154,7 +158,7 @@ A form_tag might look like:
|
|
154
158
|
= label_tag :password, :class => 'first'
|
155
159
|
= password_field_tag :password, :value => params[:password]
|
156
160
|
- field_set_tag(:class => 'buttons') do
|
157
|
-
= submit_tag "
|
161
|
+
= submit_tag "Remove"
|
158
162
|
|
159
163
|
==== FormBuilders
|
160
164
|
|
@@ -171,6 +175,8 @@ The following are fields provided by AbstractFormBuilder that can be used within
|
|
171
175
|
* <tt>f.label :name, :class => 'long'</tt>
|
172
176
|
* <tt>text_field(field, options={})</tt>
|
173
177
|
* <tt>f.text_field :username, :class => 'long'</tt>
|
178
|
+
* <tt>hidden_field(field, options={})</tt>
|
179
|
+
* <tt>f.hidden_field :session_id, :class => 'hidden'</tt>
|
174
180
|
* <tt>text_area(field, options={})</tt>
|
175
181
|
* <tt>f.text_area :summary, :class => 'long'</tt>
|
176
182
|
* <tt>password_field(field, options={})</tt>
|
@@ -228,6 +234,8 @@ and would generate this html:
|
|
228
234
|
|
229
235
|
==== Format Helpers
|
230
236
|
|
237
|
+
* <tt>escape_html</tt> (alias <tt>h</tt> and <tt>h!</tt>)
|
238
|
+
* (from RackUtils) Escape ampersands, brackets and quotes to their HTML/XML entities.
|
231
239
|
* <tt>relative_time_ago(date)</tt>
|
232
240
|
* Returns relative time in words referencing the given date
|
233
241
|
* <tt>relative_time_ago(2.days.ago)</tt> => "2 days ago"
|
data/TODO
CHANGED
@@ -5,21 +5,17 @@
|
|
5
5
|
* Take advantage of shared strategies: http://github.com/hassox/warden_strategies/tree/master/lib/
|
6
6
|
* Make warden password strategy support a callback which explains what to do with username, password
|
7
7
|
* WardenPlugin.authenticate_callback { |username, password| User.authenticate(username, password) }
|
8
|
-
* Remove dependency on activesupport! and enumerate dependencies in rakefile
|
9
8
|
* Add support for missing formhelpers/fields (check_box, radio_button, ...)
|
10
|
-
* Add support for forms with method => put, delete using hidden field
|
11
9
|
* Look into creating sinatra generators using rubigen (http://github.com/drnic/rubigen)
|
12
10
|
* http://github.com/quirkey/sinatra-gen
|
13
11
|
* Look into adding any missing helpers from:
|
14
|
-
* http://github.com/sbfaulkner/sinatra-helpers/tree/master/lib/sinatra-helpers/haml/
|
15
|
-
* http://github.com/sbfaulkner/sinatra-helpers/blob/master/lib/sinatra-helpers/html/escape.rb
|
16
|
-
* http://github.com/sbfaulkner/sinatra-helpers/blob/master/lib/sinatra-helpers/haml/links.rb
|
17
|
-
* http://github.com/kelredd/sinatra-helpers/tree/master/lib/sinatra_helpers/mailer/
|
18
12
|
* http://github.com/kelredd/sinatra-helpers/blob/master/lib/sinatra_helpers/erb/links.rb
|
19
13
|
* http://github.com/kelredd/sinatra-helpers/blob/master/lib/sinatra_helpers/erb/forms.rb
|
20
14
|
|
21
15
|
= COMPLETED
|
22
16
|
|
17
|
+
* Add support for forms with method => put, delete using hidden field
|
18
|
+
* Remove dependency on activesupport! and enumerate dependencies in rakefile (as much as possible, need inflectors)
|
23
19
|
* Pull from sinatra-helpers and make erb templates work (and credit keldredd)
|
24
20
|
* http://github.com/kelredd/sinatra-helpers/tree/master/lib/sinatra_helpers/erb/
|
25
21
|
* fix content_block_tag to eliminate need for concat option
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.1.
|
1
|
+
0.1.10
|
@@ -1,83 +1,89 @@
|
|
1
1
|
class AbstractFormBuilder
|
2
2
|
attr_accessor :template, :object
|
3
|
-
|
3
|
+
|
4
4
|
def initialize(template, object)
|
5
5
|
raise "FormBuilder template must be initialized!" unless template
|
6
6
|
raise "FormBuilder object must be initialized!" unless object
|
7
7
|
@template = template
|
8
8
|
@object = object
|
9
9
|
end
|
10
|
-
|
10
|
+
|
11
11
|
# f.error_messages
|
12
12
|
def error_messages(options={})
|
13
13
|
@template.error_messages_for(@object, options)
|
14
14
|
end
|
15
|
-
|
15
|
+
|
16
16
|
# f.label :username, :caption => "Nickname"
|
17
17
|
def label(field, options={})
|
18
18
|
options.reverse_merge!(:caption => field.to_s.titleize)
|
19
19
|
@template.label_tag(field_id(field), options)
|
20
20
|
end
|
21
|
-
|
21
|
+
|
22
|
+
# f.hidden_field :session_id, :value => "45"
|
23
|
+
def hidden_field(field, options={})
|
24
|
+
options.reverse_merge!(:value => field_value(field), :id => field_id(field))
|
25
|
+
@template.hidden_field_tag field_name(field), options
|
26
|
+
end
|
27
|
+
|
22
28
|
# f.text_field :username, :value => "(blank)", :id => 'username'
|
23
29
|
def text_field(field, options={})
|
24
30
|
options.reverse_merge!(:value => field_value(field), :id => field_id(field))
|
25
31
|
@template.text_field_tag field_name(field), options
|
26
32
|
end
|
27
|
-
|
33
|
+
|
28
34
|
# f.text_area :summary, :value => "(enter summary)", :id => 'summary'
|
29
35
|
def text_area(field, options={})
|
30
36
|
options.reverse_merge!(:value => field_value(field), :id => field_id(field))
|
31
37
|
@template.text_area_tag field_name(field), options
|
32
38
|
end
|
33
|
-
|
39
|
+
|
34
40
|
# f.password_field :password, :id => 'password'
|
35
41
|
def password_field(field, options={})
|
36
42
|
options.reverse_merge!(:value => field_value(field), :id => field_id(field))
|
37
43
|
@template.password_field_tag field_name(field), options
|
38
44
|
end
|
39
|
-
|
45
|
+
|
40
46
|
# f.file_field(:photo, :class => 'avatar')
|
41
47
|
def file_field(field, options={})
|
42
48
|
options.reverse_merge!(:id => field_id(field))
|
43
49
|
@template.file_field_tag field_name(field), options
|
44
50
|
end
|
45
|
-
|
51
|
+
|
46
52
|
# f.submit "Update", :class => 'large'
|
47
53
|
def submit(caption="Submit", options={})
|
48
54
|
@template.submit_tag caption, options
|
49
55
|
end
|
50
|
-
|
56
|
+
|
51
57
|
protected
|
52
|
-
|
58
|
+
|
53
59
|
# Returns the known field types for a formbuilder
|
54
60
|
def self.field_types
|
55
|
-
[:text_field, :text_area, :password_field, :file_field]
|
61
|
+
[:text_field, :text_area, :password_field, :file_field, :hidden_field]
|
56
62
|
end
|
57
|
-
|
63
|
+
|
58
64
|
private
|
59
|
-
|
65
|
+
|
60
66
|
# Returns the object's models name
|
61
67
|
# => user_assignment
|
62
68
|
def object_name
|
63
69
|
object.class.to_s.underscore
|
64
70
|
end
|
65
|
-
|
71
|
+
|
66
72
|
# Returns the value for the object's field
|
67
73
|
# field_value(:username) => "Joey"
|
68
74
|
def field_value(field)
|
69
75
|
@object && @object.respond_to?(field) ? @object.send(field) : ""
|
70
76
|
end
|
71
|
-
|
77
|
+
|
72
78
|
# Returns the name for the given field
|
73
79
|
# field_name(:username) => "user[username]"
|
74
80
|
def field_name(field)
|
75
81
|
"#{object_name}[#{field}]"
|
76
82
|
end
|
77
|
-
|
83
|
+
|
78
84
|
# Returns the id for the given field
|
79
85
|
# field_id(:username) => "user_username"
|
80
86
|
def field_id(field)
|
81
87
|
"#{object_name}_#{field}"
|
82
88
|
end
|
83
|
-
end
|
89
|
+
end
|
@@ -4,7 +4,7 @@ class StandardFormBuilder < AbstractFormBuilder
|
|
4
4
|
# text_area_block(:username, { :class => 'long' }, { :class => 'wide-label' })
|
5
5
|
# password_field_block(:username, { :class => 'long' }, { :class => 'wide-label' })
|
6
6
|
# file_field_block(:username, { :class => 'long' }, { :class => 'wide-label' })
|
7
|
-
self.field_types.each do |field_type|
|
7
|
+
(self.field_types - [:hidden_field]).each do |field_type|
|
8
8
|
class_eval <<-EOF
|
9
9
|
def #{field_type}_block(field, options={}, label_options={})
|
10
10
|
label_options.reverse_merge!(:caption => options.delete(:caption)) if options[:caption]
|
@@ -3,22 +3,20 @@ module SinatraMore
|
|
3
3
|
# Constructs a form for object using given or default form_builder
|
4
4
|
# form_for @user, '/register', :id => 'register' do |f| ... end
|
5
5
|
def form_for(object, url, settings={}, &block)
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
settings.reverse_merge!(:method => 'post', :action => url)
|
10
|
-
settings[:enctype] = "multipart/form-data" if settings.delete(:multipart)
|
11
|
-
form_html = capture_html(configured_builder.new(self, object), &block)
|
12
|
-
concat_content content_tag('form', form_html, settings)
|
6
|
+
builder_class = configured_form_builder_class(settings[:builder])
|
7
|
+
form_html = capture_html(builder_class.new(self, object), &block)
|
8
|
+
form_tag(url, settings) { form_html }
|
13
9
|
end
|
14
10
|
|
15
11
|
# Constructs a form without object based on options
|
16
12
|
# form_tag '/register' do ... end
|
17
13
|
def form_tag(url, options={}, &block)
|
18
14
|
options.reverse_merge!(:method => 'post', :action => url)
|
19
|
-
|
15
|
+
options[:enctype] = "multipart/form-data" if options.delete(:multipart)
|
16
|
+
inner_form_html = hidden_form_method_field(options[:method]) + capture_html(&block)
|
17
|
+
concat_content content_tag('form', inner_form_html, options)
|
20
18
|
end
|
21
|
-
|
19
|
+
|
22
20
|
# Constructs a field_set to group fields with given options
|
23
21
|
# field_set_tag("Office", :class => 'office-set')
|
24
22
|
# parameters: legend_text=nil, options={}
|
@@ -56,6 +54,13 @@ module SinatraMore
|
|
56
54
|
end
|
57
55
|
end
|
58
56
|
|
57
|
+
# Constructs a hidden field input from the given options
|
58
|
+
# hidden_field_tag :session_key, :value => "__secret__"
|
59
|
+
def hidden_field_tag(name, options={})
|
60
|
+
options.reverse_merge!(:name => name)
|
61
|
+
input_tag(:hidden, options)
|
62
|
+
end
|
63
|
+
|
59
64
|
# Constructs a text field input from the given options
|
60
65
|
# text_field_tag :username, :class => 'long'
|
61
66
|
def text_field_tag(name, options={})
|
@@ -90,5 +95,28 @@ module SinatraMore
|
|
90
95
|
options.reverse_merge!(:value => caption)
|
91
96
|
input_tag(:submit, options)
|
92
97
|
end
|
98
|
+
|
99
|
+
protected
|
100
|
+
|
101
|
+
# returns the hidden method field for 'put' and 'delete' forms
|
102
|
+
# Only 'get' and 'post' are allowed within browsers;
|
103
|
+
# 'put' and 'delete' are just specified using hidden fields with form action still 'put'.
|
104
|
+
# hidden_form_method_field('delete') => <input name="_method" value="delete" />
|
105
|
+
def hidden_form_method_field(desired_method)
|
106
|
+
return '' if (desired_method =~ /get|post/)
|
107
|
+
original_method = desired_method.dup
|
108
|
+
desired_method.replace('post')
|
109
|
+
hidden_field_tag(:_method, :value => original_method)
|
110
|
+
end
|
111
|
+
|
112
|
+
# Returns the FormBuilder class to use based on all available setting sources
|
113
|
+
# If explicitly defined, returns that, otherwise returns defaults
|
114
|
+
# configured_form_builder_class(nil) => StandardFormBuilder
|
115
|
+
def configured_form_builder_class(explicit_builder=nil)
|
116
|
+
default_builder = self.respond_to?(:options) && self.options.default_builder
|
117
|
+
configured_builder = explicit_builder || default_builder || 'StandardFormBuilder'
|
118
|
+
configured_builder = configured_builder.constantize if configured_builder.is_a?(String)
|
119
|
+
configured_builder
|
120
|
+
end
|
93
121
|
end
|
94
122
|
end
|
@@ -1,6 +1,19 @@
|
|
1
1
|
module SinatraMore
|
2
2
|
module FormatHelpers
|
3
|
-
|
3
|
+
|
4
|
+
# Returns escaped text to protect against malicious content
|
5
|
+
def h(text)
|
6
|
+
Rack::Utils.escape_html(text)
|
7
|
+
end
|
8
|
+
alias escape_html h
|
9
|
+
|
10
|
+
# Returns escaped text to protect against malicious content
|
11
|
+
# Returns blank if the text is empty
|
12
|
+
def h!(text, blank_text = ' ')
|
13
|
+
return blank_text if text.nil? || text.empty?
|
14
|
+
h text
|
15
|
+
end
|
16
|
+
|
4
17
|
# Returns relative time in words referencing the given date
|
5
18
|
# relative_time_ago(Time.now)
|
6
19
|
def relative_time_ago(date)
|
data/sinatra_more.gemspec
CHANGED
@@ -1,5 +1,6 @@
|
|
1
1
|
<% form_for MarkupUser.new, '/demo', :id => 'demo' do |f| %>
|
2
2
|
<%= f.error_messages(:header_message => "custom MarkupUser cannot be saved!") %>
|
3
|
+
<%= f.hidden_field :session_id %>
|
3
4
|
<p>
|
4
5
|
<%= f.label :username, :caption => "Login", :class => 'user-label' %>
|
5
6
|
<%= f.text_field :username, :class => 'user-text', :value => "John" %>
|
@@ -25,6 +26,7 @@
|
|
25
26
|
|
26
27
|
<% form_for MarkupUser.new, '/another_demo', :id => 'demo2', :method => 'get' do |f| %>
|
27
28
|
<%= f.error_messages :header_message => "custom MarkupUser cannot be saved!" %>
|
29
|
+
<%= f.hidden_field :session_id %>
|
28
30
|
<%= f.text_field_block :username, { :class => 'input' }, { :caption => 'Nickname', :class => 'label' } %>
|
29
31
|
<%= f.password_field_block :code, { :class => 'input' } %>
|
30
32
|
<%= f.text_area_block :about, { :class => 'textarea' } %>
|
@@ -1,5 +1,6 @@
|
|
1
1
|
- form_for MarkupUser.new, '/demo', :id => 'demo' do |f|
|
2
2
|
= f.error_messages(:header_message => "custom MarkupUser cannot be saved!")
|
3
|
+
= f.hidden_field :session_id
|
3
4
|
%p
|
4
5
|
= f.label :username, :caption => "Login", :class => 'user-label'
|
5
6
|
= f.text_field :username, :class => 'user-text', :value => "John"
|
@@ -20,6 +21,7 @@
|
|
20
21
|
|
21
22
|
- form_for MarkupUser.new, '/another_demo', :id => 'demo2', :method => 'get' do |f|
|
22
23
|
= f.error_messages :header_message => "custom MarkupUser cannot be saved!"
|
24
|
+
= f.hidden_field :session_id
|
23
25
|
= f.text_field_block :username, { :class => 'input' }, { :caption => 'Nickname', :class => 'label' }
|
24
26
|
= f.password_field_block :code, { :class => 'input' }
|
25
27
|
= f.text_area_block :about, { :class => 'textarea' }
|
@@ -1,5 +1,6 @@
|
|
1
1
|
<% form_tag '/simple', :class => 'simple-form' do %>
|
2
2
|
<%= error_messages_for(nil) %>
|
3
|
+
<%= hidden_field_tag :session_id, :value => "__secret__" %>
|
3
4
|
<% field_set_tag do %>
|
4
5
|
<%= label_tag :username %>
|
5
6
|
<%= text_field_tag :username %>
|
@@ -11,6 +12,7 @@
|
|
11
12
|
|
12
13
|
<% form_tag '/advanced', :id => 'advanced', :class => 'advanced-form', :method => 'get' do %>
|
13
14
|
<%= error_messages_for MarkupUser.new, :header_message => "There are problems with saving user!" %>
|
15
|
+
<%= hidden_field_tag :session_id, :value => "__secret__" %>
|
14
16
|
<% field_set_tag "Advanced", :class => 'advanced-field-set' do %>
|
15
17
|
<p>
|
16
18
|
<%= label_tag :username, :class => 'first', :caption => "Nickname" %>
|
@@ -1,6 +1,7 @@
|
|
1
1
|
- form_tag '/simple', :class => 'simple-form' do
|
2
2
|
= error_messages_for nil
|
3
3
|
- field_set_tag do
|
4
|
+
= hidden_field_tag :session_id, :value => "__secret__"
|
4
5
|
= label_tag :username
|
5
6
|
= text_field_tag :username
|
6
7
|
= label_tag :password
|
@@ -9,6 +10,7 @@
|
|
9
10
|
|
10
11
|
- form_tag '/advanced', :id => 'advanced', :class => 'advanced-form', :method => 'get' do
|
11
12
|
= error_messages_for MarkupUser.new, :header_message => "There are problems with saving user!"
|
13
|
+
= hidden_field_tag :session_id, :value => "__secret__"
|
12
14
|
- field_set_tag "Advanced", :class => 'advanced-field-set' do
|
13
15
|
%p
|
14
16
|
= label_tag :username, :class => 'first', :caption => "Nickname"
|
@@ -9,7 +9,7 @@ class TestFormBuilder < Test::Unit::TestCase
|
|
9
9
|
end
|
10
10
|
|
11
11
|
def setup
|
12
|
-
@user = stub(:errors => stub(:full_messages => ["1", "2"], :none? => false), :class => 'User', :first_name => "Joe")
|
12
|
+
@user = stub(:errors => stub(:full_messages => ["1", "2"], :none? => false), :class => 'User', :first_name => "Joe", :session_id => 54)
|
13
13
|
@user_none = stub(:errors => stub(:none? => true), :class => 'User')
|
14
14
|
end
|
15
15
|
|
@@ -19,8 +19,21 @@ class TestFormBuilder < Test::Unit::TestCase
|
|
19
19
|
|
20
20
|
context 'for #form_for method' do
|
21
21
|
should "display correct form html" do
|
22
|
-
actual_html = form_for(@user, '/register', :id => 'register') { "Demo" }
|
23
|
-
assert_has_tag('form', :action => '/register', :id => 'register', :content => "Demo") { actual_html }
|
22
|
+
actual_html = form_for(@user, '/register', :id => 'register', :method => 'post') { "Demo" }
|
23
|
+
assert_has_tag('form', :action => '/register', :id => 'register', :method => 'post', :content => "Demo") { actual_html }
|
24
|
+
assert_has_tag('form input[type=hidden]', :name => '_method', :count => 0) { actual_html } # no method action field
|
25
|
+
end
|
26
|
+
|
27
|
+
should "display correct form html with method :post" do
|
28
|
+
actual_html = form_for(@user, '/update', :method => 'put') { "Demo" }
|
29
|
+
assert_has_tag('form', :action => '/update', :method => 'post') { actual_html }
|
30
|
+
assert_has_tag('form input', :type => 'hidden', :name => "_method", :value => 'put') { actual_html }
|
31
|
+
end
|
32
|
+
|
33
|
+
should "display correct form html with method :delete" do
|
34
|
+
actual_html = form_for(@user, '/destroy', :method => 'delete') { "Demo" }
|
35
|
+
assert_has_tag('form', :action => '/destroy', :method => 'post') { actual_html }
|
36
|
+
assert_has_tag('form input', :type => 'hidden', :name => "_method", :value => 'delete') { actual_html }
|
24
37
|
end
|
25
38
|
|
26
39
|
should "display correct form html with multipart" do
|
@@ -106,6 +119,25 @@ class TestFormBuilder < Test::Unit::TestCase
|
|
106
119
|
end
|
107
120
|
end
|
108
121
|
|
122
|
+
context 'for #hidden_field method' do
|
123
|
+
should "display correct hidden field html" do
|
124
|
+
actual_html = standard_builder.hidden_field(:session_id, :class => 'hidden')
|
125
|
+
assert_has_tag('input.hidden[type=hidden]', :value => "54", :id => 'user_session_id', :name => 'user[session_id]') { actual_html }
|
126
|
+
end
|
127
|
+
|
128
|
+
should "display correct hidden field in haml" do
|
129
|
+
visit '/haml/form_for'
|
130
|
+
assert_have_selector '#demo input[type=hidden]', :id => 'markup_user_session_id', :value => "45"
|
131
|
+
assert_have_selector '#demo2 input', :type => 'hidden', :name => 'markup_user[session_id]'
|
132
|
+
end
|
133
|
+
|
134
|
+
should "display correct hidden field in erb" do
|
135
|
+
visit '/erb/form_for'
|
136
|
+
assert_have_selector '#demo input[type=hidden]', :id => 'markup_user_session_id', :value => "45"
|
137
|
+
assert_have_selector '#demo2 input', :type => 'hidden', :name => 'markup_user[session_id]'
|
138
|
+
end
|
139
|
+
end
|
140
|
+
|
109
141
|
context 'for #text_field method' do
|
110
142
|
should "display correct text field html" do
|
111
143
|
actual_html = standard_builder.text_field(:first_name, :class => 'large')
|
@@ -115,13 +147,13 @@ class TestFormBuilder < Test::Unit::TestCase
|
|
115
147
|
should "display correct text field in haml" do
|
116
148
|
visit '/haml/form_for'
|
117
149
|
assert_have_selector '#demo input.user-text[type=text]', :id => 'markup_user_username', :value => "John"
|
118
|
-
assert_have_selector '#demo2 input', :class => 'input', :name => 'markup_user[username]'
|
150
|
+
assert_have_selector '#demo2 input', :type => 'text', :class => 'input', :name => 'markup_user[username]'
|
119
151
|
end
|
120
152
|
|
121
153
|
should "display correct text field in erb" do
|
122
154
|
visit '/erb/form_for'
|
123
155
|
assert_have_selector '#demo input.user-text[type=text]', :id => 'markup_user_username', :value => "John"
|
124
|
-
assert_have_selector '#demo2 input', :class => 'input', :name => 'markup_user[username]'
|
156
|
+
assert_have_selector '#demo2 input', :type => 'text', :class => 'input', :name => 'markup_user[username]'
|
125
157
|
end
|
126
158
|
end
|
127
159
|
|
@@ -10,15 +10,33 @@ class TestFormHelpers < Test::Unit::TestCase
|
|
10
10
|
|
11
11
|
context 'for #form_tag method' do
|
12
12
|
should "display correct forms in ruby" do
|
13
|
-
actual_html = form_tag('/register', :class => 'test', :
|
13
|
+
actual_html = form_tag('/register', :class => 'test', :method => "post") { "Demo" }
|
14
14
|
assert_has_tag(:form, :class => "test") { actual_html }
|
15
|
+
assert_has_tag('form input', :type => 'hidden', :name => '_method', :count => 0) { actual_html }
|
15
16
|
end
|
16
|
-
|
17
|
-
should "display correct inputs
|
18
|
-
actual_html = form_tag('/register', :class => 'test'
|
17
|
+
|
18
|
+
should "display correct text inputs within form_tag" do
|
19
|
+
actual_html = form_tag('/register', :class => 'test') { text_field_tag(:username) }
|
19
20
|
assert_has_tag('form input', :type => 'text', :name => "username") { actual_html }
|
20
21
|
end
|
21
22
|
|
23
|
+
should "display correct form with method :put" do
|
24
|
+
actual_html = form_tag('/update', :class => 'put-form', :method => "put") { "Demo" }
|
25
|
+
assert_has_tag(:form, :class => "put-form", :method => 'post') { actual_html }
|
26
|
+
assert_has_tag('form input', :type => 'hidden', :name => "_method", :value => 'put') { actual_html }
|
27
|
+
end
|
28
|
+
|
29
|
+
should "display correct form with method :delete" do
|
30
|
+
actual_html = form_tag('/remove', :class => 'delete-form', :method => "delete") { "Demo" }
|
31
|
+
assert_has_tag(:form, :class => "delete-form", :method => 'post') { actual_html }
|
32
|
+
assert_has_tag('form input', :type => 'hidden', :name => "_method", :value => 'delete') { actual_html }
|
33
|
+
end
|
34
|
+
|
35
|
+
should "display correct form with multipart encoding" do
|
36
|
+
actual_html = form_tag('/remove', :multipart => true) { "Demo" }
|
37
|
+
assert_has_tag(:form, :enctype => "multipart/form-data") { actual_html }
|
38
|
+
end
|
39
|
+
|
22
40
|
should "display correct forms in erb" do
|
23
41
|
visit '/erb/form_tag'
|
24
42
|
assert_have_selector 'form.simple-form', :action => '/simple'
|
@@ -124,6 +142,25 @@ class TestFormHelpers < Test::Unit::TestCase
|
|
124
142
|
end
|
125
143
|
end
|
126
144
|
|
145
|
+
context 'for #hidden_field_tag method' do
|
146
|
+
should "display hidden field in ruby" do
|
147
|
+
actual_html = hidden_field_tag(:session_key, :id => 'session_id', :value => '56768')
|
148
|
+
assert_has_tag(:input, :type => 'hidden', :id => "session_id", :name => 'session_key', :value => '56768') { actual_html }
|
149
|
+
end
|
150
|
+
|
151
|
+
should "display hidden field in erb" do
|
152
|
+
visit '/erb/form_tag'
|
153
|
+
assert_have_selector 'form.simple-form input[type=hidden]', :count => 1, :name => 'session_id', :value => "__secret__"
|
154
|
+
assert_have_selector 'form.advanced-form input[type=hidden]', :count => 1, :name => 'session_id', :value => "__secret__"
|
155
|
+
end
|
156
|
+
|
157
|
+
should "display hidden field in haml" do
|
158
|
+
visit '/haml/form_tag'
|
159
|
+
assert_have_selector 'form.simple-form input[type=hidden]', :count => 1, :name => 'session_id', :value => "__secret__"
|
160
|
+
assert_have_selector 'form.advanced-form input[type=hidden]', :count => 1, :name => 'session_id', :value => "__secret__"
|
161
|
+
end
|
162
|
+
end
|
163
|
+
|
127
164
|
context 'for #text_field_tag method' do
|
128
165
|
should "display text field in ruby" do
|
129
166
|
actual_html = text_field_tag(:username, :class => 'long')
|
@@ -8,6 +8,23 @@ class TestFormatHelpers < Test::Unit::TestCase
|
|
8
8
|
|
9
9
|
include SinatraMore::FormatHelpers
|
10
10
|
|
11
|
+
context 'for #h and #h! method' do
|
12
|
+
should "escape the simple html" do
|
13
|
+
assert_equal '<h1>hello</h1>', h('<h1>hello</h1>')
|
14
|
+
assert_equal '<h1>hello</h1>', escape_html('<h1>hello</h1>')
|
15
|
+
end
|
16
|
+
should "escape all brackets, quotes and ampersands" do
|
17
|
+
assert_equal '<h1><>"&demo&"<></h1>', h('<h1><>"&demo&"<></h1>')
|
18
|
+
end
|
19
|
+
should "return default text if text is empty" do
|
20
|
+
assert_equal 'default', h!("", "default")
|
21
|
+
assert_equal ' ', h!("")
|
22
|
+
end
|
23
|
+
should "return text escaped if not empty" do
|
24
|
+
assert_equal '<h1>hello</h1>', h!('<h1>hello</h1>')
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
11
28
|
context 'for #relative_time_ago method' do
|
12
29
|
should "display today" do
|
13
30
|
assert_equal 'today', relative_time_ago(Time.now)
|