# redMine - project management software # Copyright (C) 2006-2007 Jean-Philippe Lang # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. require File.dirname(__FILE__) + '/../../test_helper' class ApplicationHelperTest < HelperTestCase include ApplicationHelper include ActionView::Helpers::TextHelper fixtures :projects, :repositories, :changesets, :trackers, :issue_statuses, :issues, :documents, :versions, :wikis, :wiki_pages, :wiki_contents, :roles, :enabled_modules def setup super end def test_auto_links to_test = { 'http://foo.bar' => 'http://foo.bar', 'http://foo.bar/~user' => 'http://foo.bar/~user', 'http://foo.bar.' => 'http://foo.bar.', 'http://foo.bar/foo.bar#foo.bar.' => 'http://foo.bar/foo.bar#foo.bar.', 'www.foo.bar' => 'www.foo.bar', 'http://foo.bar/page?p=1&t=z&s=' => 'http://foo.bar/page?p=1&t=z&s=', 'http://foo.bar/page#125' => 'http://foo.bar/page#125' } to_test.each { |text, result| assert_equal "

#{result}

", textilizable(text) } end def test_auto_mailto assert_equal '

test@foo.bar

', textilizable('test@foo.bar') end def test_inline_images to_test = { '!http://foo.bar/image.jpg!' => '', 'floating !>http://foo.bar/image.jpg!' => 'floating
', 'with class !(some-class)http://foo.bar/image.jpg!' => 'with class ', 'with style !{width:100px;height100px}http://foo.bar/image.jpg!' => 'with style ', } to_test.each { |text, result| assert_equal "

#{result}

", textilizable(text) } end def test_textile_external_links to_test = { 'This is a "link":http://foo.bar' => 'This is a link', 'This is an intern "link":/foo/bar' => 'This is an intern link', '"link (Link title)":http://foo.bar' => 'link' } to_test.each { |text, result| assert_equal "

#{result}

", textilizable(text) } end def test_redmine_links issue_link = link_to('#3', {:controller => 'issues', :action => 'show', :id => 3}, :class => 'issue', :title => 'Error 281 when updating a recipe (New)') changeset_link = link_to('r1', {:controller => 'repositories', :action => 'revision', :id => 'ecookbook', :rev => 1}, :class => 'changeset', :title => 'My very first commit') document_link = link_to('Test document', {:controller => 'documents', :action => 'show', :id => 1}, :class => 'document') version_link = link_to('1.0', {:controller => 'versions', :action => 'show', :id => 2}, :class => 'version') source_url = {:controller => 'repositories', :action => 'entry', :id => 'ecookbook', :path => 'some/file'} to_test = { # tickets '#3, #3 and #3.' => "#{issue_link}, #{issue_link} and #{issue_link}.", # changesets 'r1' => changeset_link, # documents 'document#1' => document_link, 'document:"Test document"' => document_link, # versions 'version#2' => version_link, 'version:1.0' => version_link, 'version:"1.0"' => version_link, # source 'source:/some/file' => link_to('source:/some/file', source_url, :class => 'source'), 'source:/some/file@52' => link_to('source:/some/file@52', source_url.merge(:rev => 52), :class => 'source'), 'source:/some/file#L110' => link_to('source:/some/file#L110', source_url.merge(:anchor => 'L110'), :class => 'source'), 'source:/some/file@52#L110' => link_to('source:/some/file@52#L110', source_url.merge(:rev => 52, :anchor => 'L110'), :class => 'source'), 'export:/some/file' => link_to('export:/some/file', source_url.merge(:format => 'raw'), :class => 'source download'), # escaping '!#3.' => '#3.', '!r1' => 'r1', '!document#1' => 'document#1', '!document:"Test document"' => 'document:"Test document"', '!version#2' => 'version#2', '!version:1.0' => 'version:1.0', '!version:"1.0"' => 'version:"1.0"', '!source:/some/file' => 'source:/some/file', # invalid expressions 'source:' => 'source:' } @project = Project.find(1) to_test.each { |text, result| assert_equal "

#{result}

", textilizable(text) } end def test_wiki_links to_test = { '[[CookBook documentation]]' => 'CookBook documentation', '[[Another page|Page]]' => 'Page', # page that doesn't exist '[[Unknown page]]' => 'Unknown page', '[[Unknown page|404]]' => '404', # link to another project wiki '[[onlinestore:]]' => 'onlinestore', '[[onlinestore:|Wiki]]' => 'Wiki', '[[onlinestore:Start page]]' => 'Start page', '[[onlinestore:Start page|Text]]' => 'Text', '[[onlinestore:Unknown page]]' => 'Unknown page', # escaping '![[Another page|Page]]' => '[[Another page|Page]]', } @project = Project.find(1) to_test.each { |text, result| assert_equal "

#{result}

", textilizable(text) } end def test_html_tags to_test = { "
content
" => "

<div>content</div>

", "
content
" => "

<div class=\"bold\">content</div>

", "" => "

<script>some script;</script>

", # do not escape pre/code tags "
\nline 1\nline2
" => "
\nline 1\nline2
", "
\nline 1\nline2
" => "
\nline 1\nline2
", "
content
" => "
<div>content</div>
", } to_test.each { |text, result| assert_equal result, textilizable(text) } end def test_wiki_links_in_tables to_test = {"|Cell 11|Cell 12|Cell 13|\n|Cell 21|Cell 22||\n|Cell 31||Cell 33|" => 'Cell 11Cell 12Cell 13' + 'Cell 21Cell 22' + 'Cell 31Cell 33', "|[[Page|Link title]]|[[Other Page|Other title]]|\n|Cell 21|[[Last page]]|" => 'Link title' + 'Other title' + 'Cell 21Last page' } @project = Project.find(1) to_test.each { |text, result| assert_equal "#{result}
", textilizable(text).gsub(/[\t\n]/, '') } end def test_wiki_horizontal_rule assert_equal '
', textilizable('---') assert_equal '

Dashes: ---

', textilizable('Dashes: ---') end def test_macro_hello_world text = "{{hello_world}}" assert textilizable(text).match(/Hello world!/) # escaping text = "!{{hello_world}}" assert_equal '

{{hello_world}}

', textilizable(text) end def test_macro_include @project = Project.find(1) # include a page of the current project wiki text = "{{include(Another page)}}" assert textilizable(text).match(/This is a link to a ticket/) @project = nil # include a page of a specific project wiki text = "{{include(ecookbook:Another page)}}" assert textilizable(text).match(/This is a link to a ticket/) text = "{{include(ecookbook:)}}" assert textilizable(text).match(/CookBook documentation/) text = "{{include(unknowidentifier:somepage)}}" assert textilizable(text).match(/Unknow project/) end def test_date_format_default today = Date.today Setting.date_format = '' assert_equal l_date(today), format_date(today) end def test_date_format today = Date.today Setting.date_format = '%d %m %Y' assert_equal today.strftime('%d %m %Y'), format_date(today) end def test_time_format_default now = Time.now Setting.date_format = '' Setting.time_format = '' assert_equal l_datetime(now), format_time(now) assert_equal l_time(now), format_time(now, false) end def test_time_format now = Time.now Setting.date_format = '%d %m %Y' Setting.time_format = '%H %M' assert_equal now.strftime('%d %m %Y %H %M'), format_time(now) assert_equal now.strftime('%H %M'), format_time(now, false) end end