Changesets can be listed by changeset number.
The Git repository is here.
- Revision:
- 15
- Log:
Attempt to update Typo to a Typo SVN HEAD release from around the
time the prototype installation was set up on the RISC OS Open Limited
web site. Timestamps place this at 04-Jul so a revision from 05-Jul or
earlier was pulled and copied over the 2.6.0 tarball stable code.
- Author:
- adh
- Date:
- Sat Jul 22 23:27:35 +0100 2006
- Size:
- 16303 Bytes
1 | require File.dirname(__FILE__) + '/../test_helper' |
2 | require 'articles_controller' |
3 | require 'dns_mock' |
4 | require 'http_mock' |
5 | |
6 | require 'content' |
7 | |
8 | # |
9 | # Re-raise errors caught by the controller. |
10 | class ArticlesController; def rescue_action(e) raise e end; end |
11 | |
12 | class Content |
13 | def self.find_last_posted |
14 | self.find(:first, :conditions => ['created_at < ?', Time.now], |
15 | :order => 'created_at desc') |
16 | end |
17 | end |
18 | |
19 | class ArticlesControllerTest < Test::Unit::TestCase |
20 | fixtures :contents, :categories, :blogs, :users, :articles_categories, :text_filters, :articles_tags, :tags |
21 | include ArticlesHelper |
22 | |
23 | def setup |
24 | @controller = ArticlesController.new |
25 | @request, @response = ActionController::TestRequest.new, ActionController::TestResponse.new |
26 | |
27 | Article.create!(:title => "News from the future!", |
28 | :body => "The future is cool!", |
29 | :keywords => "future", |
30 | :created_at => Time.now + 12.minutes) |
31 | |
32 | end |
33 | |
34 | # Category subpages |
35 | def test_category |
36 | get :category, :id => "software" |
37 | |
38 | assert_response :success |
39 | assert_rendered_file "index" |
40 | |
41 | # Check it works when permalink != name. Ticket #736 |
42 | get :category, :id => "weird-permalink" |
43 | |
44 | assert_response :success |
45 | assert_rendered_file "index" |
46 | end |
47 | |
48 | def test_empty_category |
49 | get :category, :id => "life-on-mars" |
50 | assert_response :success |
51 | assert_rendered_file "error" |
52 | end |
53 | |
54 | def test_nonexistent_category |
55 | get :category, :id => 'nonexistent-category' |
56 | assert_response :success |
57 | assert_rendered_file "error" |
58 | end |
59 | |
60 | def test_tag |
61 | get :tag, :id => "foo" |
62 | |
63 | assert_response :success |
64 | assert_rendered_file "index" |
65 | |
66 | assert_tag :tag => 'h2', :content => 'Article 2!' |
67 | assert_tag :tag => 'h2', :content => 'Article 1!' |
68 | end |
69 | |
70 | def test_nonexistent_tag |
71 | get :tag, :id => "nonexistent" |
72 | assert_response :success |
73 | assert_rendered_file "error" |
74 | end |
75 | |
76 | def test_tag_routes |
77 | opts = {:controller => "articles", :action => "tag", :id => "foo", :page => "2"} |
78 | assert_routing("articles/tag/foo/page/2", opts) |
79 | end |
80 | |
81 | def test_simple_tag_pagination |
82 | this_blog.limit_article_display = 1 |
83 | get :tag, :id => "foo" |
84 | assert_equal 1, assigns(:articles).size |
85 | assert_tag(:tag => 'p', |
86 | :attributes =>{ |
87 | :id => 'pagination'}, |
88 | :content => 'Older posts: 1', |
89 | :descendant => {:tag => 'a', |
90 | :attributes =>{ |
91 | :href => "/articles/tag/foo/page/2"}, |
92 | :content => "2"}) |
93 | end |
94 | |
95 | # Main index |
96 | def test_index |
97 | get :index |
98 | assert_response :success |
99 | assert_rendered_file "index" |
100 | end |
101 | |
102 | # Archives page |
103 | def test_archives |
104 | get :archives |
105 | assert_response :success |
106 | assert_rendered_file "archives" |
107 | end |
108 | |
109 | # Permalinks |
110 | def test_permalink |
111 | get :permalink, :year => 2004, :month => 06, :day => 01, :title => "article-3" |
112 | assert_response :success |
113 | assert_template "read" |
114 | assert_not_nil assigns(:article) |
115 | assert_equal contents(:article3), assigns(:article) |
116 | end |
117 | |
118 | # Posts for given day |
119 | def test_find_by_date |
120 | get :find_by_date, :year => 2004, :month => 06, :day => 01 |
121 | assert_response :success |
122 | assert_rendered_file "index" |
123 | end |
124 | |
125 | def test_comment_posting |
126 | emails = ActionMailer::Base.deliveries |
127 | emails.clear |
128 | |
129 | assert_equal 0, emails.size |
130 | |
131 | Article.find(1).notify_users << users(:tobi) |
132 | |
133 | post :comment, { :id => 1, :comment => {'body' => 'This is *textile*', 'author' => 'bob' }} |
134 | |
135 | assert_response :success |
136 | assert_tag :tag => 'strong', :content => 'textile' |
137 | |
138 | comment = Article.find(1).comments.last |
139 | assert comment |
140 | |
141 | assert_not_nil cookies["author"] |
142 | |
143 | assert_equal "<p>This is <strong>textile</strong></p>", comment.html(@controller).to_s |
144 | |
145 | assert_equal User.find(:all, |
146 | :conditions => ['(notify_via_email = ?) and (notify_on_comments = ?)', true, true], |
147 | :order => 'email').collect { |each| each.email }, |
148 | emails.collect { |each| each.to[0] }.sort |
149 | end |
150 | |
151 | def test_comment_spam_markdown_smarty |
152 | this_blog.comment_text_filter = "markdown smartypants" |
153 | test_comment_spam1 |
154 | end |
155 | |
156 | def comment_template_test(expected_html, source_text, |
157 | art_id=1, author='bob', email='foo', args={}) |
158 | post :comment, { |
159 | :id => art_id, |
160 | :comment => { |
161 | 'body' => source_text, |
162 | 'author' => author, |
163 | 'email' => email }.merge(args) } |
164 | |
165 | assert_response :success |
166 | comment = Article.find(art_id).comments.last |
167 | assert comment |
168 | |
169 | assert_match expected_html, comment.html(@controller).to_s |
170 | $do_breakpoints |
171 | end |
172 | |
173 | def test_comment_spam1 |
174 | comment_template_test "<p>Link to <a href='http://spammer.example.com' rel=\"nofollow\">spammy goodness</a></p>", 'Link to <a href="http://spammer.example.com">spammy goodness</a>' |
175 | end |
176 | |
177 | def test_comment_spam2 |
178 | comment_template_test %r{<p>Link to <a href=["']http://spammer.example.com['"] rel=["']nofollow['"]>spammy goodness</a></p>}, 'Link to "spammy goodness":http://spammer.example.com' |
179 | end |
180 | |
181 | def test_comment_xss1 |
182 | this_blog.comment_text_filter = "none" |
183 | comment_template_test %{Have you ever <script lang='javascript'>alert("foo");</script> been hacked?}, |
184 | %{Have you ever <script lang="javascript">alert("foo");</script> been hacked?} |
185 | end |
186 | |
187 | def test_comment_xss2 |
188 | this_blog.comment_text_filter = "none" |
189 | comment_template_test "Have you ever <a href='#' rel=\"nofollow\">been hacked?</a>", 'Have you ever <a href="#" onclick="javascript">been hacked?</a>' |
190 | end |
191 | |
192 | def test_comment_autolink |
193 | comment_template_test "<p>What’s up with <a href='http://slashdot.org' rel=\"nofollow\">http://slashdot.org</a> these days?</p>", "What's up with http://slashdot.org these days?" |
194 | end #" |
195 | |
196 | ### TODO -- there's a bug in Rails with auto_links |
197 | # def test_comment_autolink2 |
198 | # comment_template_test "<p>My web page is <a href='http://somewhere.com/~me/index.html' rel=\"nofollow\">http://somewhere.com/~me/index.html</a></p>", "My web page is http://somewhere.com/~me/index.html" |
199 | # end |
200 | |
201 | def test_comment_nuking |
202 | num_comments = Comment.count |
203 | post :nuke_comment, { :id => 5 }, {} |
204 | assert_response 403 |
205 | |
206 | get :nuke_comment, { :id => 5 }, { :user => users(:bob)} |
207 | assert_response 403 |
208 | |
209 | post :nuke_comment, { :id => 5 }, { :user => users(:bob)} |
210 | assert_response :success |
211 | assert_equal num_comments -1, Comment.count |
212 | end |
213 | |
214 | def test_comment_user_blank |
215 | post :comment, { :id => 2, :comment => {'body' => 'foo', 'author' => 'bob' }} |
216 | assert_response :success |
217 | |
218 | comment = Article.find(2).comments.last |
219 | assert comment |
220 | assert comment.published? |
221 | assert_nil comment.user_id |
222 | |
223 | get :read, {:id => 2} |
224 | assert_response :success |
225 | assert_no_tag :tag => "li", |
226 | :attributes => { :class => "author_comment"} |
227 | |
228 | end |
229 | |
230 | def test_comment_user_set |
231 | @request.session = { :user => users(:tobi) } |
232 | post :comment, { :id => 2, :comment => {'body' => 'foo', 'author' => 'bob' }} |
233 | assert_response :success |
234 | |
235 | comment = Article.find(2).comments.last |
236 | assert comment |
237 | assert_equal users(:tobi), comment.user |
238 | |
239 | get :read, {:id => 2} |
240 | assert_response :success |
241 | assert_tag :tag => "li", |
242 | :attributes => { :class => "author_comment"} |
243 | end |
244 | |
245 | def test_trackback |
246 | num_trackbacks = Article.find(2).trackbacks.count |
247 | post :trackback, { :id => 2, :url => "http://www.google.com", :title => "My Trackback", :excerpt => "This is a test" } |
248 | assert_response :success |
249 | assert_not_xpath(%{/response/error[text()="1"]}, "Error: " + get_xpath("/response/message/text()").first.to_s) |
250 | |
251 | assert_equal num_trackbacks+1, Article.find(2).trackbacks.count |
252 | end |
253 | |
254 | def test_trackback_nuking |
255 | num_comments = Trackback.count |
256 | |
257 | post :nuke_trackback, { :id => 7 }, {} |
258 | assert_response 403 |
259 | |
260 | get :nuke_trackback, { :id => 7 }, { :user => users(:bob)} |
261 | assert_response 403 |
262 | |
263 | post :nuke_trackback, { :id => 7 }, { :user => users(:bob)} |
264 | assert_response :success |
265 | assert_equal num_comments -1, Trackback.count |
266 | end |
267 | |
268 | def test_no_settings |
269 | this_blog.update_attribute(:settings, { }) |
270 | |
271 | get :index |
272 | |
273 | assert_redirect |
274 | assert_redirected_to :controller => "admin/general", :action => "redirect" |
275 | |
276 | end |
277 | |
278 | def test_no_users_exist |
279 | this_blog.update_attribute(:settings, { }) |
280 | |
281 | User.destroy_all |
282 | assert User.count.zero? |
283 | |
284 | get :index |
285 | assert_redirect |
286 | assert_redirected_to :controller => "accounts", :action => "signup" |
287 | |
288 | end |
289 | |
290 | def test_pages_static |
291 | get :view_page, :name => 'page_one' |
292 | assert_response :success |
293 | assert_rendered_file "view_page" |
294 | |
295 | get :view_page, :name => 'page one' |
296 | assert_response 404 |
297 | end |
298 | |
299 | def test_read_non_published |
300 | get :read, :id => 4 |
301 | assert_response :success |
302 | assert_template "error" |
303 | end |
304 | |
305 | def test_tags_non_published |
306 | get :tag, :id => 'bar' |
307 | assert_response :success |
308 | assert_equal 1, assigns(:articles).size |
309 | assert ! assigns(:articles).include?(@article4), "Unpublished article displayed" |
310 | end |
311 | |
312 | def test_gravatar |
313 | assert ! this_blog.use_gravatar |
314 | get :read, :id => 1 |
315 | assert_response :success |
316 | assert_template "read" |
317 | assert_no_tag :tag => "img", |
318 | :attributes => { :class => "gravatar" } |
319 | |
320 | # Switch gravatar integration to on |
321 | this_blog.use_gravatar = true |
322 | assert this_blog.use_gravatar |
323 | get :read, :id => 1 |
324 | assert_response :success |
325 | assert_template "read" |
326 | assert_tag :tag => "img", |
327 | :attributes => { |
328 | :class => "gravatar", |
329 | :src => "http://www.gravatar.com/avatar.php?gravatar_id=740618d2fe0450ec244d8b86ac1fe3f8&size=60" |
330 | } |
331 | end |
332 | |
333 | def test_comment_preview |
334 | get :comment_preview |
335 | assert_response :success |
336 | assert_template nil |
337 | |
338 | get :comment_preview, :comment => { :author => "bob", :body => "comment preview" } |
339 | assert_response :success |
340 | assert_template "comment_preview" |
341 | |
342 | assert_tag :tag => "cite", |
343 | :children => { :count => 1, |
344 | :only => { :tag => "strong", |
345 | :content => "bob" } } |
346 | |
347 | assert_tag :tag => "p", |
348 | :content => "comment preview" |
349 | end |
350 | |
351 | def test_read_article_with_comments_and_trackbacks |
352 | get :read, :id => contents(:article1).id |
353 | assert_response :success |
354 | assert_template "read" |
355 | |
356 | assert_tag :tag => "ol", |
357 | :attributes => { :id => "commentList"}, |
358 | :children => { :count => contents(:article1).comments.to_a.select{|c| c.published?}.size, |
359 | :only => { :tag => "li" } } |
360 | |
361 | assert_tag :tag => "li", |
362 | :attributes => { :class => "author_comment"} |
363 | |
364 | assert_tag :tag => "ol", |
365 | :attributes => { :id => "trackbackList" }, |
366 | :children => { :count => contents(:article1).trackbacks.size, |
367 | :only => { :tag => "li" } } |
368 | end |
369 | |
370 | def test_read_article_no_comments_no_trackbacks |
371 | get :read, :id => contents(:article3).id |
372 | assert_response :success |
373 | assert_template "read" |
374 | |
375 | assert_tag :tag => "ol", |
376 | :attributes => { :id => "commentList"}, |
377 | :children => { :count => 1, |
378 | :only => { :tag => "li", |
379 | :attributes => { :id => "dummy_comment", :style => "display: none" } } } |
380 | |
381 | assert_no_tag :tag => "ol", |
382 | :attributes => { :id => "trackbackList" } |
383 | end |
384 | |
385 | def test_autodiscovery_default |
386 | |
387 | get :index |
388 | assert_response :success |
389 | assert_tag :tag => 'link', :attributes => |
390 | { :rel => 'alternate', :type => 'application/rss+xml', :title => 'RSS', |
391 | :href => 'http://test.host/xml/rss20/feed.xml'} |
392 | assert_tag :tag => 'link', :attributes => |
393 | { :rel => 'alternate', :type => 'application/atom+xml', :title => 'Atom', |
394 | :href => 'http://test.host/xml/atom/feed.xml'} |
395 | end |
396 | |
397 | |
398 | def test_autodiscovery_article |
399 | get :read, :id => 1 |
400 | assert_response :success |
401 | assert_tag :tag => 'link', :attributes => |
402 | { :rel => 'alternate', :type => 'application/rss+xml', :title => 'RSS', |
403 | :href => 'http://test.host/xml/rss20/article/1/feed.xml'} |
404 | assert_tag :tag => 'link', :attributes => |
405 | { :rel => 'alternate', :type => 'application/atom+xml', :title => 'Atom', |
406 | :href => 'http://test.host/xml/atom/article/1/feed.xml'} |
407 | end |
408 | |
409 | def test_autodiscovery_category |
410 | get :category, :id => 'hardware' |
411 | assert_response :success |
412 | assert_tag :tag => 'link', :attributes => |
413 | { :rel => 'alternate', :type => 'application/rss+xml', :title => 'RSS', |
414 | :href => 'http://test.host/xml/rss20/category/hardware/feed.xml'} |
415 | assert_tag :tag => 'link', :attributes => |
416 | { :rel => 'alternate', :type => 'application/atom+xml', :title => 'Atom', |
417 | :href => 'http://test.host/xml/atom/category/hardware/feed.xml'} |
418 | end |
419 | |
420 | def test_autodiscovery_tag |
421 | get :tag, :id => 'hardware' |
422 | assert_response :success |
423 | assert_tag :tag => 'link', :attributes => |
424 | { :rel => 'alternate', :type => 'application/rss+xml', :title => 'RSS', |
425 | :href => 'http://test.host/xml/rss20/tag/hardware/feed.xml'} |
426 | assert_tag :tag => 'link', :attributes => |
427 | { :rel => 'alternate', :type => 'application/atom+xml', :title => 'Atom', |
428 | :href => 'http://test.host/xml/atom/tag/hardware/feed.xml'} |
429 | end |
430 | |
431 | def test_disabled_ajax_comments |
432 | this_blog.sp_allow_non_ajax_comments = false |
433 | assert_equal false, this_blog.sp_allow_non_ajax_comments |
434 | |
435 | post :comment, :id => 1, :comment => {'body' => 'This is posted without ajax', 'author' => 'bob' } |
436 | assert_response 500 |
437 | assert_equal "non-ajax commenting is disabled", @response.body |
438 | |
439 | @request.env['HTTP_X_REQUESTED_WITH'] = "XMLHttpRequest" |
440 | post :comment, :id => 1, :comment => {'body' => 'This is posted *with* ajax', 'author' => 'bob' } |
441 | assert_response :success |
442 | ajax_comment = Article.find(1).comments.last |
443 | assert_equal "This is posted *with* ajax", ajax_comment.body |
444 | end |
445 | |
446 | def test_tag_max_article_count_is_first |
447 | tags = Tag.find_all_with_article_counters |
448 | assert tags.size > 1 |
449 | max = tags[0].article_counter |
450 | tags.each do |tag| |
451 | assert tag.article_counter <= max |
452 | end |
453 | end |
454 | |
455 | def test_calc_distributed_class_basic |
456 | assert_equal "prefix5", calc_distributed_class(0, 0, "prefix", 5, 15) |
457 | (0..10).each do |article| |
458 | assert_equal "prefix#{article}", calc_distributed_class(article, 10, "prefix", 0, 10) |
459 | end |
460 | (0..20).each do |article| |
461 | assert_equal "prefix#{(article/2).to_i}", calc_distributed_class(article, 20, "prefix", 0, 10) |
462 | end |
463 | (0..5).each do |article| |
464 | assert_equal "prefix#{(article*2).to_i}", calc_distributed_class(article, 5, "prefix", 0, 10) |
465 | end |
466 | end |
467 | |
468 | def test_calc_distributed_class_offset |
469 | (0..10).each do |article| |
470 | assert_equal "prefix#{article+6}", calc_distributed_class(article, 10, "prefix", 6, 16) |
471 | end |
472 | end |
473 | |
474 | def test_hide_future_article |
475 | @article = Article.find_last_posted |
476 | |
477 | Article.create!(:title => "News from the future!", |
478 | :body => "The future is cool!", |
479 | :keywords => "future", |
480 | :published => true, |
481 | :created_at => Time.now + 12.minutes) |
482 | get :index |
483 | assert_equal @article, assigns(:articles).first |
484 | assert @response.lifetime <= 12.minutes |
485 | end |
486 | |
487 | def test_search |
488 | get :search, :q => "search target" |
489 | assert_equal 1, assigns(:articles).size |
490 | end |
491 | |
492 | def test_author |
493 | get :author, :id => 'tobi' |
494 | |
495 | assert_success |
496 | assert_rendered_file 'index' |
497 | assert assigns(:articles) |
498 | assert_equal users(:tobi).articles.published, assigns(:articles) |
499 | # This is until we write a proper author feed |
500 | assert_equal('http://test.host/xml/rss20/feed.xml', |
501 | assigns(:auto_discovery_url_rss)) |
502 | end |
503 | |
504 | def test_nonexistent_author |
505 | get :author, :id => 'nonexistent-chap' |
506 | |
507 | assert_success |
508 | assert_rendered_file 'error' |
509 | assert assigns(:message) |
510 | assert_equal "Can't find posts with author 'nonexistent-chap'", assigns(:message) |
511 | end |
512 | |
513 | def test_author_list |
514 | get :author |
515 | |
516 | assert_success |
517 | assert_rendered_file 'groupings' |
518 | |
519 | assert_tag(:tag => 'ul', |
520 | :descendant => {\ |
521 | :tag => 'a', |
522 | :attributes => { :href => '/articles/author/tobi' }, |
523 | }) |
524 | end |
525 | end |