2019-03-21 03:27:53 +00:00
# frozen_string_literal: true
2019-03-15 01:32:57 +00:00
2009-02-21 11:04:50 +00:00
# Redmine - project management software
2020-03-03 00:24:10 +00:00
# Copyright (C) 2006-2020 Jean-Philippe Lang
2007-09-02 20:41:47 +00: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.
2011-05-18 02:46:50 +00:00
#
2007-09-02 20:41:47 +00:00
# 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.
2011-05-18 02:46:50 +00:00
#
2007-09-02 20:41:47 +00:00
# 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.
2017-07-30 18:23:06 +00:00
require File . expand_path ( '../../test_helper' , __FILE__ )
2007-09-02 20:41:47 +00:00
2016-07-16 11:36:57 +00:00
class ApplicationHelperTest < Redmine :: HelperTest
2012-03-04 13:53:38 +00:00
include ERB :: Util
2012-12-02 18:07:35 +00:00
include Rails . application . routes . url_helpers
2020-03-31 09:30:47 +00:00
include AvatarsHelper
2012-03-04 13:53:38 +00:00
2016-10-11 06:37:35 +00:00
fixtures :projects , :enabled_modules ,
:users , :email_addresses ,
:members , :member_roles , :roles ,
2011-11-24 05:52:24 +00:00
:repositories , :changesets ,
2014-06-02 17:02:38 +00:00
:projects_trackers ,
2019-03-20 05:15:59 +00:00
:trackers , :issue_statuses , :issues , :versions , :documents , :journals ,
2011-11-24 05:52:24 +00:00
:wikis , :wiki_pages , :wiki_contents ,
:boards , :messages , :news ,
2018-07-08 00:27:58 +00:00
:attachments , :enumerations ,
:custom_values , :custom_fields , :custom_fields_projects
2007-09-02 20:41:47 +00:00
def setup
super
2011-11-24 03:34:57 +00:00
set_tmp_attachments_directory
2019-03-19 15:43:55 +00:00
@russian_test = 'тест'
2007-09-02 20:41:47 +00:00
end
2010-09-06 00:26:08 +00:00
2013-05-18 09:14:10 +00:00
test " # link_to_if_authorized for authorized user should allow using the :controller and :action for the target link " do
User . current = User . find_by_login ( 'admin' )
2011-05-18 02:46:50 +00:00
2013-05-18 09:14:10 +00:00
@project = Issue . first . project # Used by helper
2019-11-09 16:33:22 +00:00
response = link_to_if_authorized (
'By controller/actionr' ,
{ :controller = > 'issues' , :action = > 'edit' , :id = > Issue . first . id } )
2013-05-18 09:14:10 +00:00
assert_match / href / , response
end
2011-05-18 02:46:50 +00:00
2013-05-18 09:14:10 +00:00
test " # link_to_if_authorized for unauthorized user should display nothing if user isn't authorized " do
User . current = User . find_by_login ( 'dlopper' )
@project = Project . find ( 'private-child' )
issue = @project . issues . first
assert ! issue . visible?
2019-11-09 16:33:22 +00:00
response = link_to_if_authorized (
'Never displayed' ,
{ :controller = > 'issues' , :action = > 'show' , :id = > issue } )
2013-05-18 09:14:10 +00:00
assert_nil response
2010-09-06 00:26:08 +00:00
end
2011-05-18 02:46:50 +00:00
2007-09-02 20:41:47 +00:00
def test_auto_links
to_test = {
2007-10-01 17:45:40 +00:00
'http://foo.bar' = > '<a class="external" href="http://foo.bar">http://foo.bar</a>' ,
2007-10-03 18:00:50 +00:00
'http://foo.bar/~user' = > '<a class="external" href="http://foo.bar/~user">http://foo.bar/~user</a>' ,
2007-10-01 17:45:40 +00:00
'http://foo.bar.' = > '<a class="external" href="http://foo.bar">http://foo.bar</a>.' ,
2008-11-11 14:24:06 +00:00
'https://foo.bar.' = > '<a class="external" href="https://foo.bar">https://foo.bar</a>.' ,
2008-07-12 11:12:33 +00: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 17:45:40 +00: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 16:48:04 +00: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 17:45:40 +00: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 19:27:03 +00: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 16:48:04 +00: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 16:51:13 +00:00
'ftp://foo.bar' = > '<a class="external" href="ftp://foo.bar">ftp://foo.bar</a>' ,
2008-11-11 14:24:06 +00: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 12:49:16 +00: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 20:26:22 +00:00
# escaping
2012-04-25 17:17:49 +00:00
'http://foo"bar' = > '<a class="external" href="http://foo"bar">http://foo"bar</a>' ,
2010-10-23 22:35:02 +00:00
# wrap in angle brackets
2013-02-24 12:39:06 +00:00
'<http://foo.bar>' = > '<<a class="external" href="http://foo.bar">http://foo.bar</a>>' ,
# invalid urls
'http://' = > 'http://' ,
'www.' = > 'www.' ,
2013-02-24 12:56:50 +00:00
'test-www.bar.com' = > 'test-www.bar.com' ,
2019-03-03 15:18:04 +00:00
# ends with a hyphen
'http://www.redmine.org/example-' = > '<a class="external" href="http://www.redmine.org/example-">http://www.redmine.org/example-</a>' ,
2007-09-02 20:41:47 +00:00
}
to_test . each { | text , result | assert_equal " <p> #{ result } </p> " , textilizable ( text ) }
end
2011-05-18 02:46:50 +00:00
2014-10-22 17:37:16 +00:00
def test_auto_links_with_non_ascii_characters
to_test = {
" http://foo.bar/ #{ @russian_test } " = >
%|<a class="external" href="http://foo.bar/#{@russian_test}">http://foo.bar/#{@russian_test}</a>|
}
to_test . each { | text , result | assert_equal " <p> #{ result } </p> " , textilizable ( text ) }
2012-11-24 14:20:01 +00:00
end
2007-09-02 20:41:47 +00:00
def test_auto_mailto
2013-02-24 12:56:50 +00:00
to_test = {
'test@foo.bar' = > '<a class="email" href="mailto:test@foo.bar">test@foo.bar</a>' ,
'test@www.foo.bar' = > '<a class="email" href="mailto:test@www.foo.bar">test@www.foo.bar</a>' ,
}
to_test . each { | text , result | assert_equal " <p> #{ result } </p> " , textilizable ( text ) }
2007-09-02 20:41:47 +00:00
end
2011-05-18 02:46:50 +00:00
2007-12-19 21:06:06 +00:00
def test_inline_images
2007-09-02 20:41:47 +00:00
to_test = {
'!http://foo.bar/image.jpg!' = > '<img src="http://foo.bar/image.jpg" alt="" />' ,
2016-06-04 07:31:29 +00:00
'floating !>http://foo.bar/image.jpg!' = > 'floating <span style="float:right"><img src="http://foo.bar/image.jpg" alt="" /></span>' ,
2017-04-06 16:41:52 +00:00
'with class !(some-class)http://foo.bar/image.jpg!' = > 'with class <img src="http://foo.bar/image.jpg" class="wiki-class-some-class" alt="" />' ,
'with class !(wiki-class-foo)http://foo.bar/image.jpg!' = > 'with class <img src="http://foo.bar/image.jpg" class="wiki-class-foo" alt="" />' ,
2012-02-12 14:18:32 +00:00
'with style !{width:100px;height:100px}http://foo.bar/image.jpg!' = > 'with style <img src="http://foo.bar/image.jpg" style="width:100px;height:100px;" alt="" />' ,
2008-12-19 10:16:15 +00: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-19 21:06:06 +00:00
}
to_test . each { | text , result | assert_equal " <p> #{ result } </p> " , textilizable ( text ) }
end
2011-05-18 02:46:50 +00:00
2009-11-04 10:22:57 +00:00
def test_inline_images_inside_tags
2019-10-22 11:40:00 +00:00
raw = << ~ RAW
h1 . ! foo . png! Heading
2009-11-04 10:22:57 +00:00
2019-10-22 11:40:00 +00:00
Centered image :
2009-11-04 10:22:57 +00:00
2019-10-22 11:40:00 +00:00
p = . ! bar . gif!
RAW
2009-11-04 10:22:57 +00:00
assert textilizable ( raw ) . include? ( '<img src="foo.png" alt="" />' )
assert textilizable ( raw ) . include? ( '<img src="bar.gif" alt="" />' )
end
2011-05-18 02:46:50 +00:00
2008-10-28 10:43:34 +00:00
def test_attached_images
to_test = {
2013-01-14 21:03:53 +00:00
'Inline image: !logo.gif!' = > 'Inline image: <img src="/attachments/download/3/logo.gif" title="This is a logo" alt="This is a logo" />' ,
'Inline image: !logo.GIF!' = > 'Inline image: <img src="/attachments/download/3/logo.gif" title="This is a logo" alt="This is a logo" />' ,
2009-02-05 20:25:01 +00:00
'No match: !ogo.gif!' = > 'No match: <img src="ogo.gif" alt="" />' ,
2009-10-24 12:19:22 +00:00
'No match: !ogo.GIF!' = > 'No match: <img src="ogo.GIF" alt="" />' ,
# link image
2013-01-14 21:03:53 +00:00
'!logo.gif!:http://foo.bar/' = > '<a href="http://foo.bar/"><img src="/attachments/download/3/logo.gif" title="This is a logo" alt="This is a logo" /></a>' ,
2008-10-28 10:43:34 +00:00
}
2012-12-02 20:23:48 +00:00
attachments = Attachment . all
2008-10-28 10:43:34 +00:00
to_test . each { | text , result | assert_equal " <p> #{ result } </p> " , textilizable ( text , :attachments = > attachments ) }
end
2011-05-18 02:46:50 +00:00
2015-03-14 08:39:24 +00:00
def test_attached_images_with_textile_and_non_ascii_filename
2019-04-12 05:42:31 +00:00
to_test = {
'CAFÉ.JPG' = > 'CAF%C3%89.JPG' ,
'crème.jpg' = > 'cr%C3%A8me.jpg' ,
}
2015-03-14 08:39:24 +00:00
with_settings :text_formatting = > 'textile' do
2019-04-12 05:42:31 +00:00
to_test . each do | filename , result |
attachment = Attachment . generate! ( :filename = > filename )
assert_include %( <img src="/attachments/download/ #{ attachment . id } / #{ result } " alt="" /> ) , textilizable ( " ! #{ filename } ! " , :attachments = > [ attachment ] )
end
2015-03-14 08:39:24 +00:00
end
end
def test_attached_images_with_markdown_and_non_ascii_filename
2015-03-15 10:09:17 +00:00
skip unless Object . const_defined? ( :Redcarpet )
2019-04-12 05:42:31 +00:00
to_test = {
'CAFÉ.JPG' = > 'CAF%C3%89.JPG' ,
'crème.jpg' = > 'cr%C3%A8me.jpg' ,
}
2015-03-14 08:39:24 +00:00
with_settings :text_formatting = > 'markdown' do
2019-04-12 05:42:31 +00:00
to_test . each do | filename , result |
attachment = Attachment . generate! ( :filename = > filename )
assert_include %( <img src="/attachments/download/ #{ attachment . id } / #{ result } " alt="" /> ) , textilizable ( "  " , :attachments = > [ attachment ] )
end
2015-03-14 08:39:24 +00:00
end
end
2017-01-30 19:37:55 +00:00
def test_attached_images_with_hires_naming
attachment = Attachment . generate! ( :filename = > 'image@2x.png' )
2019-11-09 16:33:11 +00:00
assert_equal (
%( <p><img src="/attachments/download/ #{ attachment . id } /image@2x.png" srcset="/attachments/download/ #{ attachment . id } /image@2x.png 2x" alt="" /></p> ) ,
textilizable ( " !image@2x.png! " , :attachments = > [ attachment ] ) )
2017-01-30 19:37:55 +00:00
end
2011-11-23 05:30:53 +00:00
def test_attached_images_filename_extension
a1 = Attachment . new (
:container = > Issue . find ( 1 ) ,
:file = > mock_file_with_options ( { :original_filename = > " testtest.JPG " } ) ,
:author = > User . find ( 1 ) )
assert a1 . save
assert_equal " testtest.JPG " , a1 . filename
assert_equal " image/jpeg " , a1 . content_type
assert a1 . image?
a2 = Attachment . new (
:container = > Issue . find ( 1 ) ,
:file = > mock_file_with_options ( { :original_filename = > " testtest.jpeg " } ) ,
:author = > User . find ( 1 ) )
assert a2 . save
assert_equal " testtest.jpeg " , a2 . filename
assert_equal " image/jpeg " , a2 . content_type
assert a2 . image?
a3 = Attachment . new (
:container = > Issue . find ( 1 ) ,
:file = > mock_file_with_options ( { :original_filename = > " testtest.JPE " } ) ,
:author = > User . find ( 1 ) )
assert a3 . save
assert_equal " testtest.JPE " , a3 . filename
assert_equal " image/jpeg " , a3 . content_type
assert a3 . image?
a4 = Attachment . new (
:container = > Issue . find ( 1 ) ,
:file = > mock_file_with_options ( { :original_filename = > " Testtest.BMP " } ) ,
:author = > User . find ( 1 ) )
assert a4 . save
assert_equal " Testtest.BMP " , a4 . filename
assert_equal " image/x-ms-bmp " , a4 . content_type
assert a4 . image?
to_test = {
'Inline image: !testtest.jpg!' = >
2013-01-14 21:03:53 +00:00
'Inline image: <img src="/attachments/download/' + a1 . id . to_s + '/testtest.JPG" alt="" />' ,
2011-11-23 05:30:53 +00:00
'Inline image: !testtest.jpeg!' = >
2013-01-14 21:03:53 +00:00
'Inline image: <img src="/attachments/download/' + a2 . id . to_s + '/testtest.jpeg" alt="" />' ,
2011-11-23 05:30:53 +00:00
'Inline image: !testtest.jpe!' = >
2013-01-14 21:03:53 +00:00
'Inline image: <img src="/attachments/download/' + a3 . id . to_s + '/testtest.JPE" alt="" />' ,
2011-11-23 05:30:53 +00:00
'Inline image: !testtest.bmp!' = >
2013-01-14 21:03:53 +00:00
'Inline image: <img src="/attachments/download/' + a4 . id . to_s + '/Testtest.BMP" alt="" />' ,
2011-11-23 05:30:53 +00:00
}
attachments = [ a1 , a2 , a3 , a4 ]
to_test . each { | text , result | assert_equal " <p> #{ result } </p> " , textilizable ( text , :attachments = > attachments ) }
end
2011-11-24 03:34:57 +00:00
def test_attached_images_should_read_later
2011-12-16 17:52:47 +00:00
set_fixtures_attachments_directory
2011-11-24 03:34:57 +00:00
a1 = Attachment . find ( 16 )
assert_equal " testfile.png " , a1 . filename
assert a1 . readable?
2019-11-16 12:38:38 +00:00
assert_not a1 . visible? ( User . anonymous )
2011-11-24 03:34:57 +00:00
assert a1 . visible? ( User . find ( 2 ) )
a2 = Attachment . find ( 17 )
assert_equal " testfile.PNG " , a2 . filename
assert a2 . readable?
2019-11-16 12:38:38 +00:00
assert_not a2 . visible? ( User . anonymous )
2011-11-24 03:34:57 +00:00
assert a2 . visible? ( User . find ( 2 ) )
assert a1 . created_on < a2 . created_on
to_test = {
'Inline image: !testfile.png!' = >
2013-01-14 21:03:53 +00:00
'Inline image: <img src="/attachments/download/' + a2 . id . to_s + '/testfile.PNG" alt="" />' ,
2011-11-24 03:34:57 +00:00
'Inline image: !Testfile.PNG!' = >
2013-01-14 21:03:53 +00:00
'Inline image: <img src="/attachments/download/' + a2 . id . to_s + '/testfile.PNG" alt="" />' ,
2011-11-24 03:34:57 +00:00
}
attachments = [ a1 , a2 ]
to_test . each { | text , result | assert_equal " <p> #{ result } </p> " , textilizable ( text , :attachments = > attachments ) }
2019-10-04 11:17:33 +00:00
ensure
2011-11-24 08:10:41 +00:00
set_tmp_attachments_directory
2011-11-24 03:34:57 +00:00
end
2007-12-19 21:06:06 +00:00
def test_textile_external_links
to_test = {
2007-10-01 17:45:40 +00: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 19:39:51 +00:00
'"link (Link title)":http://foo.bar' = > '<a href="http://foo.bar" title="Link title" class="external">link</a>' ,
2008-12-23 17:05:38 +00: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 19:37:09 +00: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 19:39:51 +00:00
# no multiline link text
2009-07-19 14:23:15 +00: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 17:38:52 +00: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 12:49:16 +00: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 20:26:22 +00:00
# escaping
'"test":http://foo"bar' = > '<a href="http://foo"bar" class="external">test</a>' ,
2019-03-03 15:18:04 +00:00
# ends with a hyphen
'(see "inline link":http://www.foo.bar/Test-)' = > '(see <a href="http://www.foo.bar/Test-" class="external">inline link</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>' ,
'This is an intern "link":/foo/bar-' = > 'This is an intern <a href="/foo/bar-">link</a>' , }
2007-09-02 20:41:47 +00:00
to_test . each { | text , result | assert_equal " <p> #{ result } </p> " , textilizable ( text ) }
end
2011-01-11 11:06:56 +00:00
2014-10-22 17:37:16 +00:00
def test_textile_external_links_with_non_ascii_characters
to_test = {
%|This is a "link":http://foo.bar/#{@russian_test}| = >
%|This is a <a href="http://foo.bar/#{@russian_test}" class="external">link</a>|
}
to_test . each { | text , result | assert_equal " <p> #{ result } </p> " , textilizable ( text ) }
2012-11-24 14:20:01 +00:00
end
2007-09-02 20:41:47 +00:00
def test_redmine_links
2018-06-17 05:45:17 +00:00
user_with_email_login = User . generate! ( :login = > 'abcd@example.com' )
user_with_email_login_2 = User . generate! ( :login = > 'foo.bar@example.com' )
u_email_id = user_with_email_login . id
u_email_id_2 = user_with_email_login_2 . id
2019-11-09 15:26:37 +00:00
issue_link = link_to ( '#3' ,
{ :controller = > 'issues' , :action = > 'show' , :id = > 3 } ,
:class = > Issue . find ( 3 ) . css_classes ,
:title = > 'Bug: Error 281 when updating a recipe (New)' )
ext_issue_link = link_to (
2020-04-05 10:51:46 +00:00
'Bug #3: Error 281 when updating a recipe' ,
2019-11-09 15:26:37 +00:00
{ :controller = > 'issues' , :action = > 'show' , :id = > 3 } ,
:class = > Issue . find ( 3 ) . css_classes ,
2020-04-05 10:51:46 +00:00
:title = > 'Status: New' )
2019-11-09 15:26:37 +00:00
note_link = link_to (
'#3-14' ,
{ :controller = > 'issues' , :action = > 'show' ,
:id = > 3 , :anchor = > 'note-14' } ,
:class = > Issue . find ( 3 ) . css_classes ,
:title = > 'Bug: Error 281 when updating a recipe (New)' )
ext_note_link = link_to (
2020-04-05 10:51:46 +00:00
'Bug #3-14: Error 281 when updating a recipe' ,
2019-11-09 15:26:37 +00:00
{ :controller = > 'issues' , :action = > 'show' ,
:id = > 3 , :anchor = > 'note-14' } ,
:class = > Issue . find ( 3 ) . css_classes ,
2020-04-05 10:51:46 +00:00
:title = > 'Status: New' )
2019-11-09 15:26:37 +00:00
note_link2 = link_to (
'#3#note-14' ,
{ :controller = > 'issues' , :action = > 'show' ,
:id = > 3 , :anchor = > 'note-14' } ,
:class = > Issue . find ( 3 ) . css_classes ,
:title = > 'Bug: Error 281 when updating a recipe (New)' )
ext_note_link2 = link_to (
2020-04-05 10:51:46 +00:00
'Bug #3#note-14: Error 281 when updating a recipe' ,
2019-11-09 15:26:37 +00:00
{ :controller = > 'issues' , :action = > 'show' ,
:id = > 3 , :anchor = > 'note-14' } ,
:class = > Issue . find ( 3 ) . css_classes ,
2020-04-05 10:51:46 +00:00
:title = > 'Status: New' )
2019-11-09 15:26:37 +00:00
revision_link = link_to (
'r1' ,
{ :controller = > 'repositories' , :action = > 'revision' ,
:id = > 'ecookbook' , :repository_id = > 10 , :rev = > 1 } ,
:class = > 'changeset' ,
:title = > 'My very first commit do not escaping #<>&' )
revision_link2 = link_to (
'r2' ,
{ :controller = > 'repositories' , :action = > 'revision' ,
:id = > 'ecookbook' , :repository_id = > 10 , :rev = > 2 } ,
:class = > 'changeset' ,
:title = > 'This commit fixes #1, #2 and references #1 & #3' )
changeset_link2 = link_to (
'691322a8eb01e11fd7' ,
{ :controller = > 'repositories' , :action = > 'revision' ,
:id = > 'ecookbook' , :repository_id = > 10 , :rev = > 1 } ,
:class = > 'changeset' , :title = > 'My very first commit do not escaping #<>&' )
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 17:45:01 +00:00
2011-11-19 11:16:23 +00:00
board_url = { :controller = > 'boards' , :action = > 'show' , :id = > 2 , :project_id = > 'ecookbook' }
2008-08-10 22:18:23 +00:00
message_url = { :controller = > 'messages' , :action = > 'show' , :board_id = > 1 , :id = > 4 }
2015-04-14 05:38:26 +00:00
2011-11-19 11:16:23 +00:00
news_url = { :controller = > 'news' , :action = > 'show' , :id = > 1 }
2011-05-18 02:46:50 +00:00
2010-02-13 10:32:06 +00:00
project_url = { :controller = > 'projects' , :action = > 'show' , :id = > 'subproject1' }
2011-05-18 02:46:50 +00:00
2018-06-16 14:27:51 +00:00
source_url = '/projects/ecookbook/repository/10/entry/some/file'
source_url_with_rev = '/projects/ecookbook/repository/10/revisions/52/entry/some/file'
source_url_with_ext = '/projects/ecookbook/repository/10/entry/some/file.ext'
source_url_with_rev_and_ext = '/projects/ecookbook/repository/10/revisions/52/entry/some/file.ext'
source_url_with_branch = '/projects/ecookbook/repository/10/revisions/branch/entry/some/file'
2012-10-09 17:02:22 +00:00
2018-06-16 14:27:51 +00:00
export_url = '/projects/ecookbook/repository/10/raw/some/file'
export_url_with_rev = '/projects/ecookbook/repository/10/revisions/52/raw/some/file'
export_url_with_ext = '/projects/ecookbook/repository/10/raw/some/file.ext'
export_url_with_rev_and_ext = '/projects/ecookbook/repository/10/revisions/52/raw/some/file.ext'
export_url_with_branch = '/projects/ecookbook/repository/10/revisions/branch/raw/some/file'
2012-10-09 17:02:22 +00:00
2007-09-02 20:41:47 +00:00
to_test = {
2008-03-17 17:45:01 +00:00
# tickets
2010-03-17 19:57:32 +00:00
'#3, [#3], (#3) and #3.' = > " #{ issue_link } , [ #{ issue_link } ], ( #{ issue_link } ) and #{ issue_link } . " ,
2012-02-15 17:49:31 +00:00
# ticket notes
'#3-14' = > note_link ,
2013-07-11 19:18:37 +00:00
'#3#note-14' = > note_link2 ,
2012-07-24 21:51:10 +00:00
# should not ignore leading zero
'#03' = > '#03' ,
2018-09-08 06:43:13 +00:00
# tickets with more info
2020-04-05 10:51:46 +00:00
'##3, [##3], (##3) and ##3.' = > " #{ ext_issue_link } , [ #{ ext_issue_link } ], ( #{ ext_issue_link } ) and #{ ext_issue_link } . " ,
'##3-14' = > ext_note_link ,
'##3#note-14' = > ext_note_link2 ,
'##03' = > '##03' ,
2008-03-17 17:45:01 +00:00
# changesets
2013-03-21 21:53:28 +00:00
'r1' = > revision_link ,
'r1.' = > " #{ revision_link } . " ,
'r1, r2' = > " #{ revision_link } , #{ revision_link2 } " ,
'r1,r2' = > " #{ revision_link } , #{ revision_link2 } " ,
'commit:691322a8eb01e11fd7' = > changeset_link2 ,
2008-03-17 17:45:01 +00: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
2012-01-22 14:23:10 +00:00
'source:some/file' = > link_to ( 'source:some/file' , source_url , :class = > 'source' ) ,
2008-03-17 17:45:01 +00:00
'source:/some/file' = > link_to ( 'source:/some/file' , source_url , :class = > 'source' ) ,
2008-07-10 13:36:28 +00: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' ) + " , " ,
2012-10-09 17:02:22 +00:00
'source:/some/file@52' = > link_to ( 'source:/some/file@52' , source_url_with_rev , :class = > 'source' ) ,
2012-12-21 20:59:35 +00:00
'source:/some/file@branch' = > link_to ( 'source:/some/file@branch' , source_url_with_branch , :class = > 'source' ) ,
2012-10-09 17:02:22 +00:00
'source:/some/file.ext@52' = > link_to ( 'source:/some/file.ext@52' , source_url_with_rev_and_ext , :class = > 'source' ) ,
'source:/some/file#L110' = > link_to ( 'source:/some/file#L110' , source_url + " # L110 " , :class = > 'source' ) ,
'source:/some/file.ext#L110' = > link_to ( 'source:/some/file.ext#L110' , source_url_with_ext + " # L110 " , :class = > 'source' ) ,
'source:/some/file@52#L110' = > link_to ( 'source:/some/file@52#L110' , source_url_with_rev + " # L110 " , :class = > 'source' ) ,
# export
'export:/some/file' = > link_to ( 'export:/some/file' , export_url , :class = > 'source download' ) ,
'export:/some/file.ext' = > link_to ( 'export:/some/file.ext' , export_url_with_ext , :class = > 'source download' ) ,
'export:/some/file@52' = > link_to ( 'export:/some/file@52' , export_url_with_rev , :class = > 'source download' ) ,
'export:/some/file.ext@52' = > link_to ( 'export:/some/file.ext@52' , export_url_with_rev_and_ext , :class = > 'source download' ) ,
2012-12-21 20:59:35 +00:00
'export:/some/file@branch' = > link_to ( 'export:/some/file@branch' , export_url_with_branch , :class = > 'source download' ) ,
2011-11-19 11:16:23 +00:00
# forum
'forum#2' = > link_to ( 'Discussion' , board_url , :class = > 'board' ) ,
'forum:Discussion' = > link_to ( 'Discussion' , board_url , :class = > 'board' ) ,
2008-08-10 22:18:23 +00:00
# message
'message#4' = > link_to ( 'Post 2' , message_url , :class = > 'message' ) ,
2011-01-23 17:02:10 +00:00
'message#5' = > link_to ( 'RE: post 2' , message_url . merge ( :anchor = > 'message-5' , :r = > 5 ) , :class = > 'message' ) ,
2011-11-19 11:16:23 +00:00
# news
'news#1' = > link_to ( 'eCookbook first release !' , news_url , :class = > 'news' ) ,
'news:"eCookbook first release !"' = > link_to ( 'eCookbook first release !' , news_url , :class = > 'news' ) ,
2010-02-13 10:32:06 +00: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' ) ,
2010-02-18 18:53:30 +00:00
# not found
'#0123456789' = > '#0123456789' ,
2008-03-17 18:01:26 +00:00
# invalid expressions
2008-06-04 21:30:12 +00:00
'source:' = > 'source:' ,
# url hash
2017-06-07 20:10:57 +00:00
" http://foo.bar/FAQ # 3 " = > '<a class="external" href="http://foo.bar/FAQ#3">http://foo.bar/FAQ#3</a>' ,
# user
'user:jsmith' = > link_to_user ( User . find_by_id ( 2 ) ) ,
2018-09-23 14:55:35 +00:00
'user:JSMITH' = > link_to_user ( User . find_by_id ( 2 ) ) ,
2017-06-17 08:48:23 +00:00
'user#2' = > link_to_user ( User . find_by_id ( 2 ) ) ,
2017-06-07 20:10:57 +00:00
'@jsmith' = > link_to_user ( User . find_by_id ( 2 ) ) ,
2018-09-23 14:55:35 +00:00
'@JSMITH' = > link_to_user ( User . find_by_id ( 2 ) ) ,
2018-06-17 05:45:17 +00:00
'@abcd@example.com' = > link_to_user ( User . find_by_id ( u_email_id ) ) ,
'user:abcd@example.com' = > link_to_user ( User . find_by_id ( u_email_id ) ) ,
'@foo.bar@example.com' = > link_to_user ( User . find_by_id ( u_email_id_2 ) ) ,
'user:foo.bar@example.com' = > link_to_user ( User . find_by_id ( u_email_id_2 ) ) ,
2017-06-07 20:10:57 +00:00
# invalid user
'user:foobar' = > 'user:foobar' ,
2008-01-15 18:12:12 +00:00
}
@project = Project . find ( 1 )
2010-02-13 10:32:06 +00:00
to_test . each { | text , result | assert_equal " <p> #{ result } </p> " , textilizable ( text ) , " #{ text } failed " }
2008-01-15 18:12:12 +00:00
end
2011-05-18 02:46:50 +00:00
2019-03-20 05:15:59 +00:00
def test_link_to_note_within_the_same_page
issue = Issue . find ( 1 )
assert_equal '<p><a href="#note-14">#note-14</a></p>' , textilizable ( '#note-14' , :object = > issue )
journal = Journal . find ( 2 )
assert_equal '<p><a href="#note-2">#note-2</a></p>' , textilizable ( '#note-2' , :object = > journal )
end
2018-06-17 05:45:17 +00:00
def test_user_links_with_email_as_login_name_should_not_be_parsed_textile
with_settings :text_formatting = > 'textile' do
u = User . generate! ( :login = > 'jsmith@somenet.foo' )
2017-06-07 20:10:57 +00:00
2018-06-17 05:45:17 +00:00
# user link format: @jsmith@somenet.foo
raw = " @jsmith@somenet.foo should not be parsed in jsmith@somenet.foo "
2019-11-09 11:53:26 +00:00
assert_match (
%r{ <p><a class="user active".*> #{ u . name } </a> should not be parsed in <a class="email" href="mailto:jsmith@somenet.foo">jsmith@somenet.foo</a></p> } ,
textilizable ( raw , :project = > Project . find ( 1 ) ) )
2018-06-17 05:45:17 +00:00
# user link format: user:jsmith@somenet.foo
raw = " user:jsmith@somenet.foo should not be parsed in jsmith@somenet.foo "
2019-11-09 11:53:26 +00:00
assert_match (
%r{ <p><a class="user active".*> #{ u . name } </a> should not be parsed in <a class="email" href="mailto:jsmith@somenet.foo">jsmith@somenet.foo</a></p> } ,
textilizable ( raw , :project = > Project . find ( 1 ) ) )
2018-06-17 05:45:17 +00:00
end
end
def test_user_links_with_email_as_login_name_should_not_be_parsed_markdown
with_settings :text_formatting = > 'markdown' do
u = User . generate! ( :login = > 'jsmith@somenet.foo' )
# user link format: @jsmith@somenet.foo
raw = " @jsmith@somenet.foo should not be parsed in jsmith@somenet.foo "
2019-11-09 11:53:37 +00:00
assert_match (
%r{ <p><a class= \ "user active \ ".*> #{ u . name } </a> should not be parsed in <a href= \ "mailto:jsmith@somenet.foo \ ">jsmith@somenet.foo</a></p> } ,
textilizable ( raw , :project = > Project . find ( 1 ) ) )
2018-06-17 05:45:17 +00:00
# user link format: user:jsmith@somenet.foo
raw = " user:jsmith@somenet.foo should not be parsed in jsmith@somenet.foo "
2019-11-09 11:53:37 +00:00
assert_match (
%r{ <p><a class= \ "user active \ ".*> #{ u . name } </a> should not be parsed in <a href= \ "mailto:jsmith@somenet.foo \ ">jsmith@somenet.foo</a></p> } ,
textilizable ( raw , :project = > Project . find ( 1 ) ) )
2018-06-17 05:45:17 +00:00
end
2017-06-07 20:10:57 +00:00
end
2014-11-14 21:31:27 +00:00
def test_should_not_parse_redmine_links_inside_link
raw = " r1 should not be parsed in http://example.com/url-r1/ "
2019-11-09 11:53:15 +00:00
assert_match (
%r{ <p><a class="changeset".*>r1</a> should not be parsed in <a class="external" href="http://example.com/url-r1/">http://example.com/url-r1/</a></p> } ,
textilizable ( raw , :project = > Project . find ( 1 ) ) )
2014-11-14 21:31:27 +00:00
end
2013-01-22 20:40:39 +00:00
def test_redmine_links_with_a_different_project_before_current_project
vp1 = Version . generate! ( :project_id = > 1 , :name = > '1.4.4' )
vp3 = Version . generate! ( :project_id = > 3 , :name = > '1.4.4' )
@project = Project . find ( 3 )
2014-02-05 00:42:34 +00:00
result1 = link_to ( " 1.4.4 " , " /versions/ #{ vp1 . id } " , :class = > " version " )
result2 = link_to ( " 1.4.4 " , " /versions/ #{ vp3 . id } " , :class = > " version " )
assert_equal " <p> #{ result1 } #{ result2 } </p> " ,
textilizable ( " ecookbook:version:1.4.4 version:1.4.4 " )
2013-01-22 20:40:39 +00:00
end
2012-02-15 17:59:13 +00:00
def test_escaped_redmine_links_should_not_be_parsed
to_test = [
'#3.' ,
'#3-14.' ,
'#3#-note14.' ,
'r1' ,
'document#1' ,
'document:"Test document"' ,
'version#2' ,
'version:1.0' ,
'version:"1.0"' ,
'source:/some/file'
]
@project = Project . find ( 1 )
to_test . each { | text | assert_equal " <p> #{ text } </p> " , textilizable ( " ! " + text ) , " #{ text } failed " }
end
2011-01-23 16:12:38 +00:00
def test_cross_project_redmine_links
2014-02-05 08:55:32 +00:00
source_link = link_to ( 'ecookbook:source:/some/file' ,
{ :controller = > 'repositories' , :action = > 'entry' ,
2018-06-16 14:27:51 +00:00
:id = > 'ecookbook' , :repository_id = > 10 , :path = > [ 'some' , 'file' ] } ,
2014-02-05 08:55:32 +00:00
:class = > 'source' )
changeset_link = link_to ( 'ecookbook:r2' ,
{ :controller = > 'repositories' , :action = > 'revision' ,
2018-06-16 14:27:51 +00:00
:id = > 'ecookbook' , :repository_id = > 10 , :rev = > 2 } ,
2014-02-05 08:55:32 +00:00
:class = > 'changeset' ,
:title = > 'This commit fixes #1, #2 and references #1 & #3' )
2011-01-23 16:12:38 +00:00
to_test = {
# documents
'document:"Test document"' = > 'document:"Test document"' ,
2014-02-05 08:55:49 +00:00
'ecookbook:document:"Test document"' = >
link_to ( " Test document " , " /documents/1 " , :class = > " document " ) ,
2011-01-23 16:12:38 +00:00
'invalid:document:"Test document"' = > 'invalid:document:"Test document"' ,
# versions
'version:"1.0"' = > 'version:"1.0"' ,
2014-02-05 08:55:49 +00:00
'ecookbook:version:"1.0"' = >
link_to ( " 1.0 " , " /versions/2 " , :class = > " version " ) ,
2011-01-23 16:12:38 +00:00
'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 )
2014-02-05 08:55:32 +00:00
to_test . each do | text , result |
assert_equal " <p> #{ result } </p> " , textilizable ( text ) , " #{ text } failed "
end
2011-01-23 16:12:38 +00:00
end
2011-01-11 11:06:56 +00:00
2014-04-26 07:34:11 +00:00
def test_redmine_links_by_name_should_work_with_html_escaped_characters
v = Version . generate! ( :name = > " Test & Show.txt " , :project_id = > 1 )
link = link_to ( " Test & Show.txt " , " /versions/ #{ v . id } " , :class = > " version " )
@project = v . project
assert_equal " <p> #{ link } </p> " , textilizable ( 'version:"Test & Show.txt"' )
end
2014-02-06 02:38:37 +00:00
def test_link_to_issue_subject
issue = Issue . generate! ( :subject = > " 01234567890123456789 " )
str = link_to_issue ( issue , :truncate = > 10 )
result = link_to ( " Bug # #{ issue . id } " , " /issues/ #{ issue . id } " , :class = > issue . css_classes )
assert_equal " #{ result } : 0123456... " , str
issue = Issue . generate! ( :subject = > " <&> " )
str = link_to_issue ( issue )
result = link_to ( " Bug # #{ issue . id } " , " /issues/ #{ issue . id } " , :class = > issue . css_classes )
assert_equal " #{ result } : <&> " , str
issue = Issue . generate! ( :subject = > " <&>0123456789012345 " )
str = link_to_issue ( issue , :truncate = > 10 )
result = link_to ( " Bug # #{ issue . id } " , " /issues/ #{ issue . id } " , :class = > issue . css_classes )
assert_equal " #{ result } : <&>0123... " , str
end
def test_link_to_issue_title
long_str = " 0123456789 " * 5
issue = Issue . generate! ( :subject = > " #{ long_str } 01234567890123456789 " )
str = link_to_issue ( issue , :subject = > false )
result = link_to ( " Bug # #{ issue . id } " , " /issues/ #{ issue . id } " ,
:class = > issue . css_classes ,
:title = > " #{ long_str } 0123456... " )
assert_equal result , str
issue = Issue . generate! ( :subject = > " <&> #{ long_str } 01234567890123456789 " )
str = link_to_issue ( issue , :subject = > false )
result = link_to ( " Bug # #{ issue . id } " , " /issues/ #{ issue . id } " ,
:class = > issue . css_classes ,
:title = > " <&> #{ long_str } 0123... " )
assert_equal result , str
end
2012-01-22 14:23:10 +00:00
def test_multiple_repositories_redmine_links
2013-01-27 16:02:49 +00:00
svn = Repository :: Subversion . create! ( :project_id = > 1 , :identifier = > 'svn_repo-1' , :url = > 'file:///foo/hg' )
2012-01-22 14:23:10 +00:00
Changeset . create! ( :repository = > svn , :committed_on = > Time . now , :revision = > '123' )
hg = Repository :: Mercurial . create! ( :project_id = > 1 , :identifier = > 'hg1' , :url = > '/foo/hg' )
Changeset . create! ( :repository = > hg , :committed_on = > Time . now , :revision = > '123' , :scmid = > 'abcd' )
2019-11-09 14:10:02 +00:00
changeset_link = link_to (
'r2' ,
{ :controller = > 'repositories' , :action = > 'revision' ,
:id = > 'ecookbook' , :repository_id = > 10 , :rev = > 2 } ,
:class = > 'changeset' ,
:title = > 'This commit fixes #1, #2 and references #1 & #3' )
svn_changeset_link = link_to (
'svn_repo-1|r123' ,
{ :controller = > 'repositories' , :action = > 'revision' ,
:id = > 'ecookbook' , :repository_id = > 'svn_repo-1' , :rev = > 123 } ,
:class = > 'changeset' , :title = > '' )
hg_changeset_link = link_to (
'hg1|abcd' ,
{ :controller = > 'repositories' , :action = > 'revision' ,
:id = > 'ecookbook' , :repository_id = > 'hg1' , :rev = > 'abcd' } ,
:class = > 'changeset' , :title = > '' )
2019-11-09 05:24:35 +00:00
source_link = link_to ( 'source:some/file' ,
{ :controller = > 'repositories' , :action = > 'entry' ,
:id = > 'ecookbook' , :repository_id = > 10 ,
:path = > [ 'some' , 'file' ] } ,
:class = > 'source' )
hg_source_link = link_to ( 'source:hg1|some/file' ,
{ :controller = > 'repositories' , :action = > 'entry' ,
:id = > 'ecookbook' , :repository_id = > 'hg1' ,
:path = > [ 'some' , 'file' ] } ,
:class = > 'source' )
2012-01-22 14:23:10 +00:00
to_test = {
'r2' = > changeset_link ,
2013-01-27 16:02:49 +00:00
'svn_repo-1|r123' = > svn_changeset_link ,
2012-01-22 14:23:10 +00:00
'invalid|r123' = > 'invalid|r123' ,
'commit:hg1|abcd' = > hg_changeset_link ,
'commit:invalid|abcd' = > 'commit:invalid|abcd' ,
# source
'source:some/file' = > source_link ,
'source:hg1|some/file' = > hg_source_link ,
'source:invalid|some/file' = > 'source:invalid|some/file' ,
}
@project = Project . find ( 1 )
to_test . each { | text , result | assert_equal " <p> #{ result } </p> " , textilizable ( text ) , " #{ text } failed " }
end
def test_cross_project_multiple_repositories_redmine_links
svn = Repository :: Subversion . create! ( :project_id = > 1 , :identifier = > 'svn1' , :url = > 'file:///foo/hg' )
Changeset . create! ( :repository = > svn , :committed_on = > Time . now , :revision = > '123' )
hg = Repository :: Mercurial . create! ( :project_id = > 1 , :identifier = > 'hg1' , :url = > '/foo/hg' )
Changeset . create! ( :repository = > hg , :committed_on = > Time . now , :revision = > '123' , :scmid = > 'abcd' )
2019-11-09 14:10:14 +00:00
changeset_link = link_to (
'ecookbook:r2' ,
{ :controller = > 'repositories' , :action = > 'revision' ,
:id = > 'ecookbook' , :repository_id = > 10 , :rev = > 2 } ,
:class = > 'changeset' ,
:title = > 'This commit fixes #1, #2 and references #1 & #3' )
svn_changeset_link = link_to (
'ecookbook:svn1|r123' ,
{ :controller = > 'repositories' , :action = > 'revision' ,
:id = > 'ecookbook' , :repository_id = > 'svn1' , :rev = > 123 } ,
:class = > 'changeset' , :title = > '' )
hg_changeset_link = link_to (
'ecookbook:hg1|abcd' ,
{ :controller = > 'repositories' , :action = > 'revision' ,
:id = > 'ecookbook' , :repository_id = > 'hg1' , :rev = > 'abcd' } ,
:class = > 'changeset' , :title = > '' )
2012-01-22 14:23:10 +00:00
2019-11-09 02:20:09 +00:00
source_link = link_to ( 'ecookbook:source:some/file' ,
{ :controller = > 'repositories' , :action = > 'entry' ,
:id = > 'ecookbook' , :repository_id = > 10 ,
:path = > [ 'some' , 'file' ] } , :class = > 'source' )
hg_source_link = link_to ( 'ecookbook:source:hg1|some/file' ,
{ :controller = > 'repositories' , :action = > 'entry' ,
:id = > 'ecookbook' , :repository_id = > 'hg1' ,
:path = > [ 'some' , 'file' ] } , :class = > 'source' )
2012-01-22 14:23:10 +00:00
to_test = {
'ecookbook:r2' = > changeset_link ,
'ecookbook:svn1|r123' = > svn_changeset_link ,
'ecookbook:invalid|r123' = > 'ecookbook:invalid|r123' ,
'ecookbook:commit:hg1|abcd' = > hg_changeset_link ,
'ecookbook:commit:invalid|abcd' = > 'ecookbook:commit:invalid|abcd' ,
'invalid:commit:invalid|abcd' = > 'invalid:commit:invalid|abcd' ,
# source
'ecookbook:source:some/file' = > source_link ,
'ecookbook:source:hg1|some/file' = > hg_source_link ,
'ecookbook:source:invalid|some/file' = > 'ecookbook:source:invalid|some/file' ,
'invalid:source:invalid|some/file' = > 'invalid:source:invalid|some/file' ,
}
@project = Project . find ( 3 )
to_test . each { | text , result | assert_equal " <p> #{ result } </p> " , textilizable ( text ) , " #{ text } failed " }
end
2011-01-11 11:06:56 +00:00
def test_redmine_links_git_commit
2018-06-16 14:27:51 +00:00
@project = Project . find ( 3 )
r = Repository :: Git . create! ( :project = > @project , :url = > '/tmp/test/git' )
2019-11-09 14:10:27 +00:00
c = Changeset . create! (
:repository = > r ,
2018-06-16 14:27:51 +00:00
:committed_on = > Time . now ,
:revision = > 'abcd' ,
:scmid = > 'abcd' ,
:comments = > 'test commit' )
2011-01-11 11:06:56 +00:00
changeset_link = link_to ( 'abcd' ,
2019-11-09 14:10:27 +00:00
{
2011-01-11 15:23:42 +00:00
:controller = > 'repositories' ,
:action = > 'revision' ,
:id = > 'subproject1' ,
2018-06-16 14:27:51 +00:00
:repository_id = > r . id ,
2011-01-11 15:23:42 +00:00
:rev = > 'abcd' ,
2019-11-09 14:10:27 +00:00
} ,
:class = > 'changeset' , :title = > 'test commit' )
2011-01-11 11:06:56 +00:00
to_test = {
'commit:abcd' = > changeset_link ,
}
to_test . each { | text , result | assert_equal " <p> #{ result } </p> " , textilizable ( text ) }
end
# TODO: Bazaar commit id contains mail address, so it contains '@' and '_'.
2011-01-11 16:03:24 +00:00
def test_redmine_links_mercurial_commit
2018-06-16 14:27:51 +00:00
@project = Project . find ( 3 )
r = Repository :: Mercurial . create! ( :project = > @project , :url = > '/tmp/test' )
2019-11-09 14:10:40 +00:00
c = Changeset . create! (
:repository = > r ,
2018-06-16 14:27:51 +00:00
:committed_on = > Time . now ,
:revision = > '123' ,
:scmid = > 'abcd' ,
:comments = > 'test commit' )
2019-11-09 14:10:40 +00:00
changeset_link_rev = link_to (
'r123' ,
{
2011-01-11 16:03:24 +00:00
:controller = > 'repositories' ,
:action = > 'revision' ,
:id = > 'subproject1' ,
2018-06-16 14:27:51 +00:00
:repository_id = > r . id ,
2019-10-22 16:06:20 +00:00
:rev = > '123' ,
2019-11-09 14:10:40 +00:00
} ,
2011-01-11 16:03:24 +00:00
:class = > 'changeset' , :title = > 'test commit' )
2019-11-09 14:10:40 +00:00
changeset_link_commit = link_to (
'abcd' ,
{
2018-06-16 14:27:51 +00:00
:controller = > 'repositories' ,
:action = > 'revision' ,
:id = > 'subproject1' ,
:repository_id = > r . id ,
2019-10-22 16:06:20 +00:00
:rev = > 'abcd' ,
2019-11-09 14:10:40 +00:00
} ,
2011-01-11 16:03:24 +00:00
:class = > 'changeset' , :title = > 'test commit' )
to_test = {
'r123' = > changeset_link_rev ,
'commit:abcd' = > changeset_link_commit ,
}
to_test . each { | text , result | assert_equal " <p> #{ result } </p> " , textilizable ( text ) }
end
2010-03-14 08:33:53 +00:00
def test_attachment_links
2014-02-05 04:14:58 +00:00
text = 'attachment:error281.txt'
2018-07-09 14:29:38 +00:00
result = link_to ( " error281.txt " , " /attachments/1 " ,
2014-02-05 04:14:58 +00:00
:class = > " attachment " )
assert_equal " <p> #{ result } </p> " ,
textilizable ( text ,
:attachments = > Issue . find ( 3 ) . attachments ) ,
" #{ text } failed "
2010-03-14 08:33:53 +00:00
end
2011-05-18 02:46:50 +00:00
2013-01-15 21:08:27 +00:00
def test_attachment_link_should_link_to_latest_attachment
a1 = Attachment . generate! ( :filename = > " test.txt " , :created_on = > 1 . hour . ago )
a2 = Attachment . generate! ( :filename = > " test.txt " )
2018-07-09 14:29:38 +00:00
result = link_to ( " test.txt " , " /attachments/ #{ a2 . id } " ,
2014-02-05 04:14:43 +00:00
:class = > " attachment " )
assert_equal " <p> #{ result } </p> " ,
textilizable ( 'attachment:test.txt' , :attachments = > [ a1 , a2 ] )
2013-01-15 21:08:27 +00:00
end
2018-06-17 05:57:39 +00:00
def test_attachment_links_to_images_with_email_format_should_not_be_parsed
attachment = Attachment . generate! ( :filename = > 'image@2x.png' )
with_settings :text_formatting = > 'textile' do
raw = " attachment:image@2x.png should not be parsed in image@2x.png "
2019-11-09 17:09:51 +00:00
assert_match (
%r{ <p><a class="attachment" href="/attachments/ #{ attachment . id } ">image@2x.png</a> should not be parsed in image@2x.png</p> } ,
textilizable ( raw , :attachments = > [ attachment ] ) )
2018-06-17 05:57:39 +00:00
end
with_settings :text_formatting = > 'markdown' do
raw = " attachment:image@2x.png should not be parsed in image@2x.png "
2019-11-09 17:09:51 +00:00
assert_match (
%r{ <p><a class="attachment" href="/attachments/ #{ attachment . id } ">image@2x.png</a> should not be parsed in image@2x.png</p> } ,
textilizable ( raw , :attachments = > [ attachment ] ) )
2018-06-17 05:57:39 +00:00
end
end
2008-01-15 18:12:12 +00:00
def test_wiki_links
2017-01-29 07:49:38 +00:00
User . current = User . find_by_login ( 'jsmith' )
2013-05-18 23:06:53 +00:00
russian_eacape = CGI . escape ( @russian_test )
2008-01-15 18:12:12 +00:00
to_test = {
2014-02-13 06:29:34 +00:00
'[[CookBook documentation]]' = >
link_to ( " CookBook documentation " ,
" /projects/ecookbook/wiki/CookBook_documentation " ,
:class = > " wiki-page " ) ,
'[[Another page|Page]]' = >
link_to ( " Page " ,
" /projects/ecookbook/wiki/Another_page " ,
:class = > " wiki-page " ) ,
2011-10-29 11:45:59 +00:00
# title content should be formatted
2014-02-13 06:29:34 +00:00
'[[Another page|With _styled_ *title*]]' = >
link_to ( " With <em>styled</em> <strong>title</strong> " . html_safe ,
" /projects/ecookbook/wiki/Another_page " ,
:class = > " wiki-page " ) ,
'[[Another page|With title containing <strong>HTML entities & markups</strong>]]' = >
link_to ( " With title containing <strong>HTML entities & markups</strong> " . html_safe ,
" /projects/ecookbook/wiki/Another_page " ,
:class = > " wiki-page " ) ,
2008-07-28 17:20:31 +00:00
# link with anchor
2014-02-13 06:29:34 +00:00
'[[CookBook documentation#One-section]]' = >
link_to ( " CookBook documentation " ,
" /projects/ecookbook/wiki/CookBook_documentation # One-section " ,
:class = > " wiki-page " ) ,
'[[Another page#anchor|Page]]' = >
link_to ( " Page " ,
" /projects/ecookbook/wiki/Another_page # anchor " ,
:class = > " wiki-page " ) ,
2012-08-13 19:36:00 +00:00
# UTF8 anchor
2013-05-18 23:06:53 +00:00
" [[Another_page # #{ @russian_test } | #{ @russian_test } ]] " = >
2014-02-13 06:29:34 +00:00
link_to ( @russian_test ,
" /projects/ecookbook/wiki/Another_page # #{ russian_eacape } " ,
:class = > " wiki-page " ) ,
2018-05-20 23:56:33 +00:00
# link to anchor
'[[#anchor]]' = >
link_to ( " # anchor " ,
" # anchor " ,
:class = > " wiki-page " ) ,
'[[#anchor|One-section]]' = >
link_to ( " One-section " ,
" # anchor " ,
:class = > " wiki-page " ) ,
2008-01-15 18:12:12 +00:00
# page that doesn't exist
2014-02-13 06:29:34 +00:00
'[[Unknown page]]' = >
link_to ( " Unknown page " ,
" /projects/ecookbook/wiki/Unknown_page " ,
:class = > " wiki-page new " ) ,
'[[Unknown page|404]]' = >
link_to ( " 404 " ,
" /projects/ecookbook/wiki/Unknown_page " ,
:class = > " wiki-page new " ) ,
2008-01-15 18:12:12 +00:00
# link to another project wiki
2014-02-13 06:29:34 +00:00
'[[onlinestore:]]' = >
link_to ( " onlinestore " ,
" /projects/onlinestore/wiki " ,
:class = > " wiki-page " ) ,
'[[onlinestore:|Wiki]]' = >
link_to ( " Wiki " ,
" /projects/onlinestore/wiki " ,
:class = > " wiki-page " ) ,
'[[onlinestore:Start page]]' = >
link_to ( " Start page " ,
" /projects/onlinestore/wiki/Start_page " ,
:class = > " wiki-page " ) ,
'[[onlinestore:Start page|Text]]' = >
link_to ( " Text " ,
" /projects/onlinestore/wiki/Start_page " ,
:class = > " wiki-page " ) ,
'[[onlinestore:Unknown page]]' = >
link_to ( " Unknown page " ,
" /projects/onlinestore/wiki/Unknown_page " ,
:class = > " wiki-page new " ) ,
2014-04-16 00:20:15 +00:00
# struck through link
2014-02-13 06:29:34 +00:00
'-[[Another page|Page]]-' = >
" <del> " . html_safe +
link_to ( " Page " ,
" /projects/ecookbook/wiki/Another_page " ,
:class = > " wiki-page " ) . html_safe +
" </del> " . html_safe ,
'-[[Another page|Page]] link-' = >
" <del> " . html_safe +
link_to ( " Page " ,
" /projects/ecookbook/wiki/Another_page " ,
:class = > " wiki-page " ) . html_safe +
" link</del> " . html_safe ,
2008-01-15 18:12:12 +00:00
# escaping
'![[Another page|Page]]' = > '[[Another page|Page]]' ,
2009-02-10 22:54:22 +00:00
# project does not exist
'[[unknowproject:Start]]' = > '[[unknowproject:Start]]' ,
'[[unknowproject:Start|Page title]]' = > '[[unknowproject:Start|Page title]]' ,
2017-01-29 07:49:38 +00:00
# missing permission to view wiki in project
'[[private-child:]]' = > '[[private-child:]]' ,
'[[private-child:Wiki]]' = > '[[private-child:Wiki]]' ,
2007-09-02 20:41:47 +00:00
}
@project = Project . find ( 1 )
to_test . each { | text , result | assert_equal " <p> #{ result } </p> " , textilizable ( text ) }
end
2011-05-18 02:46:50 +00:00
2018-09-15 09:11:13 +00:00
def test_wiki_links_with_special_characters_should_work_in_textile
to_test = wiki_links_with_special_characters
@project = Project . find ( 1 )
with_settings :text_formatting = > 'textile' do
to_test . each { | text , result | assert_equal " <p> #{ result } </p> " , textilizable ( text ) }
end
end
def test_wiki_links_with_special_characters_should_work_in_markdown
to_test = wiki_links_with_special_characters
@project = Project . find ( 1 )
with_settings :text_formatting = > 'markdown' do
to_test . each { | text , result | assert_equal " <p> #{ result } </p> " , textilizable ( text ) . strip }
end
end
2019-02-27 23:44:16 +00:00
def test_wiki_links_with_square_brackets_in_project_name
User . current = User . find_by_login ( 'jsmith' )
another_project = Project . find ( 1 ) # eCookbook
another_project . name = " [foo] #{ another_project . name } "
another_project . save
page = another_project . wiki . find_page ( 'Another page' )
page . title = " [bar] #{ page . title } "
page . save
to_test = {
'[[[foo]eCookbook:]]' = >
link_to ( " [foo]eCookbook " ,
" /projects/ecookbook/wiki " ,
:class = > " wiki-page " ) ,
'[[[foo]eCookbook:CookBook documentation]]' = >
link_to ( " CookBook documentation " ,
" /projects/ecookbook/wiki/CookBook_documentation " ,
:class = > " wiki-page " ) ,
'[[[foo]eCookbook:[bar]Another page]]' = >
link_to ( " [bar]Another page " ,
" /projects/ecookbook/wiki/%5Bbar%5DAnother_page " ,
:class = > " wiki-page " ) ,
'[[[foo]eCookbook:Unknown page]]' = >
link_to ( " Unknown page " ,
" /projects/ecookbook/wiki/Unknown_page " ,
:class = > " wiki-page new " ) ,
'[[[foo]eCookbook:[baz]Unknown page]]' = >
link_to ( " [baz]Unknown page " ,
" /projects/ecookbook/wiki/%5Bbaz%5DUnknown_page " ,
:class = > " wiki-page new " ) ,
}
@project = Project . find ( 2 ) # OnlineStore
with_settings :text_formatting = > 'textile' do
to_test . each { | text , result | assert_equal " <p> #{ result } </p> " , textilizable ( text ) }
end
with_settings :text_formatting = > 'markdown' do
to_test . each { | text , result | assert_equal " <p> #{ result } </p> " , textilizable ( text ) . strip }
end
end
2018-09-15 09:11:13 +00:00
2011-10-02 15:32:34 +00:00
def test_wiki_links_within_local_file_generation_context
to_test = {
# link to a page
2014-02-04 07:50:20 +00:00
'[[CookBook documentation]]' = >
link_to ( " CookBook documentation " , " CookBook_documentation.html " ,
:class = > " wiki-page " ) ,
'[[CookBook documentation|documentation]]' = >
link_to ( " documentation " , " CookBook_documentation.html " ,
:class = > " wiki-page " ) ,
'[[CookBook documentation#One-section]]' = >
link_to ( " CookBook documentation " , " CookBook_documentation.html # One-section " ,
:class = > " wiki-page " ) ,
'[[CookBook documentation#One-section|documentation]]' = >
link_to ( " documentation " , " CookBook_documentation.html # One-section " ,
:class = > " wiki-page " ) ,
2011-10-02 15:32:34 +00:00
# page that doesn't exist
2014-02-04 07:50:20 +00:00
'[[Unknown page]]' = >
link_to ( " Unknown page " , " Unknown_page.html " ,
:class = > " wiki-page new " ) ,
'[[Unknown page|404]]' = >
link_to ( " 404 " , " Unknown_page.html " ,
:class = > " wiki-page new " ) ,
'[[Unknown page#anchor]]' = >
link_to ( " Unknown page " , " Unknown_page.html # anchor " ,
:class = > " wiki-page new " ) ,
'[[Unknown page#anchor|404]]' = >
link_to ( " 404 " , " Unknown_page.html # anchor " ,
:class = > " wiki-page new " ) ,
2011-10-02 15:32:34 +00:00
}
@project = Project . find ( 1 )
2014-02-04 07:50:20 +00:00
to_test . each do | text , result |
assert_equal " <p> #{ result } </p> " , textilizable ( text , :wiki_links = > :local )
end
2011-10-02 15:32:34 +00:00
end
2011-12-17 11:23:26 +00:00
def test_wiki_links_within_wiki_page_context
2019-11-23 14:28:36 +00:00
page = WikiPage . find_by_title ( 'Another_page' )
2011-12-17 11:23:26 +00:00
to_test = {
2014-02-06 04:45:54 +00:00
'[[CookBook documentation]]' = >
link_to ( " CookBook documentation " ,
" /projects/ecookbook/wiki/CookBook_documentation " ,
:class = > " wiki-page " ) ,
'[[CookBook documentation|documentation]]' = >
link_to ( " documentation " ,
" /projects/ecookbook/wiki/CookBook_documentation " ,
:class = > " wiki-page " ) ,
'[[CookBook documentation#One-section]]' = >
link_to ( " CookBook documentation " ,
" /projects/ecookbook/wiki/CookBook_documentation # One-section " ,
:class = > " wiki-page " ) ,
'[[CookBook documentation#One-section|documentation]]' = >
link_to ( " documentation " ,
" /projects/ecookbook/wiki/CookBook_documentation # One-section " ,
:class = > " wiki-page " ) ,
2011-12-17 11:23:26 +00:00
# link to the current page
2014-02-06 04:45:54 +00:00
'[[Another page]]' = >
link_to ( " Another page " ,
" /projects/ecookbook/wiki/Another_page " ,
:class = > " wiki-page " ) ,
'[[Another page|Page]]' = >
link_to ( " Page " ,
" /projects/ecookbook/wiki/Another_page " ,
:class = > " wiki-page " ) ,
'[[Another page#anchor]]' = >
link_to ( " Another page " ,
" # anchor " ,
:class = > " wiki-page " ) ,
'[[Another page#anchor|Page]]' = >
link_to ( " Page " ,
" # anchor " ,
:class = > " wiki-page " ) ,
2011-12-17 11:23:26 +00:00
# page that doesn't exist
2014-02-06 04:45:54 +00:00
'[[Unknown page]]' = >
link_to ( " Unknown page " ,
" /projects/ecookbook/wiki/Unknown_page?parent=Another_page " ,
:class = > " wiki-page new " ) ,
'[[Unknown page|404]]' = >
link_to ( " 404 " ,
" /projects/ecookbook/wiki/Unknown_page?parent=Another_page " ,
:class = > " wiki-page new " ) ,
'[[Unknown page#anchor]]' = >
link_to ( " Unknown page " ,
" /projects/ecookbook/wiki/Unknown_page?parent=Another_page # anchor " ,
:class = > " wiki-page new " ) ,
'[[Unknown page#anchor|404]]' = >
link_to ( " 404 " ,
" /projects/ecookbook/wiki/Unknown_page?parent=Another_page # anchor " ,
:class = > " wiki-page new " ) ,
2011-12-17 11:23:26 +00:00
}
@project = Project . find ( 1 )
2014-02-06 04:45:54 +00:00
to_test . each do | text , result |
assert_equal " <p> #{ result } </p> " ,
2019-11-23 14:28:36 +00:00
textilizable ( WikiContent . new ( :text = > text , :page = > page ) , :text )
2014-02-07 12:12:09 +00:00
end
2011-12-17 11:23:26 +00:00
end
def test_wiki_links_anchor_option_should_prepend_page_title_to_href
to_test = {
# link to a page
2014-02-05 08:56:35 +00:00
'[[CookBook documentation]]' = >
link_to ( " CookBook documentation " ,
" # CookBook_documentation " ,
:class = > " wiki-page " ) ,
'[[CookBook documentation|documentation]]' = >
link_to ( " documentation " ,
" # CookBook_documentation " ,
:class = > " wiki-page " ) ,
'[[CookBook documentation#One-section]]' = >
link_to ( " CookBook documentation " ,
" # CookBook_documentation_One-section " ,
:class = > " wiki-page " ) ,
'[[CookBook documentation#One-section|documentation]]' = >
link_to ( " documentation " ,
" # CookBook_documentation_One-section " ,
:class = > " wiki-page " ) ,
2011-12-17 11:23:26 +00:00
# page that doesn't exist
2014-02-05 08:56:35 +00:00
'[[Unknown page]]' = >
link_to ( " Unknown page " ,
" # Unknown_page " ,
:class = > " wiki-page new " ) ,
'[[Unknown page|404]]' = >
link_to ( " 404 " ,
" # Unknown_page " ,
:class = > " wiki-page new " ) ,
'[[Unknown page#anchor]]' = >
link_to ( " Unknown page " ,
" # Unknown_page_anchor " ,
:class = > " wiki-page new " ) ,
'[[Unknown page#anchor|404]]' = >
link_to ( " 404 " ,
" # Unknown_page_anchor " ,
:class = > " wiki-page new " ) ,
2011-12-17 11:23:26 +00:00
}
@project = Project . find ( 1 )
2014-02-05 08:56:35 +00:00
to_test . each do | text , result |
assert_equal " <p> #{ result } </p> " , textilizable ( text , :wiki_links = > :anchor )
end
2011-12-17 11:23:26 +00:00
end
2008-03-17 23:01:35 +00:00
def test_html_tags
to_test = {
2008-04-13 12:45:17 +00: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-17 23:01:35 +00: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 15:16:17 +00:00
" HTML comment: <!-- no comments --> " = > " <p>HTML comment: <!-- no comments --></p> " ,
2008-10-12 19:13:36 +00:00
" <!-- opening comment " = > " <p><!-- opening comment</p> " ,
2017-04-06 16:41:52 +00:00
# remove attributes including class
" <pre class='foo'>some text</pre> " = > " <pre>some text</pre> " ,
'<pre class="foo">some text</pre>' = > '<pre>some text</pre>' ,
" <pre class='foo bar'>some text</pre> " = > " <pre>some text</pre> " ,
'<pre class="foo bar">some text</pre>' = > '<pre>some text</pre>' ,
2008-11-08 15:18:02 +00:00
" <pre onmouseover='alert(1)'>some text</pre> " = > " <pre>some text</pre> " ,
2010-12-18 17:21:57 +00: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-17 23:01:35 +00:00
}
to_test . each { | text , result | assert_equal result , textilizable ( text ) }
2008-03-21 17:39:02 +00:00
end
2011-05-18 02:46:50 +00:00
2008-06-08 20:31:36 +00: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 17:03:51 +00:00
" <notextile>this is <tag>a tag</tag></notextile> " = > " this is <tag>a tag</tag> "
2008-06-08 20:31:36 +00:00
}
to_test . each { | text , result | assert_equal result , textilizable ( text ) }
end
2011-05-18 02:46:50 +00:00
2009-11-11 16:23:11 +00:00
def test_pre_tags
2019-10-22 11:40:23 +00:00
raw = << ~ RAW
Before
2009-11-11 16:23:11 +00:00
2019-10-22 11:40:23 +00:00
< pre >
< prepared - statement - cache - size > 32 < / prepared-statement-cache-size>
< / pre>
2011-05-18 02:46:50 +00:00
2019-10-22 11:40:23 +00:00
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
2009-11-11 16:23:11 +00:00
assert_equal expected . gsub ( %r{ [ \ r \ n \ t] } , '' ) , textilizable ( raw ) . gsub ( %r{ [ \ r \ n \ t] } , '' )
end
2011-05-18 02:46:50 +00:00
2010-03-15 19:54:50 +00:00
def test_pre_content_should_not_parse_wiki_and_redmine_links
2019-10-22 11:40:36 +00:00
raw = << ~ RAW
[ [ CookBook documentation ] ]
2010-03-15 19:54:50 +00:00
2019-10-22 11:40:36 +00:00
#1
2015-04-14 05:38:26 +00:00
2019-10-22 11:40:36 +00:00
< pre >
[ [ CookBook documentation ] ]
2010-03-15 19:54:50 +00:00
2019-10-22 11:40:36 +00:00
#1
< / pre>
RAW
2014-02-06 01:30:45 +00:00
result1 = link_to ( " CookBook documentation " ,
" /projects/ecookbook/wiki/CookBook_documentation " ,
:class = > " wiki-page " )
result2 = link_to ( '#1' ,
" /issues/1 " ,
:class = > Issue . find ( 1 ) . css_classes ,
2015-09-21 20:42:06 +00:00
:title = > " Bug: Cannot print recipes (New) " )
2019-10-22 11:40:36 +00:00
expected = << ~ EXPECTED
< p > #{result1}</p>
< p > #{result2}</p>
< pre >
[ [ CookBook documentation ] ]
2014-02-06 01:30:45 +00:00
2019-10-22 11:40:36 +00:00
#1
< / pre>
EXPECTED
2010-03-15 19:54:50 +00:00
@project = Project . find ( 1 )
assert_equal expected . gsub ( %r{ [ \ r \ n \ t] } , '' ) , textilizable ( raw ) . gsub ( %r{ [ \ r \ n \ t] } , '' )
end
2011-05-18 02:46:50 +00:00
2010-03-15 19:57:35 +00:00
def test_non_closing_pre_blocks_should_be_closed
2019-10-22 11:40:47 +00:00
raw = << ~ RAW
< pre > < code >
RAW
expected = << ~ EXPECTED
< pre > < code >
< / code>< / pre >
EXPECTED
2010-03-15 19:57:35 +00:00
@project = Project . find ( 1 )
assert_equal expected . gsub ( %r{ [ \ r \ n \ t] } , '' ) , textilizable ( raw ) . gsub ( %r{ [ \ r \ n \ t] } , '' )
end
2011-05-18 02:46:50 +00:00
2015-10-15 18:31:34 +00:00
def test_unbalanced_closing_pre_tag_should_not_error
assert_nothing_raised do
textilizable ( " unbalanced</pre> " )
end
end
2009-09-03 01:03:10 +00:00
def test_syntax_highlight
2019-10-22 11:40:58 +00:00
raw = << ~ RAW
< pre > < code class = " ECMA_script " >
/ * Hello * /
document . write ( " Hello World! " ) ;
< / code>< / pre >
RAW
expected = << ~ EXPECTED
< pre > < code class = " ECMA_script syntaxhl " > < span class = " cm " > / * Hello * / < / span><span class="nb">document< /s pan > < span class = " p " > . < / span><span class="nx">write< /s pan > < span class = " p " > ( < / span><span class="dl">"< /s pan > < span class = " s2 " > Hello World ! < / span><span class="dl">"< /s pan > < span class = " p " > ) ; < / span>< / code > < / pre>
EXPECTED
2008-11-08 15:18:02 +00:00
assert_equal expected . gsub ( %r{ [ \ r \ n \ t] } , '' ) , textilizable ( raw ) . gsub ( %r{ [ \ r \ n \ t] } , '' )
end
2011-05-18 02:46:50 +00:00
2018-09-29 06:57:40 +00:00
def test_syntax_highlight_ampersand_in_textile
2019-10-22 11:40:12 +00:00
raw = << ~ RAW
< pre > < code class = " ruby " >
x = a & b
< / code>< / pre >
RAW
expected = << ~ EXPECTED
< pre > < code class = \ " ruby syntaxhl \" ><span class= \" n \" >x</span> <span class= \" o \" >=</span> <span class= \" n \" >a</span> <span class= \" o \" >&</span> <span class= \" n \" >b</span></code></pre>
EXPECTED
2018-09-29 06:57:40 +00:00
with_settings :text_formatting = > 'textile' do
assert_equal expected . gsub ( %r{ [ \ r \ n \ t] } , '' ) , textilizable ( raw ) . gsub ( %r{ [ \ r \ n \ t] } , '' )
end
end
2019-02-03 22:34:08 +00:00
def test_syntax_highlight_should_normalize_line_endings
assert_equal " line 1 \n line 2 \n " , syntax_highlight ( " test.txt " , " line 1 \r line 2 \r \n " )
end
2012-05-02 13:19:16 +00:00
def test_to_path_param
assert_equal 'test1/test2' , to_path_param ( 'test1/test2' )
assert_equal 'test1/test2' , to_path_param ( '/test1/test2/' )
assert_equal 'test1/test2' , to_path_param ( '//test1/test2/' )
2016-12-11 15:26:41 +00:00
assert_nil to_path_param ( '/' )
2012-05-02 13:19:16 +00:00
end
2008-03-21 17:39:02 +00:00
def test_wiki_links_in_tables
2014-02-05 04:14:27 +00:00
text = " |[[Page|Link title]]|[[Other Page|Other title]]| \n |Cell 21|[[Last page]]| "
link1 = link_to ( " Link title " , " /projects/ecookbook/wiki/Page " , :class = > " wiki-page new " )
link2 = link_to ( " Other title " , " /projects/ecookbook/wiki/Other_Page " , :class = > " wiki-page new " )
link3 = link_to ( " Last page " , " /projects/ecookbook/wiki/Last_page " , :class = > " wiki-page new " )
result = " <tr><td> #{ link1 } </td> " +
" <td> #{ link2 } </td> " +
" </tr><tr><td>Cell 21</td><td> #{ link3 } </td></tr> "
2008-03-21 17:39:02 +00:00
@project = Project . find ( 1 )
2014-02-05 04:14:27 +00:00
assert_equal " <table> #{ result } </table> " , textilizable ( text ) . gsub ( / [ \ t \ n] / , '' )
2008-03-17 23:01:35 +00:00
end
2011-05-18 02:46:50 +00:00
2008-05-18 08:24:31 +00:00
def test_text_formatting
to_test = { '*_+bold, italic and underline+_*' = > '<strong><em><ins>bold, italic and underline</ins></em></strong>' ,
2008-12-28 10:12:09 +00: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 08:24:31 +00:00
}
to_test . each { | text , result | assert_equal " <p> #{ result } </p> " , textilizable ( text ) }
end
2011-05-18 02:46:50 +00:00
2008-05-01 08:44:40 +00:00
def test_wiki_horizontal_rule
assert_equal '<hr />' , textilizable ( '---' )
assert_equal '<p>Dashes: ---</p>' , textilizable ( 'Dashes: ---' )
end
2011-05-18 02:46:50 +00:00
2011-03-14 22:01:43 +00:00
def test_headings
raw = 'h1. Some heading'
expected = %|<a name="Some-heading"></a>\n<h1 >Some heading<a href="#Some-heading" class="wiki-anchor">¶</a></h1>|
2011-05-18 02:46:50 +00:00
2011-03-14 22:01:43 +00:00
assert_equal expected , textilizable ( raw )
end
2011-05-18 02:46:50 +00:00
2011-10-02 17:25:29 +00:00
def test_headings_with_special_chars
# This test makes sure that the generated anchor names match the expected
# ones even if the heading text contains unconventional characters
raw = 'h1. Some heading related to version 0.5'
anchor = sanitize_anchor_name ( " Some-heading-related-to-version-0.5 " )
expected = %|<a name="#{anchor}"></a>\n<h1 >Some heading related to version 0.5<a href="##{anchor}" class="wiki-anchor">¶</a></h1>|
assert_equal expected , textilizable ( raw )
end
2011-10-02 15:57:17 +00:00
def test_headings_in_wiki_single_page_export_should_be_prepended_with_page_title
2019-11-23 14:28:36 +00:00
page = WikiPage . new ( :title = > 'Page Title' , :wiki_id = > 1 )
content = WikiContent . new ( :text = > 'h1. Some heading' , :page = > page )
2011-10-02 15:57:17 +00:00
expected = %|<a name="Page_Title_Some-heading"></a>\n<h1 >Some heading<a href="#Page_Title_Some-heading" class="wiki-anchor">¶</a></h1>|
2019-11-23 14:28:36 +00:00
assert_equal expected , textilizable ( content , :text , :wiki_links = > :anchor )
2011-10-02 15:57:17 +00:00
end
2008-06-15 11:00:40 +00:00
def test_table_of_content
2016-11-19 13:50:30 +00:00
set_language_if_valid 'en'
2019-10-22 11:39:49 +00:00
raw = << ~ RAW
{ { toc } }
2016-11-19 13:50:30 +00:00
2019-10-22 11:39:49 +00:00
h1 . Title
2008-06-15 11:00:40 +00:00
2019-10-22 11:39:49 +00:00
Lorem ipsum dolor sit amet , consectetuer adipiscing elit . Maecenas sed libero .
2008-06-15 11:00:40 +00:00
2019-10-22 11:39:49 +00:00
h2 . Subtitle with a [ [ Wiki ] ] link
2008-06-15 11:00:40 +00:00
2019-10-22 11:39:49 +00:00
Nullam commodo metus accumsan nulla . Curabitur lobortis dui id dolor .
2009-01-29 16:33:45 +00:00
2019-10-22 11:39:49 +00:00
h2 . Subtitle with [ [ Wiki | another Wiki ] ] link
2010-12-29 18:21:22 +00:00
2019-10-22 11:39:49 +00:00
h2 . Subtitle with %{ color:red } red text %
2010-12-29 18:21:22 +00:00
2019-10-22 11:39:49 +00:00
< pre >
some code
< / pre>
2008-06-15 11:00:40 +00:00
2019-10-22 11:39:49 +00:00
h3 . Subtitle with * some * _modifiers_
2012-02-11 10:02:24 +00:00
2019-10-22 11:39:49 +00:00
h3 . Subtitle with @inline code @
2008-06-15 11:00:40 +00:00
2019-10-22 11:39:49 +00:00
h1 . Another title
2010-06-24 02:35:24 +00:00
2019-10-22 11:39:49 +00:00
h3 . An " Internet link " :http :/ / www . redmine . org / inside subtitle
2010-06-24 02:35:24 +00:00
2019-10-22 11:39:49 +00:00
h2 . " Project Name !/attachments/1234/logo_small.gif! !/attachments/5678/logo_2.png! " :/ projects / projectname / issues
2008-06-15 11:00:40 +00:00
2019-10-22 11:39:49 +00:00
RAW
2010-11-06 18:52:07 +00:00
expected = '<ul class="toc">' +
2016-11-19 13:50:30 +00:00
'<li><strong>Table of contents</strong></li>' +
2010-11-06 18:52:07 +00:00
'<li><a href="#Title">Title</a>' +
'<ul>' +
2011-05-18 02:46:50 +00:00
'<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>' +
2010-11-06 18:52:07 +00:00
'<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>' +
2012-02-11 10:02:24 +00:00
'<li><a href="#Subtitle-with-inline-code">Subtitle with inline code</a></li>' +
2010-11-06 18:52:07 +00:00
'</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 10:23:07 +00:00
'</ul>'
2010-06-24 02:35:24 +00:00
2010-11-06 17:47:27 +00:00
@project = Project . find ( 1 )
2011-12-10 13:48:53 +00:00
assert textilizable ( raw ) . gsub ( " \n " , " " ) . include? ( expected )
2010-11-06 17:47:27 +00:00
end
2011-05-18 02:46:50 +00:00
2012-02-14 08:09:23 +00:00
def test_table_of_content_should_generate_unique_anchors
2016-11-19 13:50:30 +00:00
set_language_if_valid 'en'
2019-10-22 11:39:38 +00:00
raw = << ~ RAW
{ { toc } }
2016-11-19 13:50:30 +00:00
2019-10-22 11:39:38 +00:00
h1 . Title
2012-02-14 08:09:23 +00:00
2019-10-22 11:39:38 +00:00
h2 . Subtitle
2012-02-14 08:09:23 +00:00
2019-10-22 11:39:38 +00:00
h2 . Subtitle
RAW
2012-02-14 08:09:23 +00:00
expected = '<ul class="toc">' +
2016-11-19 13:50:30 +00:00
'<li><strong>Table of contents</strong></li>' +
2012-02-14 08:09:23 +00:00
'<li><a href="#Title">Title</a>' +
'<ul>' +
'<li><a href="#Subtitle">Subtitle</a></li>' +
2016-04-14 18:45:36 +00:00
'<li><a href="#Subtitle-2">Subtitle</a></li>' +
'</ul>' +
2012-02-14 08:09:23 +00:00
'</li>' +
2016-04-14 18:45:36 +00:00
'</ul>'
2012-02-14 08:09:23 +00:00
@project = Project . find ( 1 )
result = textilizable ( raw ) . gsub ( " \n " , " " )
assert_include expected , result
assert_include '<a name="Subtitle">' , result
assert_include '<a name="Subtitle-2">' , result
end
2010-11-06 17:47:27 +00:00
def test_table_of_content_should_contain_included_page_headings
2016-11-19 13:50:30 +00:00
set_language_if_valid 'en'
2019-10-22 11:39:26 +00:00
raw = << ~ RAW
{ { toc } }
2016-11-19 13:50:30 +00:00
2019-10-22 11:39:26 +00:00
h1 . Included
2010-11-06 17:47:27 +00:00
2019-10-22 11:39:26 +00:00
{ { include ( Child_1 ) } }
RAW
2010-11-06 17:47:27 +00:00
expected = '<ul class="toc">' +
2016-11-19 13:50:30 +00:00
'<li><strong>Table of contents</strong></li>' +
2010-11-06 18:52:07 +00:00
'<li><a href="#Included">Included</a></li>' +
2011-05-18 02:46:50 +00:00
'<li><a href="#Child-page-1">Child page 1</a></li>' +
2010-11-06 17:47:27 +00:00
'</ul>'
@project = Project . find ( 1 )
2008-07-27 10:23:07 +00:00
assert textilizable ( raw ) . gsub ( " \n " , " " ) . include? ( expected )
2008-06-15 11:00:40 +00:00
end
2011-05-18 02:46:50 +00:00
2014-03-21 01:35:21 +00:00
def test_toc_with_textile_formatting_should_be_parsed
with_settings :text_formatting = > 'textile' do
assert_select_in textilizable ( " {{toc}} \n \n h1. Heading " ) , 'ul.toc li' , :text = > 'Heading'
assert_select_in textilizable ( " {{<toc}} \n \n h1. Heading " ) , 'ul.toc.left li' , :text = > 'Heading'
assert_select_in textilizable ( " {{>toc}} \n \n h1. Heading " ) , 'ul.toc.right li' , :text = > 'Heading'
end
end
2014-03-21 04:07:56 +00:00
if Object . const_defined? ( :Redcarpet )
2014-03-21 01:35:21 +00:00
def test_toc_with_markdown_formatting_should_be_parsed
with_settings :text_formatting = > 'markdown' do
assert_select_in textilizable ( " {{toc}} \n \n # Heading " ) , 'ul.toc li' , :text = > 'Heading'
assert_select_in textilizable ( " {{<toc}} \n \n # Heading " ) , 'ul.toc.left li' , :text = > 'Heading'
assert_select_in textilizable ( " {{>toc}} \n \n # Heading " ) , 'ul.toc.right li' , :text = > 'Heading'
end
end
2014-03-21 04:07:56 +00:00
end
2014-03-21 01:35:21 +00:00
2012-02-11 10:02:24 +00:00
def test_section_edit_links
2019-10-22 11:39:14 +00:00
raw = << ~ RAW
h1 . Title
2012-02-11 10:02:24 +00:00
2019-10-22 11:39:14 +00:00
Lorem ipsum dolor sit amet , consectetuer adipiscing elit . Maecenas sed libero .
2012-02-11 10:02:24 +00:00
2019-10-22 11:39:14 +00:00
h2 . Subtitle with a [ [ Wiki ] ] link
2012-02-11 10:02:24 +00:00
2019-10-22 11:39:14 +00:00
h2 . Subtitle with * some * _modifiers_
2012-02-11 10:02:24 +00:00
2019-10-22 11:39:14 +00:00
h2 . Subtitle with @inline code @
2012-02-11 10:02:24 +00:00
2019-10-22 11:39:14 +00:00
< pre >
some code
2012-02-11 10:02:24 +00:00
2019-10-22 11:39:14 +00:00
h2 . heading inside pre
2012-02-11 10:02:24 +00:00
2019-10-22 11:39:14 +00:00
< h2 > html heading inside pre < / h2>
< / pre>
2012-02-11 10:02:24 +00:00
2019-10-22 11:39:14 +00:00
h2 . Subtitle after pre tag
RAW
2012-02-11 10:02:24 +00:00
@project = Project . find ( 1 )
set_language_if_valid 'en'
2019-11-09 02:20:09 +00:00
result = textilizable (
raw ,
:edit_section_links = >
{ :controller = > 'wiki' , :action = > 'edit' ,
:project_id = > '1' , :id = > 'Test' }
) . gsub ( " \n " , " " )
2012-02-11 10:02:24 +00:00
# heading that contains inline code
2019-11-09 18:16:15 +00:00
assert_match (
Regexp . new ( '<div class="contextual heading-2" title="Edit this section" id="section-4">' +
2016-03-20 09:34:26 +00:00
'<a class="icon-only icon-edit" href="/projects/1/wiki/Test/edit\?section=4">Edit this section</a></div>' +
2012-02-11 10:02:24 +00:00
'<a name="Subtitle-with-inline-code"></a>' +
'<h2 >Subtitle with <code>inline code</code><a href="#Subtitle-with-inline-code" class="wiki-anchor">¶</a></h2>' ) ,
2019-11-09 18:16:15 +00:00
result )
2012-02-11 10:02:24 +00:00
# last heading
2019-11-09 18:16:15 +00:00
assert_match (
Regexp . new ( '<div class="contextual heading-2" title="Edit this section" id="section-5">' +
2016-03-20 09:34:26 +00:00
'<a class="icon-only icon-edit" href="/projects/1/wiki/Test/edit\?section=5">Edit this section</a></div>' +
2012-02-11 10:02:24 +00:00
'<a name="Subtitle-after-pre-tag"></a>' +
'<h2 >Subtitle after pre tag<a href="#Subtitle-after-pre-tag" class="wiki-anchor">¶</a></h2>' ) ,
2019-11-09 18:16:15 +00:00
result )
2012-02-11 10:02:24 +00:00
end
2008-10-27 11:08:29 +00:00
def test_default_formatter
2011-12-18 10:41:45 +00:00
with_settings :text_formatting = > 'unknown' do
text = 'a *link*: http://www.example.net/'
2012-03-04 10:04:46 +00:00
assert_equal '<p>a *link*: <a class="external" href="http://www.example.net/">http://www.example.net/</a></p>' , textilizable ( text )
2011-12-18 10:41:45 +00:00
end
2008-10-27 11:08:29 +00:00
end
2011-05-18 02:46:50 +00:00
2017-07-16 18:02:38 +00:00
def test_textilizable_with_formatting_set_to_false_should_not_format_text
assert_equal '*text*' , textilizable ( " *text* " , :formatting = > false )
end
def test_textilizable_with_formatting_set_to_true_should_format_text
assert_equal '<p><strong>text</strong></p>' , textilizable ( " *text* " , :formatting = > true )
end
2015-10-31 09:36:13 +00:00
def test_parse_redmine_links_should_handle_a_tag_without_attributes
2019-03-21 03:27:53 +00:00
text = + '<a>http://example.com</a>'
2015-10-31 09:36:13 +00:00
expected = text . dup
parse_redmine_links ( text , nil , nil , nil , true , { } )
assert_equal expected , text
end
2008-09-20 14:07:52 +00: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 11:04:50 +00:00
Date . today + 100 = > 'Due in about 3 months' ,
2009-11-07 09:50:16 +00:00
Date . today + 20000 = > 'Due in over 54 years' ,
2008-09-20 14:07:52 +00:00
Date . today - 1 = > '1 day late' ,
2009-02-21 11:04:50 +00:00
Date . today - 100 = > 'about 3 months late' ,
2009-11-07 09:50:16 +00:00
Date . today - 20000 = > 'over 54 years late' ,
2008-09-20 14:07:52 +00:00
}
2011-01-10 17:55:57 +00:00
:: I18n . locale = :en
2008-09-20 14:07:52 +00:00
to_test . each do | date , expected |
assert_equal expected , due_date_distance_in_words ( date )
end
end
2019-05-09 15:17:30 +00:00
def test_render_page_hierarchy
parent_page = WikiPage . find ( 1 )
child_page = WikiPage . find_by ( parent_id : parent_page . id )
pages_by_parent_id = { nil = > [ parent_page ] , parent_page . id = > [ child_page ] }
result = render_page_hierarchy ( pages_by_parent_id , nil )
2019-11-09 02:20:09 +00:00
assert_select_in (
result , 'ul.pages-hierarchy li a[href=?]' ,
project_wiki_page_path ( project_id : parent_page . project ,
id : parent_page . title , version : nil ) )
assert_select_in (
result , 'ul.pages-hierarchy li ul.pages-hierarchy a[href=?]' ,
project_wiki_page_path ( project_id : child_page . project ,
id : child_page . title , version : nil ) )
2019-05-09 15:17:30 +00:00
end
def test_render_page_hierarchy_with_timestamp
parent_page = WikiPage . find ( 1 )
child_page = WikiPage . find_by ( parent_id : parent_page . id )
pages_by_parent_id = { nil = > [ parent_page ] , parent_page . id = > [ child_page ] }
result = render_page_hierarchy ( pages_by_parent_id , nil , :timestamp = > true )
2019-11-09 02:20:09 +00:00
assert_select_in (
result , 'ul.pages-hierarchy li a[title=?]' ,
l ( :label_updated_time ,
distance_of_time_in_words ( Time . now , parent_page . updated_on ) ) )
assert_select_in (
result , 'ul.pages-hierarchy li ul.pages-hierarchy a[title=?]' ,
l ( :label_updated_time ,
distance_of_time_in_words ( Time . now , child_page . updated_on ) ) )
2019-05-09 15:17:30 +00:00
end
def test_render_page_hierarchy_when_action_is_export
parent_page = WikiPage . find ( 1 )
child_page = WikiPage . find_by ( parent_id : parent_page . id )
pages_by_parent_id = { nil = > [ parent_page ] , parent_page . id = > [ child_page ] }
# Change controller and action using stub
controller . stubs ( :controller_name ) . returns ( 'wiki' )
controller . stubs ( :action_name ) . returns ( " export " )
result = render_page_hierarchy ( pages_by_parent_id , nil )
assert_select_in result , 'ul.pages-hierarchy li a[href=?]' , " # #{ parent_page . title } "
assert_select_in result , 'ul.pages-hierarchy li ul.pages-hierarchy a[href=?]' , " # #{ child_page . title } "
end
2011-05-18 02:46:50 +00:00
2009-11-11 10:48:54 +00:00
def test_link_to_user
user = User . find ( 2 )
2014-02-06 01:30:12 +00:00
result = link_to ( " John Smith " , " /users/2 " , :class = > " user active " )
assert_equal result , link_to_user ( user )
2009-11-11 10:48:54 +00:00
end
2011-05-18 02:46:50 +00:00
2009-11-11 10:48:54 +00:00
def test_link_to_user_should_not_link_to_locked_user
2012-10-18 17:08:42 +00:00
with_current_user nil do
user = User . find ( 5 )
assert user . locked?
assert_equal 'Dave2 Lopper2' , link_to_user ( user )
end
end
def test_link_to_user_should_link_to_locked_user_if_current_user_is_admin
with_current_user User . find ( 1 ) do
user = User . find ( 5 )
assert user . locked?
2014-02-06 01:30:29 +00:00
result = link_to ( " Dave2 Lopper2 " , " /users/5 " , :class = > " user locked " )
assert_equal result , link_to_user ( user )
2012-10-18 17:08:42 +00:00
end
2009-11-11 10:48:54 +00:00
end
2011-05-18 02:46:50 +00:00
2019-03-15 11:49:51 +00:00
def test_link_to_group_should_return_only_group_name_for_non_admin_users
User . current = nil
group = Group . find ( 10 )
assert_equal " A Team " , link_to_group ( group )
end
def test_link_to_group_should_link_to_group_edit_page_for_admin_users
User . current = User . find ( 1 )
group = Group . find ( 10 )
result = link_to ( " A Team " , " /groups/10/edit " )
assert_equal result , link_to_group ( group )
end
2009-11-11 10:48:54 +00:00
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 07:07:20 +00:00
2013-01-14 20:44:48 +00:00
def test_link_to_attachment
a = Attachment . find ( 3 )
2019-11-09 18:16:27 +00:00
assert_equal (
'<a href="/attachments/3">logo.gif</a>' ,
link_to_attachment ( a ) )
assert_equal (
'<a href="/attachments/3">Text</a>' ,
link_to_attachment ( a , :text = > 'Text' ) )
2018-07-09 14:29:38 +00:00
result = link_to ( " logo.gif " , " /attachments/3 " , :class = > " foo " )
2019-11-09 18:16:27 +00:00
assert_equal (
result ,
link_to_attachment ( a , :class = > 'foo' ) )
assert_equal (
'<a href="/attachments/download/3/logo.gif">logo.gif</a>' ,
link_to_attachment ( a , :download = > true ) )
assert_equal (
'<a href="http://test.host/attachments/3">logo.gif</a>' ,
link_to_attachment ( a , :only_path = > false ) )
2013-01-14 20:44:48 +00:00
end
2013-01-14 20:51:49 +00:00
def test_thumbnail_tag
a = Attachment . find ( 3 )
2019-11-09 18:16:38 +00:00
assert_select_in (
thumbnail_tag ( a ) ,
2018-06-02 03:53:11 +00:00
'a[href=?][title=?] img[src=?]' ,
2019-11-09 18:16:38 +00:00
" /attachments/3 " , " logo.gif " , " /attachments/thumbnail/3 " )
2013-01-14 20:51:49 +00:00
end
2010-08-08 07:07:20 +00: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="http://test.host/projects/ecookbook?jump=blah">eCookbook</a> ) ,
link_to_project ( project , { :only_path = > false , :jump = > 'blah' } )
end
2011-08-31 12:06:03 +00:00
2013-01-14 19:16:29 +00:00
def test_link_to_project_settings
project = Project . find ( 1 )
assert_equal '<a href="/projects/ecookbook/settings">eCookbook</a>' , link_to_project_settings ( project )
project . status = Project :: STATUS_CLOSED
assert_equal '<a href="/projects/ecookbook">eCookbook</a>' , link_to_project_settings ( project )
project . status = Project :: STATUS_ARCHIVED
assert_equal 'eCookbook' , link_to_project_settings ( project )
end
2012-02-06 14:44:40 +00:00
def test_link_to_legacy_project_with_numerical_identifier_should_use_id
# numeric identifier are no longer allowed
2014-01-07 13:26:13 +00:00
Project . where ( :id = > 1 ) . update_all ( :identifier = > 25 )
2012-02-06 14:44:40 +00:00
assert_equal '<a href="/projects/1">eCookbook</a>' ,
link_to_project ( Project . find ( 1 ) )
end
2018-07-08 00:27:58 +00:00
def test_link_to_record
[
[ custom_values ( :custom_values_007 ) , '<a href="/projects/ecookbook">eCookbook</a>' ] ,
[ documents ( :documents_001 ) , '<a href="/documents/1">Test document</a>' ] ,
[ Group . find ( 10 ) , '<a href="/groups/10">A Team</a>' ] ,
[ issues ( :issues_001 ) , link_to_issue ( issues ( :issues_001 ) , :subject = > false ) ] ,
[ messages ( :messages_001 ) , '<a href="/boards/1/topics/1">First post</a>' ] ,
[ news ( :news_001 ) , '<a href="/news/1">eCookbook first release !</a>' ] ,
[ projects ( :projects_001 ) , '<a href="/projects/ecookbook">eCookbook</a>' ] ,
[ users ( :users_001 ) , '<a class="user active" href="/users/1">Redmine Admin</a>' ] ,
[ versions ( :versions_001 ) , '<a title="07/01/2006" href="/versions/1">eCookbook - 0.1</a>' ] ,
[ wiki_pages ( :wiki_pages_001 ) , '<a href="/projects/ecookbook/wiki/CookBook_documentation">CookBook documentation</a>' ]
] . each do | record , link |
assert_equal link , link_to_record ( record )
end
end
def test_link_to_attachment_container
field = ProjectCustomField . generate! ( :name = > " File " , :field_format = > 'attachment' )
project = projects ( :projects_001 )
project_custom_value_attachment = new_record ( Attachment ) do
project . custom_field_values = { field . id = > { :file = > mock_file } }
project . save
end
news_attachment = attachments ( :attachments_004 )
news_attachment . container = news ( :news_001 )
news_attachment . save!
[
[ project_custom_value_attachment , '<a href="/projects/ecookbook">eCookbook</a>' ] ,
[ attachments ( :attachments_002 ) , '<a href="/documents/1">Test document</a>' ] ,
[ attachments ( :attachments_001 ) , link_to_issue ( issues ( :issues_003 ) , :subject = > false ) ] ,
[ attachments ( :attachments_013 ) , '<a href="/boards/1/topics/1">First post</a>' ] ,
[ news_attachment , '<a href="/news/1">eCookbook first release !</a>' ] ,
[ attachments ( :attachments_008 ) , '<a href="/projects/ecookbook/files">Files</a>' ] ,
[ attachments ( :attachments_009 ) , '<a href="/projects/ecookbook/files">Files</a>' ] ,
[ attachments ( :attachments_003 ) , '<a href="/projects/ecookbook/wiki/Page_with_an_inline_image">Page with an inline image</a>' ] ,
] . each do | attachment , link |
assert_equal link , link_to_attachment_container ( attachment . container )
end
end
2020-03-31 09:30:47 +00:00
def test_principals_check_box_tag_with_avatar
principals = [ User . find ( 1 ) , Group . find ( 10 ) ]
with_settings :gravatar_enabled = > '1' do
tags = principals_check_box_tags ( " watcher[user_ids][] " , principals )
principals . each do | principal |
assert_include avatar ( principal , :size = > 16 ) , tags
assert_not_include content_tag ( 'span' , nil , :class = > " name icon icon- #{ principal . class . name . downcase } " ) , tags
end
end
end
def test_principals_check_box_tag_without_avatar
principals = [ User . find ( 1 ) , Group . find ( 10 ) ]
Setting . gravatar_enabled = '1'
avatar_tags = principals . collect { | p | avatar ( p , :size = > 16 ) }
with_settings :gravatar_enabled = > '0' do
tags = principals_check_box_tags ( name , principals )
principals . each_with_index do | principal , i |
assert_not_include avatar_tags [ i ] , tags
assert_include content_tag ( 'span' , nil , :class = > " name icon icon- #{ principal . class . name . downcase } " ) , tags
end
end
end
2011-07-23 19:05:22 +00:00
def test_principals_options_for_select_with_users
2012-01-21 11:06:59 +00:00
User . current = nil
2011-07-23 19:05:22 +00:00
users = [ User . find ( 2 ) , User . find ( 4 ) ]
2019-11-09 18:16:50 +00:00
assert_equal (
%( <option value="2">John Smith</option><option value="4">Robert Hill</option> ) ,
principals_options_for_select ( users ) )
2011-07-23 19:05:22 +00:00
end
2011-08-31 12:06:03 +00:00
2011-07-23 19:05:22 +00:00
def test_principals_options_for_select_with_selected
2012-01-21 11:06:59 +00:00
User . current = nil
2011-07-23 19:05:22 +00:00
users = [ User . find ( 2 ) , User . find ( 4 ) ]
2019-11-09 18:17:01 +00:00
assert_equal (
%( <option value="2">John Smith</option><option value="4" selected="selected">Robert Hill</option> ) ,
principals_options_for_select ( users , User . find ( 4 ) ) )
2011-07-23 19:05:22 +00:00
end
2011-08-31 12:06:03 +00:00
2011-07-23 19:05:22 +00:00
def test_principals_options_for_select_with_users_and_groups
2012-01-21 11:06:59 +00:00
User . current = nil
2015-01-18 20:43:04 +00:00
set_language_if_valid 'en'
2011-07-23 19:05:22 +00:00
users = [ User . find ( 2 ) , Group . find ( 11 ) , User . find ( 4 ) , Group . find ( 10 ) ]
2019-11-09 18:17:12 +00:00
assert_equal (
%( <option value="2">John Smith</option><option value="4">Robert Hill</option> ) +
2011-07-23 19:05:22 +00:00
%( <optgroup label="Groups"><option value="10">A Team</option><option value="11">B Team</option></optgroup> ) ,
2019-11-09 18:17:12 +00:00
principals_options_for_select ( users ) )
2011-07-23 19:05:22 +00:00
end
2011-08-31 12:06:03 +00:00
2011-07-23 19:05:22 +00:00
def test_principals_options_for_select_with_empty_collection
assert_equal '' , principals_options_for_select ( [ ] )
end
2012-01-21 11:06:59 +00:00
def test_principals_options_for_select_should_include_me_option_when_current_user_is_in_collection
2015-01-18 20:43:04 +00:00
set_language_if_valid 'en'
2012-01-21 11:06:59 +00:00
users = [ User . find ( 2 ) , User . find ( 4 ) ]
User . current = User . find ( 4 )
2012-07-29 11:17:36 +00:00
assert_include '<option value="4"><< me >></option>' , principals_options_for_select ( users )
2012-01-21 11:06:59 +00:00
end
2012-04-28 09:10:46 +00:00
def test_stylesheet_link_tag_should_pick_the_default_stylesheet
assert_match 'href="/stylesheets/styles.css"' , stylesheet_link_tag ( " styles " )
end
def test_stylesheet_link_tag_for_plugin_should_pick_the_plugin_stylesheet
assert_match 'href="/plugin_assets/foo/stylesheets/styles.css"' , stylesheet_link_tag ( " styles " , :plugin = > :foo )
end
2012-04-28 09:18:12 +00:00
def test_image_tag_should_pick_the_default_image
assert_match 'src="/images/image.png"' , image_tag ( " image.png " )
end
2012-04-28 09:47:09 +00:00
def test_image_tag_should_pick_the_theme_image_if_it_exists
theme = Redmine :: Themes . themes . last
theme . images << 'image.png'
with_settings :ui_theme = > theme . id do
assert_match %|src="/themes/#{theme.dir}/images/image.png"| , image_tag ( " image.png " )
assert_match %|src="/images/other.png"| , image_tag ( " other.png " )
end
ensure
theme . images . delete 'image.png'
end
2012-04-28 09:18:12 +00:00
def test_image_tag_sfor_plugin_should_pick_the_plugin_image
assert_match 'src="/plugin_assets/foo/images/image.png"' , image_tag ( " image.png " , :plugin = > :foo )
end
2012-04-28 09:10:46 +00:00
def test_javascript_include_tag_should_pick_the_default_javascript
assert_match 'src="/javascripts/scripts.js"' , javascript_include_tag ( " scripts " )
end
def test_javascript_include_tag_for_plugin_should_pick_the_plugin_javascript
assert_match 'src="/plugin_assets/foo/javascripts/scripts.js"' , javascript_include_tag ( " scripts " , :plugin = > :foo )
end
2013-05-31 20:47:38 +00:00
def test_raw_json_should_escape_closing_tags
s = raw_json ( [ " <foo>bar</foo> " ] )
2014-10-22 17:37:16 +00:00
assert_include '\/foo' , s
2013-05-31 20:47:38 +00:00
end
def test_raw_json_should_be_html_safe
s = raw_json ( [ " foo " ] )
assert s . html_safe?
end
2013-07-28 11:21:58 +00:00
def test_html_title_should_app_title_if_not_set
assert_equal 'Redmine' , html_title
end
def test_html_title_should_join_items
html_title 'Foo' , 'Bar'
assert_equal 'Foo - Bar - Redmine' , html_title
end
def test_html_title_should_append_current_project_name
@project = Project . find ( 1 )
html_title 'Foo' , 'Bar'
assert_equal 'Foo - Bar - eCookbook - Redmine' , html_title
end
def test_title_should_return_a_h2_tag
assert_equal '<h2>Foo</h2>' , title ( 'Foo' )
end
def test_title_should_set_html_title
title ( 'Foo' )
assert_equal 'Foo - Redmine' , html_title
end
def test_title_should_turn_arrays_into_links
assert_equal '<h2><a href="/foo">Foo</a></h2>' , title ( [ 'Foo' , '/foo' ] )
assert_equal 'Foo - Redmine' , html_title
end
def test_title_should_join_items
assert_equal '<h2>Foo » Bar</h2>' , title ( 'Foo' , 'Bar' )
assert_equal 'Bar - Foo - Redmine' , html_title
end
2014-01-12 09:58:07 +00:00
def test_favicon_path
assert_match %r{ ^/favicon \ .ico } , favicon_path
end
def test_favicon_path_with_suburi
Redmine :: Utils . relative_url_root = '/foo'
assert_match %r{ ^/foo/favicon \ .ico } , favicon_path
ensure
Redmine :: Utils . relative_url_root = ''
end
def test_favicon_url
assert_match %r{ ^http://test \ .host/favicon \ .ico } , favicon_url
end
def test_favicon_url_with_suburi
Redmine :: Utils . relative_url_root = '/foo'
assert_match %r{ ^http://test \ .host/foo/favicon \ .ico } , favicon_url
ensure
Redmine :: Utils . relative_url_root = ''
end
2014-02-06 00:36:50 +00:00
def test_truncate_single_line
str = " 01234 "
2014-02-06 03:33:33 +00:00
result = truncate_single_line_raw ( " #{ str } \n #{ str } " , 10 )
2014-02-06 00:36:50 +00:00
assert_equal " 01234 0... " , result
assert ! result . html_safe?
2014-02-06 03:33:33 +00:00
result = truncate_single_line_raw ( " #{ str } <& # > \n #{ str } #{ str } " , 16 )
2014-02-06 01:29:56 +00:00
assert_equal " 01234<& # > 012... " , result
2014-02-06 00:36:50 +00:00
assert ! result . html_safe?
end
def test_truncate_single_line_non_ascii
2019-03-19 15:43:55 +00:00
ja = '日本語'
2014-02-06 03:33:33 +00:00
result = truncate_single_line_raw ( " #{ ja } \n #{ ja } \n #{ ja } " , 10 )
2014-02-06 00:36:50 +00:00
assert_equal " #{ ja } #{ ja } ... " , result
assert ! result . html_safe?
end
2016-06-15 19:04:36 +00:00
2016-11-18 12:42:20 +00:00
def test_hours_formatting
set_language_if_valid 'en'
with_settings :timespan_format = > 'minutes' do
assert_equal '0:45' , format_hours ( 0 . 75 )
assert_equal '0:45 h' , l_hours_short ( 0 . 75 )
assert_equal '0:45 hour' , l_hours ( 0 . 75 )
end
with_settings :timespan_format = > 'decimal' do
assert_equal '0.75' , format_hours ( 0 . 75 )
assert_equal '0.75 h' , l_hours_short ( 0 . 75 )
assert_equal '0.75 hour' , l_hours ( 0 . 75 )
end
end
def test_html_hours
assert_equal '<span class="hours hours-int">0</span><span class="hours hours-dec">:45</span>' , html_hours ( '0:45' )
assert_equal '<span class="hours hours-int">0</span><span class="hours hours-dec">.75</span>' , html_hours ( '0.75' )
end
2018-05-07 01:13:12 +00:00
2019-06-20 16:46:10 +00:00
def test_form_for_includes_name_attribute
assert_match ( / name="new_issue-[a-z0-9]{8}" / , form_for ( Issue . new ) { } )
end
def test_labelled_form_for_includes_name_attribute
assert_match ( / name="new_issue-[a-z0-9]{8}" / , labelled_form_for ( Issue . new ) { } )
end
2020-05-30 04:53:24 +00:00
def test_redner_if_exist_should_be_render_partial
controller . prepend_view_path " test/fixtures/views "
assert_equal " partial html \n " , render_if_exist ( :partial = > 'partial' )
end
def test_redner_if_exist_should_be_render_nil
controller . prepend_view_path " test/fixtures/views "
assert_nil render_if_exist ( :partial = > 'non_exist_partial' )
end
2018-09-15 09:11:13 +00:00
private
def wiki_links_with_special_characters
return {
'[[Jack & Coke]]' = >
link_to ( " Jack & Coke " ,
" /projects/ecookbook/wiki/Jack_&_Coke " ,
:class = > " wiki-page new " ) ,
'[[a "quoted" name]]' = >
link_to ( " a \" quoted \" name " ,
" /projects/ecookbook/wiki/A_%22quoted%22_name " ,
:class = > " wiki-page new " ) ,
'[[le français, c\'est super]]' = >
link_to ( " le français, c \' est super " ,
" /projects/ecookbook/wiki/Le_fran%C3%A7ais_c'est_super " ,
:class = > " wiki-page new " ) ,
'[[broken < less]]' = >
link_to ( " broken < less " ,
" /projects/ecookbook/wiki/Broken_%3C_less " ,
:class = > " wiki-page new " ) ,
'[[broken > more]]' = >
link_to ( " broken > more " ,
" /projects/ecookbook/wiki/Broken_%3E_more " ,
:class = > " wiki-page new " ) ,
2019-02-27 23:44:16 +00:00
'[[[foo]Including [square brackets] in wiki title]]' = >
link_to ( " [foo]Including [square brackets] in wiki title " ,
" /projects/ecookbook/wiki/%5Bfoo%5DIncluding_%5Bsquare_brackets%5D_in_wiki_title " ,
:class = > " wiki-page new " ) ,
2018-09-15 09:11:13 +00:00
}
end
2018-05-07 01:13:12 +00:00
def test_export_csv_encoding_select_tag_should_return_nil_when_general_csv_encoding_is_UTF8
with_locale 'az' do
assert_equal l ( :general_csv_encoding ) , 'UTF-8'
assert_nil export_csv_encoding_select_tag
end
end
def test_export_csv_encoding_select_tag_should_have_two_option_when_general_csv_encoding_is_not_UTF8
with_locale 'en' do
assert_not_equal l ( :general_csv_encoding ) , 'UTF-8'
result = export_csv_encoding_select_tag
assert_select_in result , " option[selected='selected'][value= #{ l ( :general_csv_encoding ) } ] " , :text = > l ( :general_csv_encoding )
assert_select_in result , " option[value='UTF-8'] " , :text = > 'UTF-8'
end
end
2007-09-02 20:41:47 +00:00
end