Froze rails gems
[depot.git] / vendor / rails / actionpack / test / template / active_record_helper_test.rb
1 require 'abstract_unit'
2
3 class ActiveRecordHelperTest < ActionView::TestCase
4 tests ActionView::Helpers::ActiveRecordHelper
5
6 silence_warnings do
7 Post = Struct.new("Post", :title, :author_name, :body, :secret, :written_on)
8 Post.class_eval do
9 alias_method :title_before_type_cast, :title unless respond_to?(:title_before_type_cast)
10 alias_method :body_before_type_cast, :body unless respond_to?(:body_before_type_cast)
11 alias_method :author_name_before_type_cast, :author_name unless respond_to?(:author_name_before_type_cast)
12 end
13
14 User = Struct.new("User", :email)
15 User.class_eval do
16 alias_method :email_before_type_cast, :email unless respond_to?(:email_before_type_cast)
17 end
18
19 Column = Struct.new("Column", :type, :name, :human_name)
20 end
21
22 def setup_post
23 @post = Post.new
24 def @post.errors
25 Class.new {
26 def on(field)
27 case field.to_s
28 when "author_name"
29 "can't be empty"
30 when "body"
31 true
32 else
33 false
34 end
35 end
36 def empty?() false end
37 def count() 1 end
38 def full_messages() [ "Author name can't be empty" ] end
39 }.new
40 end
41
42 def @post.new_record?() true end
43 def @post.to_param() nil end
44
45 def @post.column_for_attribute(attr_name)
46 Post.content_columns.select { |column| column.name == attr_name }.first
47 end
48
49 silence_warnings do
50 def Post.content_columns() [ Column.new(:string, "title", "Title"), Column.new(:text, "body", "Body") ] end
51 end
52
53 @post.title = "Hello World"
54 @post.author_name = ""
55 @post.body = "Back to the hill and over it again!"
56 @post.secret = 1
57 @post.written_on = Date.new(2004, 6, 15)
58 end
59
60 def setup_user
61 @user = User.new
62 def @user.errors
63 Class.new {
64 def on(field) field == "email" end
65 def empty?() false end
66 def count() 1 end
67 def full_messages() [ "User email can't be empty" ] end
68 }.new
69 end
70
71 def @user.new_record?() true end
72 def @user.to_param() nil end
73
74 def @user.column_for_attribute(attr_name)
75 User.content_columns.select { |column| column.name == attr_name }.first
76 end
77
78 silence_warnings do
79 def User.content_columns() [ Column.new(:string, "email", "Email") ] end
80 end
81
82 @user.email = ""
83 end
84
85 def protect_against_forgery?
86 @protect_against_forgery ? true : false
87 end
88 attr_accessor :request_forgery_protection_token, :form_authenticity_token
89
90 def setup
91 setup_post
92 setup_user
93
94 @response = ActionController::TestResponse.new
95
96 @controller = Object.new
97 def @controller.url_for(options)
98 options = options.symbolize_keys
99
100 [options[:action], options[:id].to_param].compact.join('/')
101 end
102 end
103
104 def test_generic_input_tag
105 assert_dom_equal(
106 %(<input id="post_title" name="post[title]" size="30" type="text" value="Hello World" />), input("post", "title")
107 )
108 end
109
110 def test_text_area_with_errors
111 assert_dom_equal(
112 %(<div class="fieldWithErrors"><textarea cols="40" id="post_body" name="post[body]" rows="20">Back to the hill and over it again!</textarea></div>),
113 text_area("post", "body")
114 )
115 end
116
117 def test_text_field_with_errors
118 assert_dom_equal(
119 %(<div class="fieldWithErrors"><input id="post_author_name" name="post[author_name]" size="30" type="text" value="" /></div>),
120 text_field("post", "author_name")
121 )
122 end
123
124 def test_form_with_string
125 assert_dom_equal(
126 %(<form action="create" method="post"><p><label for="post_title">Title</label><br /><input id="post_title" name="post[title]" size="30" type="text" value="Hello World" /></p>\n<p><label for="post_body">Body</label><br /><div class="fieldWithErrors"><textarea cols="40" id="post_body" name="post[body]" rows="20">Back to the hill and over it again!</textarea></div></p><input name="commit" type="submit" value="Create" /></form>),
127 form("post")
128 )
129
130 silence_warnings do
131 class << @post
132 def new_record?() false end
133 def to_param() id end
134 def id() 1 end
135 end
136 end
137
138 assert_dom_equal(
139 %(<form action="update/1" method="post"><input id="post_id" name="post[id]" type="hidden" value="1" /><p><label for="post_title">Title</label><br /><input id="post_title" name="post[title]" size="30" type="text" value="Hello World" /></p>\n<p><label for="post_body">Body</label><br /><div class="fieldWithErrors"><textarea cols="40" id="post_body" name="post[body]" rows="20">Back to the hill and over it again!</textarea></div></p><input name="commit" type="submit" value="Update" /></form>),
140 form("post")
141 )
142 end
143
144 def test_form_with_protect_against_forgery
145 @protect_against_forgery = true
146 @request_forgery_protection_token = 'authenticity_token'
147 @form_authenticity_token = '123'
148 assert_dom_equal(
149 %(<form action="create" method="post"><div style='margin:0;padding:0'><input type='hidden' name='authenticity_token' value='123' /></div><p><label for="post_title">Title</label><br /><input id="post_title" name="post[title]" size="30" type="text" value="Hello World" /></p>\n<p><label for="post_body">Body</label><br /><div class="fieldWithErrors"><textarea cols="40" id="post_body" name="post[body]" rows="20">Back to the hill and over it again!</textarea></div></p><input name="commit" type="submit" value="Create" /></form>),
150 form("post")
151 )
152 end
153
154 def test_form_with_method_option
155 assert_dom_equal(
156 %(<form action="create" method="get"><p><label for="post_title">Title</label><br /><input id="post_title" name="post[title]" size="30" type="text" value="Hello World" /></p>\n<p><label for="post_body">Body</label><br /><div class="fieldWithErrors"><textarea cols="40" id="post_body" name="post[body]" rows="20">Back to the hill and over it again!</textarea></div></p><input name="commit" type="submit" value="Create" /></form>),
157 form("post", :method=>'get')
158 )
159 end
160
161 def test_form_with_action_option
162 @response.body = form("post", :action => "sign")
163 assert_select "form[action=sign]" do |form|
164 assert_select "input[type=submit][value=Sign]"
165 end
166 end
167
168 def test_form_with_date
169 silence_warnings do
170 def Post.content_columns() [ Column.new(:date, "written_on", "Written on") ] end
171 end
172
173 assert_dom_equal(
174 %(<form action="create" method="post"><p><label for="post_written_on">Written on</label><br /><select id="post_written_on_1i" name="post[written_on(1i)]">\n<option value="1999">1999</option>\n<option value="2000">2000</option>\n<option value="2001">2001</option>\n<option value="2002">2002</option>\n<option value="2003">2003</option>\n<option value="2004" selected="selected">2004</option>\n<option value="2005">2005</option>\n<option value="2006">2006</option>\n<option value="2007">2007</option>\n<option value="2008">2008</option>\n<option value="2009">2009</option>\n</select>\n<select id="post_written_on_2i" name="post[written_on(2i)]">\n<option value="1">January</option>\n<option value="2">February</option>\n<option value="3">March</option>\n<option value="4">April</option>\n<option value="5">May</option>\n<option value="6" selected="selected">June</option>\n<option value="7">July</option>\n<option value="8">August</option>\n<option value="9">September</option>\n<option value="10">October</option>\n<option value="11">November</option>\n<option value="12">December</option>\n</select>\n<select id="post_written_on_3i" name="post[written_on(3i)]">\n<option value="1">1</option>\n<option value="2">2</option>\n<option value="3">3</option>\n<option value="4">4</option>\n<option value="5">5</option>\n<option value="6">6</option>\n<option value="7">7</option>\n<option value="8">8</option>\n<option value="9">9</option>\n<option value="10">10</option>\n<option value="11">11</option>\n<option value="12">12</option>\n<option value="13">13</option>\n<option value="14">14</option>\n<option value="15" selected="selected">15</option>\n<option value="16">16</option>\n<option value="17">17</option>\n<option value="18">18</option>\n<option value="19">19</option>\n<option value="20">20</option>\n<option value="21">21</option>\n<option value="22">22</option>\n<option value="23">23</option>\n<option value="24">24</option>\n<option value="25">25</option>\n<option value="26">26</option>\n<option value="27">27</option>\n<option value="28">28</option>\n<option value="29">29</option>\n<option value="30">30</option>\n<option value="31">31</option>\n</select>\n</p><input name="commit" type="submit" value="Create" /></form>),
175 form("post")
176 )
177 end
178
179 def test_form_with_datetime
180 silence_warnings do
181 def Post.content_columns() [ Column.new(:datetime, "written_on", "Written on") ] end
182 end
183 @post.written_on = Time.gm(2004, 6, 15, 16, 30)
184
185 assert_dom_equal(
186 %(<form action="create" method="post"><p><label for="post_written_on">Written on</label><br /><select id="post_written_on_1i" name="post[written_on(1i)]">\n<option value="1999">1999</option>\n<option value="2000">2000</option>\n<option value="2001">2001</option>\n<option value="2002">2002</option>\n<option value="2003">2003</option>\n<option value="2004" selected="selected">2004</option>\n<option value="2005">2005</option>\n<option value="2006">2006</option>\n<option value="2007">2007</option>\n<option value="2008">2008</option>\n<option value="2009">2009</option>\n</select>\n<select id="post_written_on_2i" name="post[written_on(2i)]">\n<option value="1">January</option>\n<option value="2">February</option>\n<option value="3">March</option>\n<option value="4">April</option>\n<option value="5">May</option>\n<option value="6" selected="selected">June</option>\n<option value="7">July</option>\n<option value="8">August</option>\n<option value="9">September</option>\n<option value="10">October</option>\n<option value="11">November</option>\n<option value="12">December</option>\n</select>\n<select id="post_written_on_3i" name="post[written_on(3i)]">\n<option value="1">1</option>\n<option value="2">2</option>\n<option value="3">3</option>\n<option value="4">4</option>\n<option value="5">5</option>\n<option value="6">6</option>\n<option value="7">7</option>\n<option value="8">8</option>\n<option value="9">9</option>\n<option value="10">10</option>\n<option value="11">11</option>\n<option value="12">12</option>\n<option value="13">13</option>\n<option value="14">14</option>\n<option value="15" selected="selected">15</option>\n<option value="16">16</option>\n<option value="17">17</option>\n<option value="18">18</option>\n<option value="19">19</option>\n<option value="20">20</option>\n<option value="21">21</option>\n<option value="22">22</option>\n<option value="23">23</option>\n<option value="24">24</option>\n<option value="25">25</option>\n<option value="26">26</option>\n<option value="27">27</option>\n<option value="28">28</option>\n<option value="29">29</option>\n<option value="30">30</option>\n<option value="31">31</option>\n</select>\n &mdash; <select id="post_written_on_4i" name="post[written_on(4i)]">\n<option value="00">00</option>\n<option value="01">01</option>\n<option value="02">02</option>\n<option value="03">03</option>\n<option value="04">04</option>\n<option value="05">05</option>\n<option value="06">06</option>\n<option value="07">07</option>\n<option value="08">08</option>\n<option value="09">09</option>\n<option value="10">10</option>\n<option value="11">11</option>\n<option value="12">12</option>\n<option value="13">13</option>\n<option value="14">14</option>\n<option value="15">15</option>\n<option value="16" selected="selected">16</option>\n<option value="17">17</option>\n<option value="18">18</option>\n<option value="19">19</option>\n<option value="20">20</option>\n<option value="21">21</option>\n<option value="22">22</option>\n<option value="23">23</option>\n</select>\n : <select id="post_written_on_5i" name="post[written_on(5i)]">\n<option value="00">00</option>\n<option value="01">01</option>\n<option value="02">02</option>\n<option value="03">03</option>\n<option value="04">04</option>\n<option value="05">05</option>\n<option value="06">06</option>\n<option value="07">07</option>\n<option value="08">08</option>\n<option value="09">09</option>\n<option value="10">10</option>\n<option value="11">11</option>\n<option value="12">12</option>\n<option value="13">13</option>\n<option value="14">14</option>\n<option value="15">15</option>\n<option value="16">16</option>\n<option value="17">17</option>\n<option value="18">18</option>\n<option value="19">19</option>\n<option value="20">20</option>\n<option value="21">21</option>\n<option value="22">22</option>\n<option value="23">23</option>\n<option value="24">24</option>\n<option value="25">25</option>\n<option value="26">26</option>\n<option value="27">27</option>\n<option value="28">28</option>\n<option value="29">29</option>\n<option value="30" selected="selected">30</option>\n<option value="31">31</option>\n<option value="32">32</option>\n<option value="33">33</option>\n<option value="34">34</option>\n<option value="35">35</option>\n<option value="36">36</option>\n<option value="37">37</option>\n<option value="38">38</option>\n<option value="39">39</option>\n<option value="40">40</option>\n<option value="41">41</option>\n<option value="42">42</option>\n<option value="43">43</option>\n<option value="44">44</option>\n<option value="45">45</option>\n<option value="46">46</option>\n<option value="47">47</option>\n<option value="48">48</option>\n<option value="49">49</option>\n<option value="50">50</option>\n<option value="51">51</option>\n<option value="52">52</option>\n<option value="53">53</option>\n<option value="54">54</option>\n<option value="55">55</option>\n<option value="56">56</option>\n<option value="57">57</option>\n<option value="58">58</option>\n<option value="59">59</option>\n</select>\n</p><input name="commit" type="submit" value="Create" /></form>),
187 form("post")
188 )
189 end
190
191 def test_error_for_block
192 assert_dom_equal %(<div class="errorExplanation" id="errorExplanation"><h2>1 error prohibited this post from being saved</h2><p>There were problems with the following fields:</p><ul><li>Author name can't be empty</li></ul></div>), error_messages_for("post")
193 assert_equal %(<div class="errorDeathByClass" id="errorDeathById"><h1>1 error prohibited this post from being saved</h1><p>There were problems with the following fields:</p><ul><li>Author name can't be empty</li></ul></div>), error_messages_for("post", :class => "errorDeathByClass", :id => "errorDeathById", :header_tag => "h1")
194 assert_equal %(<div id="errorDeathById"><h1>1 error prohibited this post from being saved</h1><p>There were problems with the following fields:</p><ul><li>Author name can't be empty</li></ul></div>), error_messages_for("post", :class => nil, :id => "errorDeathById", :header_tag => "h1")
195 assert_equal %(<div class="errorDeathByClass"><h1>1 error prohibited this post from being saved</h1><p>There were problems with the following fields:</p><ul><li>Author name can't be empty</li></ul></div>), error_messages_for("post", :class => "errorDeathByClass", :id => nil, :header_tag => "h1")
196 end
197
198 def test_error_messages_for_handles_nil
199 assert_equal "", error_messages_for("notthere")
200 end
201
202 def test_error_message_on_handles_nil
203 assert_equal "", error_message_on("notthere", "notthere")
204 end
205
206 def test_error_message_on
207 assert_dom_equal "<div class=\"formError\">can't be empty</div>", error_message_on(:post, :author_name)
208 end
209
210 def test_error_message_on_no_instance_variable
211 other_post = @post
212 assert_dom_equal "<div class=\"formError\">can't be empty</div>", error_message_on(other_post, :author_name)
213 end
214
215 def test_error_message_on_with_options_hash
216 assert_dom_equal "<div class=\"differentError\">beforecan't be emptyafter</div>", error_message_on(:post, :author_name, :css_class => 'differentError', :prepend_text => 'before', :append_text => 'after')
217 end
218
219 def test_error_messages_for_many_objects
220 assert_dom_equal %(<div class="errorExplanation" id="errorExplanation"><h2>2 errors prohibited this post from being saved</h2><p>There were problems with the following fields:</p><ul><li>Author name can't be empty</li><li>User email can't be empty</li></ul></div>), error_messages_for("post", "user")
221
222 # reverse the order, error order changes and so does the title
223 assert_dom_equal %(<div class="errorExplanation" id="errorExplanation"><h2>2 errors prohibited this user from being saved</h2><p>There were problems with the following fields:</p><ul><li>User email can't be empty</li><li>Author name can't be empty</li></ul></div>), error_messages_for("user", "post")
224
225 # add the default to put post back in the title
226 assert_dom_equal %(<div class="errorExplanation" id="errorExplanation"><h2>2 errors prohibited this post from being saved</h2><p>There were problems with the following fields:</p><ul><li>User email can't be empty</li><li>Author name can't be empty</li></ul></div>), error_messages_for("user", "post", :object_name => "post")
227
228 # symbols work as well
229 assert_dom_equal %(<div class="errorExplanation" id="errorExplanation"><h2>2 errors prohibited this post from being saved</h2><p>There were problems with the following fields:</p><ul><li>User email can't be empty</li><li>Author name can't be empty</li></ul></div>), error_messages_for(:user, :post, :object_name => :post)
230
231 # any default works too
232 assert_dom_equal %(<div class="errorExplanation" id="errorExplanation"><h2>2 errors prohibited this monkey from being saved</h2><p>There were problems with the following fields:</p><ul><li>User email can't be empty</li><li>Author name can't be empty</li></ul></div>), error_messages_for(:user, :post, :object_name => "monkey")
233
234 # should space object name
235 assert_dom_equal %(<div class="errorExplanation" id="errorExplanation"><h2>2 errors prohibited this chunky bacon from being saved</h2><p>There were problems with the following fields:</p><ul><li>User email can't be empty</li><li>Author name can't be empty</li></ul></div>), error_messages_for(:user, :post, :object_name => "chunky_bacon")
236
237 # hide header and explanation messages with nil or empty string
238 assert_dom_equal %(<div class="errorExplanation" id="errorExplanation"><ul><li>User email can't be empty</li><li>Author name can't be empty</li></ul></div>), error_messages_for(:user, :post, :header_message => nil, :message => "")
239
240 # override header and explanation messages
241 header_message = "Yikes! Some errors"
242 message = "Please fix the following fields and resubmit:"
243 assert_dom_equal %(<div class="errorExplanation" id="errorExplanation"><h2>#{header_message}</h2><p>#{message}</p><ul><li>User email can't be empty</li><li>Author name can't be empty</li></ul></div>), error_messages_for(:user, :post, :header_message => header_message, :message => message)
244 end
245
246 def test_error_messages_for_non_instance_variable
247 actual_user = @user
248 actual_post = @post
249 @user = nil
250 @post = nil
251
252 #explicitly set object
253 assert_dom_equal %(<div class="errorExplanation" id="errorExplanation"><h2>1 error prohibited this post from being saved</h2><p>There were problems with the following fields:</p><ul><li>Author name can't be empty</li></ul></div>), error_messages_for("post", :object => actual_post)
254
255 #multiple objects
256 assert_dom_equal %(<div class="errorExplanation" id="errorExplanation"><h2>2 errors prohibited this user from being saved</h2><p>There were problems with the following fields:</p><ul><li>User email can't be empty</li><li>Author name can't be empty</li></ul></div>), error_messages_for("user", "post", :object => [actual_user, actual_post])
257
258 #nil object
259 assert_equal '', error_messages_for('user', :object => nil)
260 end
261
262 def test_form_with_string_multipart
263 assert_dom_equal(
264 %(<form action="create" enctype="multipart/form-data" method="post"><p><label for="post_title">Title</label><br /><input id="post_title" name="post[title]" size="30" type="text" value="Hello World" /></p>\n<p><label for="post_body">Body</label><br /><div class="fieldWithErrors"><textarea cols="40" id="post_body" name="post[body]" rows="20">Back to the hill and over it again!</textarea></div></p><input name="commit" type="submit" value="Create" /></form>),
265 form("post", :multipart => true)
266 )
267 end
268 end