2009-02-21 14:04:50 +03:00
# Redmine - project management software
2010-11-06 20:47:27 +03:00
# Copyright (C) 2006-2010 Jean-Philippe Lang
2007-09-03 00:41:47 +04:00
#
# 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.
2010-12-13 02:24:34 +03:00
require File . expand_path ( '../../../test_helper' , __FILE__ )
2007-09-03 00:41:47 +04:00
2010-09-06 04:26:02 +04:00
class ApplicationHelperTest < ActionView :: TestCase
2009-02-21 14:04:50 +03:00
2008-11-09 17:52:16 +03:00
fixtures :projects , :roles , :enabled_modules , :users ,
2008-08-11 02:18:23 +04:00
:repositories , :changesets ,
:trackers , :issue_statuses , :issues , :versions , :documents ,
:wikis , :wiki_pages , :wiki_contents ,
2008-10-28 13:43:34 +03:00
:boards , :messages ,
2010-02-13 13:32:06 +03:00
:attachments ,
:enumerations
2007-09-03 00:41:47 +04:00
def setup
super
end
2010-09-06 04:26:08 +04:00
context " # link_to_if_authorized " do
context " authorized user " do
should " be tested "
end
context " unauthorized user " do
should " be tested "
end
should " allow using the :controller and :action for the target link " do
User . current = User . find_by_login ( 'admin' )
@project = Issue . first . project # Used by helper
response = link_to_if_authorized ( " By controller/action " ,
{ :controller = > 'issues' , :action = > 'edit' , :id = > Issue . first . id } )
assert_match / href / , response
end
end
2007-09-03 00:41:47 +04:00
def test_auto_links
to_test = {
2007-10-01 21:45:40 +04:00
'http://foo.bar' = > '<a class="external" href="http://foo.bar">http://foo.bar</a>' ,
2007-10-03 22:00:50 +04:00
'http://foo.bar/~user' = > '<a class="external" href="http://foo.bar/~user">http://foo.bar/~user</a>' ,
2007-10-01 21:45:40 +04:00
'http://foo.bar.' = > '<a class="external" href="http://foo.bar">http://foo.bar</a>.' ,
2008-11-11 17:24:06 +03:00
'https://foo.bar.' = > '<a class="external" href="https://foo.bar">https://foo.bar</a>.' ,
2008-07-12 15:12:33 +04:00
'This is a link: http://foo.bar.' = > 'This is a link: <a class="external" href="http://foo.bar">http://foo.bar</a>.' ,
'A link (eg. http://foo.bar).' = > 'A link (eg. <a class="external" href="http://foo.bar">http://foo.bar</a>).' ,
2007-10-01 21:45:40 +04:00
'http://foo.bar/foo.bar#foo.bar.' = > '<a class="external" href="http://foo.bar/foo.bar#foo.bar">http://foo.bar/foo.bar#foo.bar</a>.' ,
2008-09-17 20:48:04 +04:00
'http://www.foo.bar/Test_(foobar)' = > '<a class="external" href="http://www.foo.bar/Test_(foobar)">http://www.foo.bar/Test_(foobar)</a>' ,
'(see inline link : http://www.foo.bar/Test_(foobar))' = > '(see inline link : <a class="external" href="http://www.foo.bar/Test_(foobar)">http://www.foo.bar/Test_(foobar)</a>)' ,
'(see inline link : http://www.foo.bar/Test)' = > '(see inline link : <a class="external" href="http://www.foo.bar/Test">http://www.foo.bar/Test</a>)' ,
'(see inline link : http://www.foo.bar/Test).' = > '(see inline link : <a class="external" href="http://www.foo.bar/Test">http://www.foo.bar/Test</a>).' ,
'(see "inline link":http://www.foo.bar/Test_(foobar))' = > '(see <a href="http://www.foo.bar/Test_(foobar)" class="external">inline link</a>)' ,
'(see "inline link":http://www.foo.bar/Test)' = > '(see <a href="http://www.foo.bar/Test" class="external">inline link</a>)' ,
'(see "inline link":http://www.foo.bar/Test).' = > '(see <a href="http://www.foo.bar/Test" class="external">inline link</a>).' ,
2007-10-01 21:45:40 +04:00
'www.foo.bar' = > '<a class="external" href="http://www.foo.bar">www.foo.bar</a>' ,
'http://foo.bar/page?p=1&t=z&s=' = > '<a class="external" href="http://foo.bar/page?p=1&t=z&s=">http://foo.bar/page?p=1&t=z&s=</a>' ,
2008-06-17 23:27:03 +04:00
'http://foo.bar/page#125' = > '<a class="external" href="http://foo.bar/page#125">http://foo.bar/page#125</a>' ,
'http://foo@www.bar.com' = > '<a class="external" href="http://foo@www.bar.com">http://foo@www.bar.com</a>' ,
2008-09-17 20:48:04 +04:00
'http://foo:bar@www.bar.com' = > '<a class="external" href="http://foo:bar@www.bar.com">http://foo:bar@www.bar.com</a>' ,
2008-06-23 20:51:13 +04:00
'ftp://foo.bar' = > '<a class="external" href="ftp://foo.bar">ftp://foo.bar</a>' ,
2008-11-11 17:24:06 +03:00
'ftps://foo.bar' = > '<a class="external" href="ftps://foo.bar">ftps://foo.bar</a>' ,
'sftp://foo.bar' = > '<a class="external" href="sftp://foo.bar">sftp://foo.bar</a>' ,
2009-04-21 16:49:16 +04:00
# two exclamation marks
'http://example.net/path!602815048C7B5C20!302.html' = > '<a class="external" href="http://example.net/path!602815048C7B5C20!302.html">http://example.net/path!602815048C7B5C20!302.html</a>' ,
2010-03-24 23:26:22 +03:00
# escaping
'http://foo"bar' = > '<a class="external" href="http://foo"bar">http://foo"bar</a>' ,
2010-10-24 02:35:02 +04:00
# wrap in angle brackets
'<http://foo.bar>' = > '<<a class="external" href="http://foo.bar">http://foo.bar</a>>'
2007-09-03 00:41:47 +04:00
}
to_test . each { | text , result | assert_equal " <p> #{ result } </p> " , textilizable ( text ) }
end
def test_auto_mailto
2010-03-24 23:26:22 +03:00
assert_equal '<p><a class="email" href="mailto:test@foo.bar">test@foo.bar</a></p>' ,
2007-09-03 00:41:47 +04:00
textilizable ( 'test@foo.bar' )
end
2007-12-20 00:06:06 +03:00
def test_inline_images
2007-09-03 00:41:47 +04:00
to_test = {
'!http://foo.bar/image.jpg!' = > '<img src="http://foo.bar/image.jpg" alt="" />' ,
'floating !>http://foo.bar/image.jpg!' = > 'floating <div style="float:right"><img src="http://foo.bar/image.jpg" alt="" /></div>' ,
2007-12-20 00:06:06 +03:00
'with class !(some-class)http://foo.bar/image.jpg!' = > 'with class <img src="http://foo.bar/image.jpg" class="some-class" alt="" />' ,
2008-12-28 16:38:34 +03:00
# inline styles should be stripped
'with style !{width:100px;height100px}http://foo.bar/image.jpg!' = > 'with style <img src="http://foo.bar/image.jpg" alt="" />' ,
2008-12-19 13:16:15 +03:00
'with title !http://foo.bar/image.jpg(This is a title)!' = > 'with title <img src="http://foo.bar/image.jpg" title="This is a title" alt="This is a title" />' ,
'with title !http://foo.bar/image.jpg(This is a double-quoted "title")!' = > 'with title <img src="http://foo.bar/image.jpg" title="This is a double-quoted "title"" alt="This is a double-quoted "title"" />' ,
2007-12-20 00:06:06 +03:00
}
to_test . each { | text , result | assert_equal " <p> #{ result } </p> " , textilizable ( text ) }
end
2009-11-04 13:22:57 +03:00
def test_inline_images_inside_tags
raw = <<-RAW
h1 . ! foo . png! Heading
Centered image :
p = . ! bar . gif!
RAW
assert textilizable ( raw ) . include? ( '<img src="foo.png" alt="" />' )
assert textilizable ( raw ) . include? ( '<img src="bar.gif" alt="" />' )
end
2008-10-28 13:43:34 +03:00
def test_attached_images
to_test = {
'Inline image: !logo.gif!' = > 'Inline image: <img src="/attachments/download/3" title="This is a logo" alt="This is a logo" />' ,
2009-02-05 23:25:01 +03:00
'Inline image: !logo.GIF!' = > 'Inline image: <img src="/attachments/download/3" title="This is a logo" alt="This is a logo" />' ,
'No match: !ogo.gif!' = > 'No match: <img src="ogo.gif" alt="" />' ,
2009-10-24 16:19:22 +04:00
'No match: !ogo.GIF!' = > 'No match: <img src="ogo.GIF" alt="" />' ,
# link image
'!logo.gif!:http://foo.bar/' = > '<a href="http://foo.bar/"><img src="/attachments/download/3" title="This is a logo" alt="This is a logo" /></a>' ,
2008-10-28 13:43:34 +03:00
}
attachments = Attachment . find ( :all )
to_test . each { | text , result | assert_equal " <p> #{ result } </p> " , textilizable ( text , :attachments = > attachments ) }
end
2007-12-20 00:06:06 +03:00
def test_textile_external_links
to_test = {
2007-10-01 21:45:40 +04:00
'This is a "link":http://foo.bar' = > 'This is a <a href="http://foo.bar" class="external">link</a>' ,
'This is an intern "link":/foo/bar' = > 'This is an intern <a href="/foo/bar">link</a>' ,
2008-05-26 23:39:51 +04:00
'"link (Link title)":http://foo.bar' = > '<a href="http://foo.bar" title="Link title" class="external">link</a>' ,
2008-12-23 20:05:38 +03:00
'"link (Link title with "double-quotes")":http://foo.bar' = > '<a href="http://foo.bar" title="Link title with "double-quotes"" class="external">link</a>' ,
2008-06-16 23:37:09 +04:00
" This is not a \" Link \" : \n \n Another paragraph " = > " This is not a \" Link \" :</p> \n \n \n \t <p>Another paragraph " ,
2008-05-26 23:39:51 +04:00
# no multiline link text
2009-07-19 18:23:15 +04:00
" This is a double quote \" on the first line \n and another on a second line \" :test " = > " This is a double quote \" on the first line<br />and another on a second line \" :test " ,
2009-04-07 21:38:52 +04:00
# mailto link
" \" system administrator \" :mailto:sysadmin@example.com?subject=redmine%20permissions " = > " <a href= \" mailto:sysadmin@example.com?subject=redmine%20permissions \" >system administrator</a> " ,
2009-04-21 16:49:16 +04:00
# two exclamation marks
'"a link":http://example.net/path!602815048C7B5C20!302.html' = > '<a href="http://example.net/path!602815048C7B5C20!302.html" class="external">a link</a>' ,
2010-03-24 23:26:22 +03:00
# escaping
'"test":http://foo"bar' = > '<a href="http://foo"bar" class="external">test</a>' ,
2007-09-03 00:41:47 +04:00
}
to_test . each { | text , result | assert_equal " <p> #{ result } </p> " , textilizable ( text ) }
end
2011-01-11 14:06:56 +03:00
2007-09-03 00:41:47 +04:00
def test_redmine_links
2007-09-08 00:07:54 +04:00
issue_link = link_to ( '#3' , { :controller = > 'issues' , :action = > 'show' , :id = > 3 } ,
2009-11-14 22:40:56 +03:00
:class = > 'issue status-1 priority-1 overdue' , :title = > 'Error 281 when updating a recipe (New)' )
2008-01-15 21:12:12 +03:00
2008-03-17 20:45:01 +03:00
changeset_link = link_to ( 'r1' , { :controller = > 'repositories' , :action = > 'revision' , :id = > 'ecookbook' , :rev = > 1 } ,
2007-09-08 00:07:54 +04:00
:class = > 'changeset' , :title = > 'My very first commit' )
2009-07-04 16:48:25 +04:00
changeset_link2 = link_to ( 'r2' , { :controller = > 'repositories' , :action = > 'revision' , :id = > 'ecookbook' , :rev = > 2 } ,
:class = > 'changeset' , :title = > 'This commit fixes #1, #2 and references #1 & #3' )
2007-09-03 00:41:47 +04:00
2008-01-15 21:12:12 +03:00
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' )
2008-03-17 20:45:01 +03:00
2008-08-11 02:18:23 +04:00
message_url = { :controller = > 'messages' , :action = > 'show' , :board_id = > 1 , :id = > 4 }
2010-02-13 13:32:06 +03:00
project_url = { :controller = > 'projects' , :action = > 'show' , :id = > 'subproject1' }
2008-07-06 16:43:51 +04:00
source_url = { :controller = > 'repositories' , :action = > 'entry' , :id = > 'ecookbook' , :path = > [ 'some' , 'file' ] }
2008-07-10 17:36:28 +04:00
source_url_with_ext = { :controller = > 'repositories' , :action = > 'entry' , :id = > 'ecookbook' , :path = > [ 'some' , 'file.ext' ] }
2008-01-15 21:12:12 +03:00
2007-09-03 00:41:47 +04:00
to_test = {
2008-03-17 20:45:01 +03:00
# tickets
2010-03-17 22:57:32 +03:00
'#3, [#3], (#3) and #3.' = > " #{ issue_link } , [ #{ issue_link } ], ( #{ issue_link } ) and #{ issue_link } . " ,
2008-03-17 20:45:01 +03:00
# changesets
'r1' = > changeset_link ,
2009-07-04 16:48:25 +04:00
'r1.' = > " #{ changeset_link } . " ,
'r1, r2' = > " #{ changeset_link } , #{ changeset_link2 } " ,
'r1,r2' = > " #{ changeset_link } , #{ changeset_link2 } " ,
2008-03-17 20:45:01 +03:00
# 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' ) ,
2008-07-10 17:36:28 +04:00
'source:/some/file.' = > link_to ( 'source:/some/file' , source_url , :class = > 'source' ) + " . " ,
'source:/some/file.ext.' = > link_to ( 'source:/some/file.ext' , source_url_with_ext , :class = > 'source' ) + " . " ,
'source:/some/file. ' = > link_to ( 'source:/some/file' , source_url , :class = > 'source' ) + " . " ,
'source:/some/file.ext. ' = > link_to ( 'source:/some/file.ext' , source_url_with_ext , :class = > 'source' ) + " . " ,
'source:/some/file, ' = > link_to ( 'source:/some/file' , source_url , :class = > 'source' ) + " , " ,
2008-03-17 20:45:01 +03:00
'source:/some/file@52' = > link_to ( 'source:/some/file@52' , source_url . merge ( :rev = > 52 ) , :class = > 'source' ) ,
2008-07-10 17:36:28 +04:00
'source:/some/file.ext@52' = > link_to ( 'source:/some/file.ext@52' , source_url_with_ext . merge ( :rev = > 52 ) , :class = > 'source' ) ,
2008-03-17 20:45:01 +03:00
'source:/some/file#L110' = > link_to ( 'source:/some/file#L110' , source_url . merge ( :anchor = > 'L110' ) , :class = > 'source' ) ,
2008-07-10 17:36:28 +04:00
'source:/some/file.ext#L110' = > link_to ( 'source:/some/file.ext#L110' , source_url_with_ext . merge ( :anchor = > 'L110' ) , :class = > 'source' ) ,
2008-03-17 20:45:01 +03:00
'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' ) ,
2008-08-11 02:18:23 +04:00
# message
'message#4' = > link_to ( 'Post 2' , message_url , :class = > 'message' ) ,
2011-01-23 20:02:10 +03:00
'message#5' = > link_to ( 'RE: post 2' , message_url . merge ( :anchor = > 'message-5' , :r = > 5 ) , :class = > 'message' ) ,
2010-02-13 13:32:06 +03:00
# project
'project#3' = > link_to ( 'eCookbook Subproject 1' , project_url , :class = > 'project' ) ,
'project:subproject1' = > link_to ( 'eCookbook Subproject 1' , project_url , :class = > 'project' ) ,
'project:"eCookbook subProject 1"' = > link_to ( 'eCookbook Subproject 1' , project_url , :class = > 'project' ) ,
2008-01-15 21:12:12 +03:00
# escaping
2008-03-17 20:45:01 +03:00
'!#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' ,
2010-02-18 21:53:30 +03:00
# not found
'#0123456789' = > '#0123456789' ,
2008-03-17 21:01:26 +03:00
# invalid expressions
2008-06-05 01:30:12 +04:00
'source:' = > 'source:' ,
# url hash
" http://foo.bar/FAQ # 3 " = > '<a class="external" href="http://foo.bar/FAQ#3">http://foo.bar/FAQ#3</a>' ,
2008-01-15 21:12:12 +03:00
}
@project = Project . find ( 1 )
2010-02-13 13:32:06 +03:00
to_test . each { | text , result | assert_equal " <p> #{ result } </p> " , textilizable ( text ) , " #{ text } failed " }
2008-01-15 21:12:12 +03:00
end
2011-01-23 19:12:38 +03:00
def test_cross_project_redmine_links
source_link = link_to ( 'ecookbook:source:/some/file' , { :controller = > 'repositories' , :action = > 'entry' , :id = > 'ecookbook' , :path = > [ 'some' , 'file' ] } ,
:class = > 'source' )
changeset_link = link_to ( 'ecookbook:r2' , { :controller = > 'repositories' , :action = > 'revision' , :id = > 'ecookbook' , :rev = > 2 } ,
:class = > 'changeset' , :title = > 'This commit fixes #1, #2 and references #1 & #3' )
to_test = {
# documents
'document:"Test document"' = > 'document:"Test document"' ,
'ecookbook:document:"Test document"' = > '<a href="/documents/1" class="document">Test document</a>' ,
'invalid:document:"Test document"' = > 'invalid:document:"Test document"' ,
# versions
'version:"1.0"' = > 'version:"1.0"' ,
'ecookbook:version:"1.0"' = > '<a href="/versions/show/2" class="version">1.0</a>' ,
'invalid:version:"1.0"' = > 'invalid:version:"1.0"' ,
# changeset
'r2' = > 'r2' ,
'ecookbook:r2' = > changeset_link ,
'invalid:r2' = > 'invalid:r2' ,
# source
'source:/some/file' = > 'source:/some/file' ,
'ecookbook:source:/some/file' = > source_link ,
'invalid:source:/some/file' = > 'invalid:source:/some/file' ,
}
@project = Project . find ( 3 )
to_test . each { | text , result | assert_equal " <p> #{ result } </p> " , textilizable ( text ) , " #{ text } failed " }
end
2011-01-11 14:06:56 +03:00
def test_redmine_links_git_commit
changeset_link = link_to ( 'abcd' ,
2011-01-11 18:23:42 +03:00
{
:controller = > 'repositories' ,
:action = > 'revision' ,
:id = > 'subproject1' ,
:rev = > 'abcd' ,
} ,
2011-01-11 14:06:56 +03:00
:class = > 'changeset' , :title = > 'test commit' )
to_test = {
'commit:abcd' = > changeset_link ,
}
@project = Project . find ( 3 )
r = Repository :: Git . create! ( :project = > @project , :url = > '/tmp/test/git' )
assert r
c = Changeset . new ( :repository = > r ,
:committed_on = > Time . now ,
:revision = > 'abcd' ,
:scmid = > 'abcd' ,
:comments = > 'test commit' )
assert ( c . save )
to_test . each { | text , result | assert_equal " <p> #{ result } </p> " , textilizable ( text ) }
end
# TODO: Bazaar commit id contains mail address, so it contains '@' and '_'.
def test_redmine_links_darcs_commit
changeset_link = link_to ( '20080308225258-98289-abcd456efg.gz' ,
2011-01-11 18:23:42 +03:00
{
:controller = > 'repositories' ,
:action = > 'revision' ,
:id = > 'subproject1' ,
:rev = > '123' ,
} ,
2011-01-11 14:06:56 +03:00
:class = > 'changeset' , :title = > 'test commit' )
to_test = {
'commit:20080308225258-98289-abcd456efg.gz' = > changeset_link ,
}
@project = Project . find ( 3 )
2011-03-01 13:27:30 +03:00
r = Repository :: Darcs . create! (
:project = > @project , :url = > '/tmp/test/darcs' ,
:log_encoding = > 'UTF-8' )
2011-01-11 14:06:56 +03:00
assert r
c = Changeset . new ( :repository = > r ,
:committed_on = > Time . now ,
:revision = > '123' ,
:scmid = > '20080308225258-98289-abcd456efg.gz' ,
:comments = > 'test commit' )
assert ( c . save )
to_test . each { | text , result | assert_equal " <p> #{ result } </p> " , textilizable ( text ) }
end
2011-01-11 19:03:24 +03:00
def test_redmine_links_mercurial_commit
changeset_link_rev = link_to ( 'r123' ,
{
:controller = > 'repositories' ,
:action = > 'revision' ,
:id = > 'subproject1' ,
:rev = > '123' ,
} ,
:class = > 'changeset' , :title = > 'test commit' )
changeset_link_commit = link_to ( 'abcd' ,
{
:controller = > 'repositories' ,
:action = > 'revision' ,
:id = > 'subproject1' ,
:rev = > 'abcd' ,
} ,
:class = > 'changeset' , :title = > 'test commit' )
to_test = {
'r123' = > changeset_link_rev ,
'commit:abcd' = > changeset_link_commit ,
}
@project = Project . find ( 3 )
r = Repository :: Mercurial . create! ( :project = > @project , :url = > '/tmp/test' )
assert r
c = Changeset . new ( :repository = > r ,
:committed_on = > Time . now ,
:revision = > '123' ,
:scmid = > 'abcd' ,
:comments = > 'test commit' )
assert ( c . save )
to_test . each { | text , result | assert_equal " <p> #{ result } </p> " , textilizable ( text ) }
end
2010-03-14 11:33:53 +03:00
def test_attachment_links
attachment_link = link_to ( 'error281.txt' , { :controller = > 'attachments' , :action = > 'download' , :id = > '1' } , :class = > 'attachment' )
to_test = {
'attachment:error281.txt' = > attachment_link
}
to_test . each { | text , result | assert_equal " <p> #{ result } </p> " , textilizable ( text , :attachments = > Issue . find ( 3 ) . attachments ) , " #{ text } failed " }
end
2008-01-15 21:12:12 +03:00
def test_wiki_links
to_test = {
2009-01-26 04:47:51 +03:00
'[[CookBook documentation]]' = > '<a href="/projects/ecookbook/wiki/CookBook_documentation" class="wiki-page">CookBook documentation</a>' ,
'[[Another page|Page]]' = > '<a href="/projects/ecookbook/wiki/Another_page" class="wiki-page">Page</a>' ,
2008-07-28 21:20:31 +04:00
# link with anchor
2009-01-26 04:47:51 +03:00
'[[CookBook documentation#One-section]]' = > '<a href="/projects/ecookbook/wiki/CookBook_documentation#One-section" class="wiki-page">CookBook documentation</a>' ,
'[[Another page#anchor|Page]]' = > '<a href="/projects/ecookbook/wiki/Another_page#anchor" class="wiki-page">Page</a>' ,
2008-01-15 21:12:12 +03:00
# page that doesn't exist
2009-01-26 04:47:51 +03:00
'[[Unknown page]]' = > '<a href="/projects/ecookbook/wiki/Unknown_page" class="wiki-page new">Unknown page</a>' ,
'[[Unknown page|404]]' = > '<a href="/projects/ecookbook/wiki/Unknown_page" class="wiki-page new">404</a>' ,
2008-01-15 21:12:12 +03:00
# link to another project wiki
2010-10-29 01:25:38 +04:00
'[[onlinestore:]]' = > '<a href="/projects/onlinestore/wiki" class="wiki-page">onlinestore</a>' ,
'[[onlinestore:|Wiki]]' = > '<a href="/projects/onlinestore/wiki" class="wiki-page">Wiki</a>' ,
2009-01-26 04:47:51 +03:00
'[[onlinestore:Start page]]' = > '<a href="/projects/onlinestore/wiki/Start_page" class="wiki-page">Start page</a>' ,
'[[onlinestore:Start page|Text]]' = > '<a href="/projects/onlinestore/wiki/Start_page" class="wiki-page">Text</a>' ,
'[[onlinestore:Unknown page]]' = > '<a href="/projects/onlinestore/wiki/Unknown_page" class="wiki-page new">Unknown page</a>' ,
2008-05-25 17:30:54 +04:00
# striked through link
2009-01-26 04:47:51 +03:00
'-[[Another page|Page]]-' = > '<del><a href="/projects/ecookbook/wiki/Another_page" class="wiki-page">Page</a></del>' ,
'-[[Another page|Page]] link-' = > '<del><a href="/projects/ecookbook/wiki/Another_page" class="wiki-page">Page</a> link</del>' ,
2008-01-15 21:12:12 +03:00
# escaping
'![[Another page|Page]]' = > '[[Another page|Page]]' ,
2009-02-11 01:54:22 +03:00
# project does not exist
'[[unknowproject:Start]]' = > '[[unknowproject:Start]]' ,
'[[unknowproject:Start|Page title]]' = > '[[unknowproject:Start|Page title]]' ,
2007-09-03 00:41:47 +04:00
}
@project = Project . find ( 1 )
to_test . each { | text , result | assert_equal " <p> #{ result } </p> " , textilizable ( text ) }
end
2007-11-12 17:36:33 +03:00
2008-03-18 02:01:35 +03:00
def test_html_tags
to_test = {
2008-04-13 16:45:17 +04:00
" <div>content</div> " = > " <p><div>content</div></p> " ,
" <div class= \" bold \" >content</div> " = > " <p><div class= \" bold \" >content</div></p> " ,
" <script>some script;</script> " = > " <p><script>some script;</script></p> " ,
2008-03-18 02:01:35 +03:00
# do not escape pre/code tags
" <pre> \n line 1 \n line2</pre> " = > " <pre> \n line 1 \n line2</pre> " ,
" <pre><code> \n line 1 \n line2</code></pre> " = > " <pre><code> \n line 1 \n line2</code></pre> " ,
" <pre><div>content</div></pre> " = > " <pre><div>content</div></pre> " ,
2008-05-02 19:16:17 +04:00
" HTML comment: <!-- no comments --> " = > " <p>HTML comment: <!-- no comments --></p> " ,
2008-10-12 23:13:36 +04:00
" <!-- opening comment " = > " <p><!-- opening comment</p> " ,
2008-11-08 18:18:02 +03:00
# remove attributes except class
" <pre class='foo'>some text</pre> " = > " <pre class='foo'>some text</pre> " ,
2010-12-05 13:09:18 +03:00
'<pre class="foo">some text</pre>' = > '<pre class="foo">some text</pre>' ,
" <pre class='foo bar'>some text</pre> " = > " <pre class='foo bar'>some text</pre> " ,
'<pre class="foo bar">some text</pre>' = > '<pre class="foo bar">some text</pre>' ,
2008-11-08 18:18:02 +03:00
" <pre onmouseover='alert(1)'>some text</pre> " = > " <pre>some text</pre> " ,
2010-12-18 20:21:57 +03:00
# xss
'<pre><code class=""onmouseover="alert(1)">text</code></pre>' = > '<pre><code>text</code></pre>' ,
'<pre class=""onmouseover="alert(1)">text</pre>' = > '<pre>text</pre>' ,
2008-03-18 02:01:35 +03:00
}
to_test . each { | text , result | assert_equal result , textilizable ( text ) }
2008-03-21 20:39:02 +03:00
end
2008-06-09 00:31:36 +04:00
def test_allowed_html_tags
to_test = {
" <pre>preformatted text</pre> " = > " <pre>preformatted text</pre> " ,
" <notextile>no *textile* formatting</notextile> " = > " no *textile* formatting " ,
2008-09-23 21:03:51 +04:00
" <notextile>this is <tag>a tag</tag></notextile> " = > " this is <tag>a tag</tag> "
2008-06-09 00:31:36 +04:00
}
to_test . each { | text , result | assert_equal result , textilizable ( text ) }
end
2009-11-11 19:23:11 +03:00
def test_pre_tags
raw = <<-RAW
Before
< pre >
< prepared - statement - cache - size > 32 < / prepared-statement-cache-size>
< / pre>
After
RAW
expected = <<-EXPECTED
< p > Before < / p>
< pre >
& lt ; prepared - statement - cache - size & gt ; 32 & lt ; / prepared - statement - cache - size & gt ;
< / pre>
< p > After < / p>
EXPECTED
assert_equal expected . gsub ( %r{ [ \ r \ n \ t] } , '' ) , textilizable ( raw ) . gsub ( %r{ [ \ r \ n \ t] } , '' )
end
2010-03-15 22:54:50 +03:00
def test_pre_content_should_not_parse_wiki_and_redmine_links
raw = <<-RAW
[ [ CookBook documentation ] ]
#1
< pre >
[ [ CookBook documentation ] ]
#1
< / pre>
RAW
expected = <<-EXPECTED
< p > < a href = " /projects/ecookbook/wiki/CookBook_documentation " class = " wiki-page " > CookBook documentation < / a>< / p >
< p > < a href = " /issues/1 " class = " issue status-1 priority-1 " title = " Can't print recipes (New) " > #1</a></p>
< pre >
[ [ CookBook documentation ] ]
#1
< / pre>
EXPECTED
@project = Project . find ( 1 )
assert_equal expected . gsub ( %r{ [ \ r \ n \ t] } , '' ) , textilizable ( raw ) . gsub ( %r{ [ \ r \ n \ t] } , '' )
end
2010-03-15 22:57:35 +03:00
def test_non_closing_pre_blocks_should_be_closed
raw = <<-RAW
< pre > < code >
RAW
expected = <<-EXPECTED
< pre > < code >
< / code>< / pre >
EXPECTED
@project = Project . find ( 1 )
assert_equal expected . gsub ( %r{ [ \ r \ n \ t] } , '' ) , textilizable ( raw ) . gsub ( %r{ [ \ r \ n \ t] } , '' )
end
2009-09-03 05:03:10 +04:00
def test_syntax_highlight
2008-11-08 18:18:02 +03:00
raw = <<-RAW
< pre > < code class = " ruby " >
# Some ruby code here
2010-03-15 22:33:05 +03:00
< / code>< / pre >
2008-11-08 18:18:02 +03:00
RAW
expected = <<-EXPECTED
2010-03-28 18:52:33 +04:00
< pre > < code class = " ruby syntaxhl " > < span class = \ " CodeRay \" ><span class= " no " >1</span> <span class= " c " > # Some ruby code here</span></span>
2010-03-15 22:33:05 +03:00
< / code>< / pre >
2008-11-08 18:18:02 +03:00
EXPECTED
assert_equal expected . gsub ( %r{ [ \ r \ n \ t] } , '' ) , textilizable ( raw ) . gsub ( %r{ [ \ r \ n \ t] } , '' )
end
2008-03-21 20:39:02 +03:00
def test_wiki_links_in_tables
2008-06-04 21:12:59 +04:00
to_test = { " |[[Page|Link title]]|[[Other Page|Other title]]| \n |Cell 21|[[Last page]]| " = >
2009-01-26 04:47:51 +03:00
'<tr><td><a href="/projects/ecookbook/wiki/Page" class="wiki-page new">Link title</a></td>' +
'<td><a href="/projects/ecookbook/wiki/Other_Page" class="wiki-page new">Other title</a></td>' +
'</tr><tr><td>Cell 21</td><td><a href="/projects/ecookbook/wiki/Last_page" class="wiki-page new">Last page</a></td></tr>'
2008-03-21 20:39:02 +03:00
}
@project = Project . find ( 1 )
to_test . each { | text , result | assert_equal " <table> #{ result } </table> " , textilizable ( text ) . gsub ( / [ \ t \ n] / , '' ) }
2008-03-18 02:01:35 +03:00
end
2008-05-18 12:24:31 +04:00
def test_text_formatting
to_test = { '*_+bold, italic and underline+_*' = > '<strong><em><ins>bold, italic and underline</ins></em></strong>' ,
2008-12-28 13:12:09 +03:00
'(_text within parentheses_)' = > '(<em>text within parentheses</em>)' ,
'a *Humane Web* Text Generator' = > 'a <strong>Humane Web</strong> Text Generator' ,
'a H *umane* W *eb* T *ext* G *enerator*' = > 'a H <strong>umane</strong> W <strong>eb</strong> T <strong>ext</strong> G <strong>enerator</strong>' ,
'a *H* umane *W* eb *T* ext *G* enerator' = > 'a <strong>H</strong> umane <strong>W</strong> eb <strong>T</strong> ext <strong>G</strong> enerator' ,
2008-05-18 12:24:31 +04:00
}
to_test . each { | text , result | assert_equal " <p> #{ result } </p> " , textilizable ( text ) }
end
2008-05-01 12:44:40 +04:00
def test_wiki_horizontal_rule
assert_equal '<hr />' , textilizable ( '---' )
assert_equal '<p>Dashes: ---</p>' , textilizable ( 'Dashes: ---' )
end
2008-10-18 15:25:27 +04:00
def test_footnotes
raw = <<-RAW
This is some text [ 1 ] .
fn1 . This is the foot note
RAW
expected = <<-EXPECTED
< p > This is some text < sup > < a href = \ " # fn1 \" >1</a></sup>.</p>
< p id = " fn1 " class = " footnote " > < sup > 1 < / sup> This is the foot note< / p >
EXPECTED
assert_equal expected . gsub ( %r{ [ \ r \ n \ t] } , '' ) , textilizable ( raw ) . gsub ( %r{ [ \ r \ n \ t] } , '' )
end
2008-06-15 15:00:40 +04:00
def test_table_of_content
raw = <<-RAW
{ { toc } }
h1 . Title
Lorem ipsum dolor sit amet , consectetuer adipiscing elit . Maecenas sed libero .
2009-01-29 19:33:45 +03:00
h2 . Subtitle with a [ [ Wiki ] ] link
2008-06-15 15:00:40 +04:00
Nullam commodo metus accumsan nulla . Curabitur lobortis dui id dolor .
2009-01-29 19:33:45 +03:00
h2 . Subtitle with [ [ Wiki | another Wiki ] ] link
2008-06-15 15:00:40 +04:00
h2 . Subtitle with %{ color:red } red text %
2010-12-29 21:21:22 +03:00
< pre >
some code
< / pre>
2010-11-06 21:52:07 +03:00
h3 . Subtitle with * some * _modifiers_
2008-06-15 15:00:40 +04:00
h1 . Another title
2010-11-06 21:52:07 +03:00
h3 . An " Internet link " :http :/ / www . redmine . org / inside subtitle
2010-06-24 06:35:24 +04:00
h2 . " Project Name !/attachments/1234/logo_small.gif! !/attachments/5678/logo_2.png! " :/ projects / projectname / issues
2008-06-15 15:00:40 +04:00
RAW
2010-11-06 21:52:07 +03:00
expected = '<ul class="toc">' +
'<li><a href="#Title">Title</a>' +
'<ul>' +
'<li><a href="#Subtitle-with-a-Wiki-link">Subtitle with a Wiki link</a></li>' +
'<li><a href="#Subtitle-with-another-Wiki-link">Subtitle with another Wiki link</a></li>' +
'<li><a href="#Subtitle-with-red-text">Subtitle with red text</a>' +
'<ul>' +
'<li><a href="#Subtitle-with-some-modifiers">Subtitle with some modifiers</a></li>' +
'</ul>' +
'</li>' +
'</ul>' +
'</li>' +
'<li><a href="#Another-title">Another title</a>' +
'<ul>' +
'<li>' +
'<ul>' +
'<li><a href="#An-Internet-link-inside-subtitle">An Internet link inside subtitle</a></li>' +
'</ul>' +
'</li>' +
'<li><a href="#Project-Name">Project Name</a></li>' +
'</ul>' +
'</li>' +
2008-07-27 14:23:07 +04:00
'</ul>'
2010-06-24 06:35:24 +04:00
2010-11-06 20:47:27 +03:00
@project = Project . find ( 1 )
2010-12-29 21:21:22 +03:00
assert textilizable ( raw ) . gsub ( " \n " , " " ) . include? ( expected ) , textilizable ( raw )
2010-11-06 20:47:27 +03:00
end
def test_table_of_content_should_contain_included_page_headings
raw = <<-RAW
{ { toc } }
h1 . Included
{ { include ( Child_1 ) } }
RAW
expected = '<ul class="toc">' +
2010-11-06 21:52:07 +03:00
'<li><a href="#Included">Included</a></li>' +
'<li><a href="#Child-page-1">Child page 1</a></li>' +
2010-11-06 20:47:27 +03:00
'</ul>'
@project = Project . find ( 1 )
2008-07-27 14:23:07 +04:00
assert textilizable ( raw ) . gsub ( " \n " , " " ) . include? ( expected )
2008-06-15 15:00:40 +04:00
end
2008-05-30 20:35:36 +04:00
def test_blockquote
# orig raw text
raw = <<-RAW
John said :
> Lorem ipsum dolor sit amet , consectetuer adipiscing elit . Maecenas sed libero .
> Nullam commodo metus accumsan nulla . Curabitur lobortis dui id dolor .
> * Donec odio lorem ,
> * sagittis ac ,
> * malesuada in ,
> * adipiscing eu , dolor .
>
> > Nulla varius pulvinar diam . Proin id arcu id lorem scelerisque condimentum . Proin vehicula turpis vitae lacus .
> Proin a tellus . Nam vel neque .
He ' s right .
RAW
# expected html
expected = <<-EXPECTED
< p > John said : < / p>
< blockquote >
Lorem ipsum dolor sit amet , consectetuer adipiscing elit . Maecenas sed libero .
Nullam commodo metus accumsan nulla . Curabitur lobortis dui id dolor .
< ul >
< li > Donec odio lorem , < / li>
< li > sagittis ac , < / li>
< li > malesuada in , < / li>
< li > adipiscing eu , dolor . < / li>
< / ul>
< blockquote >
< p > Nulla varius pulvinar diam . Proin id arcu id lorem scelerisque condimentum . Proin vehicula turpis vitae lacus . < / p>
< / blockquote>
< p > Proin a tellus . Nam vel neque . < / p>
< / blockquote>
< p > He ' s right . < / p>
EXPECTED
assert_equal expected . gsub ( %r{ \ s+ } , '' ) , textilizable ( raw ) . gsub ( %r{ \ s+ } , '' )
end
2008-06-04 21:12:59 +04:00
def test_table
raw = <<-RAW
This is a table with empty cells :
| cell11 | cell12 ||
| cell21 || cell23 |
| cell31 | cell32 | cell33 |
RAW
expected = <<-EXPECTED
< p > This is a table with empty cells : < / p>
< table >
< tr > < td > cell11 < / td><td>cell12< / td > < td > < / td>< / tr >
< tr > < td > cell21 < / td><td>< / td > < td > cell23 < / td>< / tr >
< tr > < td > cell31 < / td><td>cell32< / td > < td > cell33 < / td>< / tr >
< / table>
EXPECTED
assert_equal expected . gsub ( %r{ \ s+ } , '' ) , textilizable ( raw ) . gsub ( %r{ \ s+ } , '' )
end
2009-07-19 18:23:15 +04:00
def test_table_with_line_breaks
raw = <<-RAW
This is a table with line breaks :
| cell11
continued | cell12 ||
| - cell21 - || cell23
cell23 line2
cell23 * line3 * |
| cell31 | cell32
cell32 line2 | cell33 |
RAW
expected = <<-EXPECTED
< p > This is a table with line breaks : < / p>
< table >
< tr >
< td > cell11 < br / >continued< / td >
< td > cell12 < / td>
< td > < / td>
< / tr>
< tr >
< td > < del > cell21 < / del>< / td >
< td > < / td>
< td > cell23 < br / > cell23 line2 < br / > cell23 < strong > line3 < / strong>< / td >
< / tr>
< tr >
< td > cell31 < / td>
< td > cell32 < br / > cell32 line2 < / td>
< td > cell33 < / td>
< / tr>
< / table>
EXPECTED
assert_equal expected . gsub ( %r{ \ s+ } , '' ) , textilizable ( raw ) . gsub ( %r{ \ s+ } , '' )
end
2009-12-09 13:31:17 +03:00
def test_textile_should_not_mangle_brackets
assert_equal '<p>[msg1][msg2]</p>' , textilizable ( '[msg1][msg2]' )
end
2008-10-27 14:08:29 +03:00
def test_default_formatter
Setting . text_formatting = 'unknown'
text = 'a *link*: http://www.example.net/'
assert_equal '<p>a *link*: <a href="http://www.example.net/">http://www.example.net/</a></p>' , textilizable ( text )
Setting . text_formatting = 'textile'
end
2008-09-20 18:07:52 +04:00
def test_due_date_distance_in_words
to_test = { Date . today = > 'Due in 0 days' ,
Date . today + 1 = > 'Due in 1 day' ,
2009-02-21 14:04:50 +03:00
Date . today + 100 = > 'Due in about 3 months' ,
2009-11-07 12:50:16 +03:00
Date . today + 20000 = > 'Due in over 54 years' ,
2008-09-20 18:07:52 +04:00
Date . today - 1 = > '1 day late' ,
2009-02-21 14:04:50 +03:00
Date . today - 100 = > 'about 3 months late' ,
2009-11-07 12:50:16 +03:00
Date . today - 20000 = > 'over 54 years late' ,
2008-09-20 18:07:52 +04:00
}
2011-01-10 20:55:57 +03:00
:: I18n . locale = :en
2008-09-20 18:07:52 +04:00
to_test . each do | date , expected |
assert_equal expected , due_date_distance_in_words ( date )
end
end
2008-11-09 17:52:16 +03:00
def test_avatar
# turn on avatars
Setting . gravatar_enabled = '1'
assert avatar ( User . find_by_mail ( 'jsmith@somenet.foo' ) ) . include? ( Digest :: MD5 . hexdigest ( 'jsmith@somenet.foo' ) )
assert avatar ( 'jsmith <jsmith@somenet.foo>' ) . include? ( Digest :: MD5 . hexdigest ( 'jsmith@somenet.foo' ) )
assert_nil avatar ( 'jsmith' )
assert_nil avatar ( nil )
# turn off avatars
Setting . gravatar_enabled = '0'
2010-09-10 07:09:02 +04:00
assert_equal '' , avatar ( User . find_by_mail ( 'jsmith@somenet.foo' ) )
2008-11-09 17:52:16 +03:00
end
2009-11-11 13:48:54 +03:00
def test_link_to_user
user = User . find ( 2 )
t = link_to_user ( user )
assert_equal " <a href= \" /users/2 \" > #{ user . name } </a> " , t
end
def test_link_to_user_should_not_link_to_locked_user
user = User . find ( 5 )
assert user . locked?
t = link_to_user ( user )
assert_equal user . name , t
end
def test_link_to_user_should_not_link_to_anonymous
user = User . anonymous
assert user . anonymous?
t = link_to_user ( user )
assert_equal :: I18n . t ( :label_user_anonymous ) , t
end
2010-08-08 11:07:20 +04:00
def test_link_to_project
project = Project . find ( 1 )
assert_equal %( <a href="/projects/ecookbook">eCookbook</a> ) ,
link_to_project ( project )
assert_equal %( <a href="/projects/ecookbook/settings">eCookbook</a> ) ,
link_to_project ( project , :action = > 'settings' )
assert_equal %( <a href="http://test.host/projects/ecookbook?jump=blah">eCookbook</a> ) ,
link_to_project ( project , { :only_path = > false , :jump = > 'blah' } )
assert_equal %( <a href="/projects/ecookbook/settings" class="project">eCookbook</a> ) ,
link_to_project ( project , { :action = > 'settings' } , :class = > " project " )
end
2007-09-03 00:41:47 +04:00
end