To check out this repository please hg clone the following URL, or open the URL using EasyMercurial or your preferred Mercurial client.
root / test / unit / helpers / .svn / text-base / application_helper_test.rb.svn-base @ 441:cbce1fd3b1b7
History | View | Annotate | Download (31.7 KB)
| 1 | 0:513646585e45 | Chris | # Redmine - project management software |
|---|---|---|---|
| 2 | 441:cbce1fd3b1b7 | Chris | # Copyright (C) 2006-2011 Jean-Philippe Lang |
| 3 | 0:513646585e45 | Chris | # |
| 4 | # This program is free software; you can redistribute it and/or |
||
| 5 | # modify it under the terms of the GNU General Public License |
||
| 6 | # as published by the Free Software Foundation; either version 2 |
||
| 7 | # of the License, or (at your option) any later version. |
||
| 8 | 441:cbce1fd3b1b7 | Chris | # |
| 9 | 0:513646585e45 | Chris | # This program is distributed in the hope that it will be useful, |
| 10 | # but WITHOUT ANY WARRANTY; without even the implied warranty of |
||
| 11 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||
| 12 | # GNU General Public License for more details. |
||
| 13 | 441:cbce1fd3b1b7 | Chris | # |
| 14 | 0:513646585e45 | Chris | # You should have received a copy of the GNU General Public License |
| 15 | # along with this program; if not, write to the Free Software |
||
| 16 | # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. |
||
| 17 | |||
| 18 | 119:8661b858af72 | Chris | require File.expand_path('../../../test_helper', __FILE__)
|
| 19 | 0:513646585e45 | Chris | |
| 20 | 22:40f7cfd4df19 | chris | class ApplicationHelperTest < ActionView::TestCase |
| 21 | 441:cbce1fd3b1b7 | Chris | |
| 22 | 0:513646585e45 | Chris | fixtures :projects, :roles, :enabled_modules, :users, |
| 23 | 441:cbce1fd3b1b7 | Chris | :repositories, :changesets, |
| 24 | 0:513646585e45 | Chris | :trackers, :issue_statuses, :issues, :versions, :documents, |
| 25 | :wikis, :wiki_pages, :wiki_contents, |
||
| 26 | :boards, :messages, |
||
| 27 | :attachments, |
||
| 28 | :enumerations |
||
| 29 | |||
| 30 | def setup |
||
| 31 | super |
||
| 32 | end |
||
| 33 | 22:40f7cfd4df19 | chris | |
| 34 | context "#link_to_if_authorized" do |
||
| 35 | context "authorized user" do |
||
| 36 | should "be tested" |
||
| 37 | end |
||
| 38 | 441:cbce1fd3b1b7 | Chris | |
| 39 | 22:40f7cfd4df19 | chris | context "unauthorized user" do |
| 40 | should "be tested" |
||
| 41 | end |
||
| 42 | 441:cbce1fd3b1b7 | Chris | |
| 43 | 22:40f7cfd4df19 | chris | should "allow using the :controller and :action for the target link" do |
| 44 | User.current = User.find_by_login('admin')
|
||
| 45 | |||
| 46 | @project = Issue.first.project # Used by helper |
||
| 47 | response = link_to_if_authorized("By controller/action",
|
||
| 48 | {:controller => 'issues', :action => 'edit', :id => Issue.first.id})
|
||
| 49 | assert_match /href/, response |
||
| 50 | end |
||
| 51 | 441:cbce1fd3b1b7 | Chris | |
| 52 | 22:40f7cfd4df19 | chris | end |
| 53 | 441:cbce1fd3b1b7 | Chris | |
| 54 | 0:513646585e45 | Chris | def test_auto_links |
| 55 | to_test = {
|
||
| 56 | 'http://foo.bar' => '<a class="external" href="http://foo.bar">http://foo.bar</a>', |
||
| 57 | 'http://foo.bar/~user' => '<a class="external" href="http://foo.bar/~user">http://foo.bar/~user</a>', |
||
| 58 | 'http://foo.bar.' => '<a class="external" href="http://foo.bar">http://foo.bar</a>.', |
||
| 59 | 'https://foo.bar.' => '<a class="external" href="https://foo.bar">https://foo.bar</a>.', |
||
| 60 | 'This is a link: http://foo.bar.' => 'This is a link: <a class="external" href="http://foo.bar">http://foo.bar</a>.', |
||
| 61 | 'A link (eg. http://foo.bar).' => 'A link (eg. <a class="external" href="http://foo.bar">http://foo.bar</a>).', |
||
| 62 | '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>.', |
||
| 63 | 'http://www.foo.bar/Test_(foobar)' => '<a class="external" href="http://www.foo.bar/Test_(foobar)">http://www.foo.bar/Test_(foobar)</a>', |
||
| 64 | '(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>)', |
||
| 65 | '(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>)', |
||
| 66 | '(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>).', |
||
| 67 | '(see "inline link":http://www.foo.bar/Test_(foobar))' => '(see <a href="http://www.foo.bar/Test_(foobar)" class="external">inline link</a>)', |
||
| 68 | '(see "inline link":http://www.foo.bar/Test)' => '(see <a href="http://www.foo.bar/Test" class="external">inline link</a>)', |
||
| 69 | '(see "inline link":http://www.foo.bar/Test).' => '(see <a href="http://www.foo.bar/Test" class="external">inline link</a>).', |
||
| 70 | 'www.foo.bar' => '<a class="external" href="http://www.foo.bar">www.foo.bar</a>', |
||
| 71 | '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>', |
||
| 72 | 'http://foo.bar/page#125' => '<a class="external" href="http://foo.bar/page#125">http://foo.bar/page#125</a>', |
||
| 73 | 'http://foo@www.bar.com' => '<a class="external" href="http://foo@www.bar.com">http://foo@www.bar.com</a>', |
||
| 74 | 'http://foo:bar@www.bar.com' => '<a class="external" href="http://foo:bar@www.bar.com">http://foo:bar@www.bar.com</a>', |
||
| 75 | 'ftp://foo.bar' => '<a class="external" href="ftp://foo.bar">ftp://foo.bar</a>', |
||
| 76 | 'ftps://foo.bar' => '<a class="external" href="ftps://foo.bar">ftps://foo.bar</a>', |
||
| 77 | 'sftp://foo.bar' => '<a class="external" href="sftp://foo.bar">sftp://foo.bar</a>', |
||
| 78 | # two exclamation marks |
||
| 79 | '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>', |
||
| 80 | # escaping |
||
| 81 | 'http://foo"bar' => '<a class="external" href="http://foo"bar">http://foo"bar</a>', |
||
| 82 | 37:94944d00e43c | chris | # wrap in angle brackets |
| 83 | '<http://foo.bar>' => '<<a class="external" href="http://foo.bar">http://foo.bar</a>>' |
||
| 84 | 0:513646585e45 | Chris | } |
| 85 | to_test.each { |text, result| assert_equal "<p>#{result}</p>", textilizable(text) }
|
||
| 86 | end |
||
| 87 | 441:cbce1fd3b1b7 | Chris | |
| 88 | 0:513646585e45 | Chris | def test_auto_mailto |
| 89 | 441:cbce1fd3b1b7 | Chris | assert_equal '<p><a class="email" href="mailto:test@foo.bar">test@foo.bar</a></p>', |
| 90 | 0:513646585e45 | Chris | textilizable('test@foo.bar')
|
| 91 | end |
||
| 92 | 441:cbce1fd3b1b7 | Chris | |
| 93 | 0:513646585e45 | Chris | def test_inline_images |
| 94 | to_test = {
|
||
| 95 | '!http://foo.bar/image.jpg!' => '<img src="http://foo.bar/image.jpg" alt="" />', |
||
| 96 | 'floating !>http://foo.bar/image.jpg!' => 'floating <div style="float:right"><img src="http://foo.bar/image.jpg" alt="" /></div>', |
||
| 97 | 'with class !(some-class)http://foo.bar/image.jpg!' => 'with class <img src="http://foo.bar/image.jpg" class="some-class" alt="" />', |
||
| 98 | # inline styles should be stripped |
||
| 99 | 'with style !{width:100px;height100px}http://foo.bar/image.jpg!' => 'with style <img src="http://foo.bar/image.jpg" alt="" />',
|
||
| 100 | '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" />', |
||
| 101 | '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"" />', |
||
| 102 | } |
||
| 103 | to_test.each { |text, result| assert_equal "<p>#{result}</p>", textilizable(text) }
|
||
| 104 | end |
||
| 105 | 441:cbce1fd3b1b7 | Chris | |
| 106 | 0:513646585e45 | Chris | def test_inline_images_inside_tags |
| 107 | raw = <<-RAW |
||
| 108 | h1. !foo.png! Heading |
||
| 109 | |||
| 110 | Centered image: |
||
| 111 | |||
| 112 | p=. !bar.gif! |
||
| 113 | RAW |
||
| 114 | |||
| 115 | assert textilizable(raw).include?('<img src="foo.png" alt="" />')
|
||
| 116 | assert textilizable(raw).include?('<img src="bar.gif" alt="" />')
|
||
| 117 | end |
||
| 118 | 441:cbce1fd3b1b7 | Chris | |
| 119 | 0:513646585e45 | Chris | def test_attached_images |
| 120 | to_test = {
|
||
| 121 | 'Inline image: !logo.gif!' => 'Inline image: <img src="/attachments/download/3" title="This is a logo" alt="This is a logo" />', |
||
| 122 | 'Inline image: !logo.GIF!' => 'Inline image: <img src="/attachments/download/3" title="This is a logo" alt="This is a logo" />', |
||
| 123 | 'No match: !ogo.gif!' => 'No match: <img src="ogo.gif" alt="" />', |
||
| 124 | 'No match: !ogo.GIF!' => 'No match: <img src="ogo.GIF" alt="" />', |
||
| 125 | # link image |
||
| 126 | '!logo.gif!:http://foo.bar/' => '<a href="http://foo.bar/"><img src="/attachments/download/3" title="This is a logo" alt="This is a logo" /></a>', |
||
| 127 | } |
||
| 128 | attachments = Attachment.find(:all) |
||
| 129 | to_test.each { |text, result| assert_equal "<p>#{result}</p>", textilizable(text, :attachments => attachments) }
|
||
| 130 | end |
||
| 131 | 441:cbce1fd3b1b7 | Chris | |
| 132 | 0:513646585e45 | Chris | def test_textile_external_links |
| 133 | to_test = {
|
||
| 134 | 'This is a "link":http://foo.bar' => 'This is a <a href="http://foo.bar" class="external">link</a>', |
||
| 135 | 'This is an intern "link":/foo/bar' => 'This is an intern <a href="/foo/bar">link</a>', |
||
| 136 | '"link (Link title)":http://foo.bar' => '<a href="http://foo.bar" title="Link title" class="external">link</a>', |
||
| 137 | '"link (Link title with "double-quotes")":http://foo.bar' => '<a href="http://foo.bar" title="Link title with "double-quotes"" class="external">link</a>', |
||
| 138 | "This is not a \"Link\":\n\nAnother paragraph" => "This is not a \"Link\":</p>\n\n\n\t<p>Another paragraph", |
||
| 139 | # no multiline link text |
||
| 140 | "This is a double quote \"on the first line\nand another on a second line\":test" => "This is a double quote \"on the first line<br />and another on a second line\":test", |
||
| 141 | # mailto link |
||
| 142 | "\"system administrator\":mailto:sysadmin@example.com?subject=redmine%20permissions" => "<a href=\"mailto:sysadmin@example.com?subject=redmine%20permissions\">system administrator</a>", |
||
| 143 | # two exclamation marks |
||
| 144 | '"a link":http://example.net/path!602815048C7B5C20!302.html' => '<a href="http://example.net/path!602815048C7B5C20!302.html" class="external">a link</a>', |
||
| 145 | # escaping |
||
| 146 | '"test":http://foo"bar' => '<a href="http://foo"bar" class="external">test</a>', |
||
| 147 | } |
||
| 148 | to_test.each { |text, result| assert_equal "<p>#{result}</p>", textilizable(text) }
|
||
| 149 | end |
||
| 150 | 119:8661b858af72 | Chris | |
| 151 | 0:513646585e45 | Chris | def test_redmine_links |
| 152 | 441:cbce1fd3b1b7 | Chris | issue_link = link_to('#3', {:controller => 'issues', :action => 'show', :id => 3},
|
| 153 | 0:513646585e45 | Chris | :class => 'issue status-1 priority-1 overdue', :title => 'Error 281 when updating a recipe (New)') |
| 154 | 441:cbce1fd3b1b7 | Chris | |
| 155 | 0:513646585e45 | Chris | changeset_link = link_to('r1', {:controller => 'repositories', :action => 'revision', :id => 'ecookbook', :rev => 1},
|
| 156 | :class => 'changeset', :title => 'My very first commit') |
||
| 157 | changeset_link2 = link_to('r2', {:controller => 'repositories', :action => 'revision', :id => 'ecookbook', :rev => 2},
|
||
| 158 | :class => 'changeset', :title => 'This commit fixes #1, #2 and references #1 & #3') |
||
| 159 | 441:cbce1fd3b1b7 | Chris | |
| 160 | 0:513646585e45 | Chris | document_link = link_to('Test document', {:controller => 'documents', :action => 'show', :id => 1},
|
| 161 | :class => 'document') |
||
| 162 | 441:cbce1fd3b1b7 | Chris | |
| 163 | 0:513646585e45 | Chris | version_link = link_to('1.0', {:controller => 'versions', :action => 'show', :id => 2},
|
| 164 | :class => 'version') |
||
| 165 | |||
| 166 | message_url = {:controller => 'messages', :action => 'show', :board_id => 1, :id => 4}
|
||
| 167 | 441:cbce1fd3b1b7 | Chris | |
| 168 | 0:513646585e45 | Chris | project_url = {:controller => 'projects', :action => 'show', :id => 'subproject1'}
|
| 169 | 441:cbce1fd3b1b7 | Chris | |
| 170 | 0:513646585e45 | Chris | source_url = {:controller => 'repositories', :action => 'entry', :id => 'ecookbook', :path => ['some', 'file']}
|
| 171 | source_url_with_ext = {:controller => 'repositories', :action => 'entry', :id => 'ecookbook', :path => ['some', 'file.ext']}
|
||
| 172 | 441:cbce1fd3b1b7 | Chris | |
| 173 | 0:513646585e45 | Chris | to_test = {
|
| 174 | # tickets |
||
| 175 | '#3, [#3], (#3) and #3.' => "#{issue_link}, [#{issue_link}], (#{issue_link}) and #{issue_link}.",
|
||
| 176 | # changesets |
||
| 177 | 'r1' => changeset_link, |
||
| 178 | 'r1.' => "#{changeset_link}.",
|
||
| 179 | 'r1, r2' => "#{changeset_link}, #{changeset_link2}",
|
||
| 180 | 'r1,r2' => "#{changeset_link},#{changeset_link2}",
|
||
| 181 | # documents |
||
| 182 | 'document#1' => document_link, |
||
| 183 | 'document:"Test document"' => document_link, |
||
| 184 | # versions |
||
| 185 | 'version#2' => version_link, |
||
| 186 | 'version:1.0' => version_link, |
||
| 187 | 'version:"1.0"' => version_link, |
||
| 188 | # source |
||
| 189 | 'source:/some/file' => link_to('source:/some/file', source_url, :class => 'source'),
|
||
| 190 | 'source:/some/file.' => link_to('source:/some/file', source_url, :class => 'source') + ".",
|
||
| 191 | 'source:/some/file.ext.' => link_to('source:/some/file.ext', source_url_with_ext, :class => 'source') + ".",
|
||
| 192 | 'source:/some/file. ' => link_to('source:/some/file', source_url, :class => 'source') + ".",
|
||
| 193 | 'source:/some/file.ext. ' => link_to('source:/some/file.ext', source_url_with_ext, :class => 'source') + ".",
|
||
| 194 | 'source:/some/file, ' => link_to('source:/some/file', source_url, :class => 'source') + ",",
|
||
| 195 | 'source:/some/file@52' => link_to('source:/some/file@52', source_url.merge(:rev => 52), :class => 'source'),
|
||
| 196 | 'source:/some/file.ext@52' => link_to('source:/some/file.ext@52', source_url_with_ext.merge(:rev => 52), :class => 'source'),
|
||
| 197 | 'source:/some/file#L110' => link_to('source:/some/file#L110', source_url.merge(:anchor => 'L110'), :class => 'source'),
|
||
| 198 | 'source:/some/file.ext#L110' => link_to('source:/some/file.ext#L110', source_url_with_ext.merge(:anchor => 'L110'), :class => 'source'),
|
||
| 199 | 'source:/some/file@52#L110' => link_to('source:/some/file@52#L110', source_url.merge(:rev => 52, :anchor => 'L110'), :class => 'source'),
|
||
| 200 | 'export:/some/file' => link_to('export:/some/file', source_url.merge(:format => 'raw'), :class => 'source download'),
|
||
| 201 | # message |
||
| 202 | 'message#4' => link_to('Post 2', message_url, :class => 'message'),
|
||
| 203 | 210:0579821a129a | Chris | 'message#5' => link_to('RE: post 2', message_url.merge(:anchor => 'message-5', :r => 5), :class => 'message'),
|
| 204 | 0:513646585e45 | Chris | # project |
| 205 | 'project#3' => link_to('eCookbook Subproject 1', project_url, :class => 'project'),
|
||
| 206 | 'project:subproject1' => link_to('eCookbook Subproject 1', project_url, :class => 'project'),
|
||
| 207 | 'project:"eCookbook subProject 1"' => link_to('eCookbook Subproject 1', project_url, :class => 'project'),
|
||
| 208 | # escaping |
||
| 209 | '!#3.' => '#3.', |
||
| 210 | '!r1' => 'r1', |
||
| 211 | '!document#1' => 'document#1', |
||
| 212 | '!document:"Test document"' => 'document:"Test document"', |
||
| 213 | '!version#2' => 'version#2', |
||
| 214 | '!version:1.0' => 'version:1.0', |
||
| 215 | '!version:"1.0"' => 'version:"1.0"', |
||
| 216 | '!source:/some/file' => 'source:/some/file', |
||
| 217 | # not found |
||
| 218 | '#0123456789' => '#0123456789', |
||
| 219 | # invalid expressions |
||
| 220 | 'source:' => 'source:', |
||
| 221 | # url hash |
||
| 222 | "http://foo.bar/FAQ#3" => '<a class="external" href="http://foo.bar/FAQ#3">http://foo.bar/FAQ#3</a>', |
||
| 223 | } |
||
| 224 | @project = Project.find(1) |
||
| 225 | to_test.each { |text, result| assert_equal "<p>#{result}</p>", textilizable(text), "#{text} failed" }
|
||
| 226 | end |
||
| 227 | 441:cbce1fd3b1b7 | Chris | |
| 228 | 210:0579821a129a | Chris | def test_cross_project_redmine_links |
| 229 | source_link = link_to('ecookbook:source:/some/file', {:controller => 'repositories', :action => 'entry', :id => 'ecookbook', :path => ['some', 'file']},
|
||
| 230 | :class => 'source') |
||
| 231 | 441:cbce1fd3b1b7 | Chris | |
| 232 | 210:0579821a129a | Chris | changeset_link = link_to('ecookbook:r2', {:controller => 'repositories', :action => 'revision', :id => 'ecookbook', :rev => 2},
|
| 233 | :class => 'changeset', :title => 'This commit fixes #1, #2 and references #1 & #3') |
||
| 234 | 441:cbce1fd3b1b7 | Chris | |
| 235 | 210:0579821a129a | Chris | to_test = {
|
| 236 | # documents |
||
| 237 | 'document:"Test document"' => 'document:"Test document"', |
||
| 238 | 'ecookbook:document:"Test document"' => '<a href="/documents/1" class="document">Test document</a>', |
||
| 239 | 'invalid:document:"Test document"' => 'invalid:document:"Test document"', |
||
| 240 | # versions |
||
| 241 | 'version:"1.0"' => 'version:"1.0"', |
||
| 242 | 'ecookbook:version:"1.0"' => '<a href="/versions/show/2" class="version">1.0</a>', |
||
| 243 | 'invalid:version:"1.0"' => 'invalid:version:"1.0"', |
||
| 244 | # changeset |
||
| 245 | 'r2' => 'r2', |
||
| 246 | 'ecookbook:r2' => changeset_link, |
||
| 247 | 'invalid:r2' => 'invalid:r2', |
||
| 248 | # source |
||
| 249 | 'source:/some/file' => 'source:/some/file', |
||
| 250 | 'ecookbook:source:/some/file' => source_link, |
||
| 251 | 'invalid:source:/some/file' => 'invalid:source:/some/file', |
||
| 252 | } |
||
| 253 | @project = Project.find(3) |
||
| 254 | to_test.each { |text, result| assert_equal "<p>#{result}</p>", textilizable(text), "#{text} failed" }
|
||
| 255 | end |
||
| 256 | 119:8661b858af72 | Chris | |
| 257 | def test_redmine_links_git_commit |
||
| 258 | changeset_link = link_to('abcd',
|
||
| 259 | {
|
||
| 260 | :controller => 'repositories', |
||
| 261 | :action => 'revision', |
||
| 262 | :id => 'subproject1', |
||
| 263 | :rev => 'abcd', |
||
| 264 | }, |
||
| 265 | :class => 'changeset', :title => 'test commit') |
||
| 266 | to_test = {
|
||
| 267 | 'commit:abcd' => changeset_link, |
||
| 268 | } |
||
| 269 | @project = Project.find(3) |
||
| 270 | r = Repository::Git.create!(:project => @project, :url => '/tmp/test/git') |
||
| 271 | assert r |
||
| 272 | c = Changeset.new(:repository => r, |
||
| 273 | :committed_on => Time.now, |
||
| 274 | :revision => 'abcd', |
||
| 275 | :scmid => 'abcd', |
||
| 276 | :comments => 'test commit') |
||
| 277 | assert( c.save ) |
||
| 278 | to_test.each { |text, result| assert_equal "<p>#{result}</p>", textilizable(text) }
|
||
| 279 | end |
||
| 280 | |||
| 281 | # TODO: Bazaar commit id contains mail address, so it contains '@' and '_'. |
||
| 282 | def test_redmine_links_darcs_commit |
||
| 283 | changeset_link = link_to('20080308225258-98289-abcd456efg.gz',
|
||
| 284 | {
|
||
| 285 | :controller => 'repositories', |
||
| 286 | :action => 'revision', |
||
| 287 | :id => 'subproject1', |
||
| 288 | :rev => '123', |
||
| 289 | }, |
||
| 290 | :class => 'changeset', :title => 'test commit') |
||
| 291 | to_test = {
|
||
| 292 | 'commit:20080308225258-98289-abcd456efg.gz' => changeset_link, |
||
| 293 | } |
||
| 294 | @project = Project.find(3) |
||
| 295 | 245:051f544170fe | Chris | r = Repository::Darcs.create!( |
| 296 | :project => @project, :url => '/tmp/test/darcs', |
||
| 297 | :log_encoding => 'UTF-8') |
||
| 298 | 119:8661b858af72 | Chris | assert r |
| 299 | c = Changeset.new(:repository => r, |
||
| 300 | :committed_on => Time.now, |
||
| 301 | :revision => '123', |
||
| 302 | :scmid => '20080308225258-98289-abcd456efg.gz', |
||
| 303 | :comments => 'test commit') |
||
| 304 | assert( c.save ) |
||
| 305 | to_test.each { |text, result| assert_equal "<p>#{result}</p>", textilizable(text) }
|
||
| 306 | end |
||
| 307 | |||
| 308 | def test_redmine_links_mercurial_commit |
||
| 309 | changeset_link_rev = link_to('r123',
|
||
| 310 | {
|
||
| 311 | :controller => 'repositories', |
||
| 312 | :action => 'revision', |
||
| 313 | :id => 'subproject1', |
||
| 314 | :rev => '123' , |
||
| 315 | }, |
||
| 316 | :class => 'changeset', :title => 'test commit') |
||
| 317 | changeset_link_commit = link_to('abcd',
|
||
| 318 | {
|
||
| 319 | :controller => 'repositories', |
||
| 320 | :action => 'revision', |
||
| 321 | :id => 'subproject1', |
||
| 322 | :rev => 'abcd' , |
||
| 323 | }, |
||
| 324 | :class => 'changeset', :title => 'test commit') |
||
| 325 | to_test = {
|
||
| 326 | 'r123' => changeset_link_rev, |
||
| 327 | 'commit:abcd' => changeset_link_commit, |
||
| 328 | } |
||
| 329 | @project = Project.find(3) |
||
| 330 | r = Repository::Mercurial.create!(:project => @project, :url => '/tmp/test') |
||
| 331 | assert r |
||
| 332 | c = Changeset.new(:repository => r, |
||
| 333 | :committed_on => Time.now, |
||
| 334 | :revision => '123', |
||
| 335 | :scmid => 'abcd', |
||
| 336 | :comments => 'test commit') |
||
| 337 | assert( c.save ) |
||
| 338 | to_test.each { |text, result| assert_equal "<p>#{result}</p>", textilizable(text) }
|
||
| 339 | end |
||
| 340 | |||
| 341 | 0:513646585e45 | Chris | def test_attachment_links |
| 342 | attachment_link = link_to('error281.txt', {:controller => 'attachments', :action => 'download', :id => '1'}, :class => 'attachment')
|
||
| 343 | to_test = {
|
||
| 344 | 'attachment:error281.txt' => attachment_link |
||
| 345 | } |
||
| 346 | to_test.each { |text, result| assert_equal "<p>#{result}</p>", textilizable(text, :attachments => Issue.find(3).attachments), "#{text} failed" }
|
||
| 347 | end |
||
| 348 | 441:cbce1fd3b1b7 | Chris | |
| 349 | 0:513646585e45 | Chris | def test_wiki_links |
| 350 | to_test = {
|
||
| 351 | '[[CookBook documentation]]' => '<a href="/projects/ecookbook/wiki/CookBook_documentation" class="wiki-page">CookBook documentation</a>', |
||
| 352 | '[[Another page|Page]]' => '<a href="/projects/ecookbook/wiki/Another_page" class="wiki-page">Page</a>', |
||
| 353 | # link with anchor |
||
| 354 | '[[CookBook documentation#One-section]]' => '<a href="/projects/ecookbook/wiki/CookBook_documentation#One-section" class="wiki-page">CookBook documentation</a>', |
||
| 355 | '[[Another page#anchor|Page]]' => '<a href="/projects/ecookbook/wiki/Another_page#anchor" class="wiki-page">Page</a>', |
||
| 356 | # page that doesn't exist |
||
| 357 | '[[Unknown page]]' => '<a href="/projects/ecookbook/wiki/Unknown_page" class="wiki-page new">Unknown page</a>', |
||
| 358 | '[[Unknown page|404]]' => '<a href="/projects/ecookbook/wiki/Unknown_page" class="wiki-page new">404</a>', |
||
| 359 | # link to another project wiki |
||
| 360 | 37:94944d00e43c | chris | '[[onlinestore:]]' => '<a href="/projects/onlinestore/wiki" class="wiki-page">onlinestore</a>', |
| 361 | '[[onlinestore:|Wiki]]' => '<a href="/projects/onlinestore/wiki" class="wiki-page">Wiki</a>', |
||
| 362 | 0:513646585e45 | Chris | '[[onlinestore:Start page]]' => '<a href="/projects/onlinestore/wiki/Start_page" class="wiki-page">Start page</a>', |
| 363 | '[[onlinestore:Start page|Text]]' => '<a href="/projects/onlinestore/wiki/Start_page" class="wiki-page">Text</a>', |
||
| 364 | '[[onlinestore:Unknown page]]' => '<a href="/projects/onlinestore/wiki/Unknown_page" class="wiki-page new">Unknown page</a>', |
||
| 365 | # striked through link |
||
| 366 | '-[[Another page|Page]]-' => '<del><a href="/projects/ecookbook/wiki/Another_page" class="wiki-page">Page</a></del>', |
||
| 367 | '-[[Another page|Page]] link-' => '<del><a href="/projects/ecookbook/wiki/Another_page" class="wiki-page">Page</a> link</del>', |
||
| 368 | # escaping |
||
| 369 | '![[Another page|Page]]' => '[[Another page|Page]]', |
||
| 370 | # project does not exist |
||
| 371 | '[[unknowproject:Start]]' => '[[unknowproject:Start]]', |
||
| 372 | '[[unknowproject:Start|Page title]]' => '[[unknowproject:Start|Page title]]', |
||
| 373 | } |
||
| 374 | @project = Project.find(1) |
||
| 375 | to_test.each { |text, result| assert_equal "<p>#{result}</p>", textilizable(text) }
|
||
| 376 | end |
||
| 377 | 441:cbce1fd3b1b7 | Chris | |
| 378 | 0:513646585e45 | Chris | def test_html_tags |
| 379 | to_test = {
|
||
| 380 | "<div>content</div>" => "<p><div>content</div></p>", |
||
| 381 | "<div class=\"bold\">content</div>" => "<p><div class=\"bold\">content</div></p>", |
||
| 382 | "<script>some script;</script>" => "<p><script>some script;</script></p>", |
||
| 383 | # do not escape pre/code tags |
||
| 384 | "<pre>\nline 1\nline2</pre>" => "<pre>\nline 1\nline2</pre>", |
||
| 385 | "<pre><code>\nline 1\nline2</code></pre>" => "<pre><code>\nline 1\nline2</code></pre>", |
||
| 386 | "<pre><div>content</div></pre>" => "<pre><div>content</div></pre>", |
||
| 387 | "HTML comment: <!-- no comments -->" => "<p>HTML comment: <!-- no comments --></p>", |
||
| 388 | "<!-- opening comment" => "<p><!-- opening comment</p>", |
||
| 389 | # remove attributes except class |
||
| 390 | "<pre class='foo'>some text</pre>" => "<pre class='foo'>some text</pre>", |
||
| 391 | 119:8661b858af72 | Chris | '<pre class="foo">some text</pre>' => '<pre class="foo">some text</pre>', |
| 392 | "<pre class='foo bar'>some text</pre>" => "<pre class='foo bar'>some text</pre>", |
||
| 393 | '<pre class="foo bar">some text</pre>' => '<pre class="foo bar">some text</pre>', |
||
| 394 | 0:513646585e45 | Chris | "<pre onmouseover='alert(1)'>some text</pre>" => "<pre>some text</pre>", |
| 395 | 119:8661b858af72 | Chris | # xss |
| 396 | '<pre><code class=""onmouseover="alert(1)">text</code></pre>' => '<pre><code>text</code></pre>', |
||
| 397 | '<pre class=""onmouseover="alert(1)">text</pre>' => '<pre>text</pre>', |
||
| 398 | 0:513646585e45 | Chris | } |
| 399 | to_test.each { |text, result| assert_equal result, textilizable(text) }
|
||
| 400 | end |
||
| 401 | 441:cbce1fd3b1b7 | Chris | |
| 402 | 0:513646585e45 | Chris | def test_allowed_html_tags |
| 403 | to_test = {
|
||
| 404 | "<pre>preformatted text</pre>" => "<pre>preformatted text</pre>", |
||
| 405 | "<notextile>no *textile* formatting</notextile>" => "no *textile* formatting", |
||
| 406 | "<notextile>this is <tag>a tag</tag></notextile>" => "this is <tag>a tag</tag>" |
||
| 407 | } |
||
| 408 | to_test.each { |text, result| assert_equal result, textilizable(text) }
|
||
| 409 | end |
||
| 410 | 441:cbce1fd3b1b7 | Chris | |
| 411 | 0:513646585e45 | Chris | def test_pre_tags |
| 412 | raw = <<-RAW |
||
| 413 | Before |
||
| 414 | |||
| 415 | <pre> |
||
| 416 | <prepared-statement-cache-size>32</prepared-statement-cache-size> |
||
| 417 | </pre> |
||
| 418 | |||
| 419 | After |
||
| 420 | RAW |
||
| 421 | |||
| 422 | expected = <<-EXPECTED |
||
| 423 | <p>Before</p> |
||
| 424 | <pre> |
||
| 425 | <prepared-statement-cache-size>32</prepared-statement-cache-size> |
||
| 426 | </pre> |
||
| 427 | <p>After</p> |
||
| 428 | EXPECTED |
||
| 429 | 441:cbce1fd3b1b7 | Chris | |
| 430 | 0:513646585e45 | Chris | assert_equal expected.gsub(%r{[\r\n\t]}, ''), textilizable(raw).gsub(%r{[\r\n\t]}, '')
|
| 431 | end |
||
| 432 | 441:cbce1fd3b1b7 | Chris | |
| 433 | 0:513646585e45 | Chris | def test_pre_content_should_not_parse_wiki_and_redmine_links |
| 434 | raw = <<-RAW |
||
| 435 | [[CookBook documentation]] |
||
| 436 | |||
| 437 | #1 |
||
| 438 | |||
| 439 | <pre> |
||
| 440 | [[CookBook documentation]] |
||
| 441 | |||
| 442 | #1 |
||
| 443 | </pre> |
||
| 444 | RAW |
||
| 445 | |||
| 446 | expected = <<-EXPECTED |
||
| 447 | <p><a href="/projects/ecookbook/wiki/CookBook_documentation" class="wiki-page">CookBook documentation</a></p> |
||
| 448 | <p><a href="/issues/1" class="issue status-1 priority-1" title="Can't print recipes (New)">#1</a></p> |
||
| 449 | <pre> |
||
| 450 | [[CookBook documentation]] |
||
| 451 | |||
| 452 | #1 |
||
| 453 | </pre> |
||
| 454 | EXPECTED |
||
| 455 | 441:cbce1fd3b1b7 | Chris | |
| 456 | 0:513646585e45 | Chris | @project = Project.find(1) |
| 457 | assert_equal expected.gsub(%r{[\r\n\t]}, ''), textilizable(raw).gsub(%r{[\r\n\t]}, '')
|
||
| 458 | end |
||
| 459 | 441:cbce1fd3b1b7 | Chris | |
| 460 | 0:513646585e45 | Chris | def test_non_closing_pre_blocks_should_be_closed |
| 461 | raw = <<-RAW |
||
| 462 | <pre><code> |
||
| 463 | RAW |
||
| 464 | |||
| 465 | expected = <<-EXPECTED |
||
| 466 | <pre><code> |
||
| 467 | </code></pre> |
||
| 468 | EXPECTED |
||
| 469 | 441:cbce1fd3b1b7 | Chris | |
| 470 | 0:513646585e45 | Chris | @project = Project.find(1) |
| 471 | assert_equal expected.gsub(%r{[\r\n\t]}, ''), textilizable(raw).gsub(%r{[\r\n\t]}, '')
|
||
| 472 | end |
||
| 473 | 441:cbce1fd3b1b7 | Chris | |
| 474 | 0:513646585e45 | Chris | def test_syntax_highlight |
| 475 | raw = <<-RAW |
||
| 476 | <pre><code class="ruby"> |
||
| 477 | # Some ruby code here |
||
| 478 | </code></pre> |
||
| 479 | RAW |
||
| 480 | |||
| 481 | expected = <<-EXPECTED |
||
| 482 | <pre><code class="ruby syntaxhl"><span class=\"CodeRay\"><span class="no">1</span> <span class="c"># Some ruby code here</span></span> |
||
| 483 | </code></pre> |
||
| 484 | EXPECTED |
||
| 485 | |||
| 486 | assert_equal expected.gsub(%r{[\r\n\t]}, ''), textilizable(raw).gsub(%r{[\r\n\t]}, '')
|
||
| 487 | end |
||
| 488 | 441:cbce1fd3b1b7 | Chris | |
| 489 | 0:513646585e45 | Chris | def test_wiki_links_in_tables |
| 490 | to_test = {"|[[Page|Link title]]|[[Other Page|Other title]]|\n|Cell 21|[[Last page]]|" =>
|
||
| 491 | '<tr><td><a href="/projects/ecookbook/wiki/Page" class="wiki-page new">Link title</a></td>' + |
||
| 492 | '<td><a href="/projects/ecookbook/wiki/Other_Page" class="wiki-page new">Other title</a></td>' + |
||
| 493 | '</tr><tr><td>Cell 21</td><td><a href="/projects/ecookbook/wiki/Last_page" class="wiki-page new">Last page</a></td></tr>' |
||
| 494 | } |
||
| 495 | @project = Project.find(1) |
||
| 496 | to_test.each { |text, result| assert_equal "<table>#{result}</table>", textilizable(text).gsub(/[\t\n]/, '') }
|
||
| 497 | end |
||
| 498 | 441:cbce1fd3b1b7 | Chris | |
| 499 | 0:513646585e45 | Chris | def test_text_formatting |
| 500 | to_test = {'*_+bold, italic and underline+_*' => '<strong><em><ins>bold, italic and underline</ins></em></strong>',
|
||
| 501 | '(_text within parentheses_)' => '(<em>text within parentheses</em>)', |
||
| 502 | 'a *Humane Web* Text Generator' => 'a <strong>Humane Web</strong> Text Generator', |
||
| 503 | '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>', |
||
| 504 | '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', |
||
| 505 | } |
||
| 506 | to_test.each { |text, result| assert_equal "<p>#{result}</p>", textilizable(text) }
|
||
| 507 | end |
||
| 508 | 441:cbce1fd3b1b7 | Chris | |
| 509 | 0:513646585e45 | Chris | def test_wiki_horizontal_rule |
| 510 | assert_equal '<hr />', textilizable('---')
|
||
| 511 | assert_equal '<p>Dashes: ---</p>', textilizable('Dashes: ---')
|
||
| 512 | end |
||
| 513 | 441:cbce1fd3b1b7 | Chris | |
| 514 | 0:513646585e45 | Chris | def test_footnotes |
| 515 | raw = <<-RAW |
||
| 516 | This is some text[1]. |
||
| 517 | |||
| 518 | fn1. This is the foot note |
||
| 519 | RAW |
||
| 520 | |||
| 521 | expected = <<-EXPECTED |
||
| 522 | <p>This is some text<sup><a href=\"#fn1\">1</a></sup>.</p> |
||
| 523 | <p id="fn1" class="footnote"><sup>1</sup> This is the foot note</p> |
||
| 524 | EXPECTED |
||
| 525 | |||
| 526 | assert_equal expected.gsub(%r{[\r\n\t]}, ''), textilizable(raw).gsub(%r{[\r\n\t]}, '')
|
||
| 527 | end |
||
| 528 | 441:cbce1fd3b1b7 | Chris | |
| 529 | def test_headings |
||
| 530 | raw = 'h1. Some heading' |
||
| 531 | expected = %|<a name="Some-heading"></a>\n<h1 >Some heading<a href="#Some-heading" class="wiki-anchor">¶</a></h1>| |
||
| 532 | |||
| 533 | assert_equal expected, textilizable(raw) |
||
| 534 | end |
||
| 535 | |||
| 536 | 0:513646585e45 | Chris | def test_table_of_content |
| 537 | raw = <<-RAW |
||
| 538 | {{toc}}
|
||
| 539 | |||
| 540 | h1. Title |
||
| 541 | |||
| 542 | Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Maecenas sed libero. |
||
| 543 | |||
| 544 | h2. Subtitle with a [[Wiki]] link |
||
| 545 | |||
| 546 | Nullam commodo metus accumsan nulla. Curabitur lobortis dui id dolor. |
||
| 547 | |||
| 548 | h2. Subtitle with [[Wiki|another Wiki]] link |
||
| 549 | |||
| 550 | h2. Subtitle with %{color:red}red text%
|
||
| 551 | 119:8661b858af72 | Chris | |
| 552 | <pre> |
||
| 553 | some code |
||
| 554 | </pre> |
||
| 555 | |||
| 556 | 37:94944d00e43c | chris | h3. Subtitle with *some* _modifiers_ |
| 557 | 0:513646585e45 | Chris | |
| 558 | h1. Another title |
||
| 559 | |||
| 560 | 37:94944d00e43c | chris | h3. An "Internet link":http://www.redmine.org/ inside subtitle |
| 561 | 0:513646585e45 | Chris | |
| 562 | h2. "Project Name !/attachments/1234/logo_small.gif! !/attachments/5678/logo_2.png!":/projects/projectname/issues |
||
| 563 | |||
| 564 | RAW |
||
| 565 | |||
| 566 | 37:94944d00e43c | chris | expected = '<ul class="toc">' + |
| 567 | '<li><a href="#Title">Title</a>' + |
||
| 568 | '<ul>' + |
||
| 569 | 441:cbce1fd3b1b7 | Chris | '<li><a href="#Subtitle-with-a-Wiki-link">Subtitle with a Wiki link</a></li>' + |
| 570 | '<li><a href="#Subtitle-with-another-Wiki-link">Subtitle with another Wiki link</a></li>' + |
||
| 571 | 37:94944d00e43c | chris | '<li><a href="#Subtitle-with-red-text">Subtitle with red text</a>' + |
| 572 | '<ul>' + |
||
| 573 | '<li><a href="#Subtitle-with-some-modifiers">Subtitle with some modifiers</a></li>' + |
||
| 574 | '</ul>' + |
||
| 575 | '</li>' + |
||
| 576 | '</ul>' + |
||
| 577 | '</li>' + |
||
| 578 | '<li><a href="#Another-title">Another title</a>' + |
||
| 579 | '<ul>' + |
||
| 580 | '<li>' + |
||
| 581 | '<ul>' + |
||
| 582 | '<li><a href="#An-Internet-link-inside-subtitle">An Internet link inside subtitle</a></li>' + |
||
| 583 | '</ul>' + |
||
| 584 | '</li>' + |
||
| 585 | '<li><a href="#Project-Name">Project Name</a></li>' + |
||
| 586 | '</ul>' + |
||
| 587 | '</li>' + |
||
| 588 | 0:513646585e45 | Chris | '</ul>' |
| 589 | |||
| 590 | 37:94944d00e43c | chris | @project = Project.find(1) |
| 591 | 119:8661b858af72 | Chris | assert textilizable(raw).gsub("\n", "").include?(expected), textilizable(raw)
|
| 592 | 37:94944d00e43c | chris | end |
| 593 | 441:cbce1fd3b1b7 | Chris | |
| 594 | 37:94944d00e43c | chris | def test_table_of_content_should_contain_included_page_headings |
| 595 | raw = <<-RAW |
||
| 596 | {{toc}}
|
||
| 597 | |||
| 598 | h1. Included |
||
| 599 | |||
| 600 | {{include(Child_1)}}
|
||
| 601 | RAW |
||
| 602 | |||
| 603 | expected = '<ul class="toc">' + |
||
| 604 | '<li><a href="#Included">Included</a></li>' + |
||
| 605 | 441:cbce1fd3b1b7 | Chris | '<li><a href="#Child-page-1">Child page 1</a></li>' + |
| 606 | 37:94944d00e43c | chris | '</ul>' |
| 607 | |||
| 608 | @project = Project.find(1) |
||
| 609 | 0:513646585e45 | Chris | assert textilizable(raw).gsub("\n", "").include?(expected)
|
| 610 | end |
||
| 611 | |||
| 612 | def test_default_formatter |
||
| 613 | Setting.text_formatting = 'unknown' |
||
| 614 | text = 'a *link*: http://www.example.net/' |
||
| 615 | assert_equal '<p>a *link*: <a href="http://www.example.net/">http://www.example.net/</a></p>', textilizable(text) |
||
| 616 | Setting.text_formatting = 'textile' |
||
| 617 | end |
||
| 618 | 441:cbce1fd3b1b7 | Chris | |
| 619 | 0:513646585e45 | Chris | def test_due_date_distance_in_words |
| 620 | to_test = { Date.today => 'Due in 0 days',
|
||
| 621 | Date.today + 1 => 'Due in 1 day', |
||
| 622 | Date.today + 100 => 'Due in about 3 months', |
||
| 623 | Date.today + 20000 => 'Due in over 54 years', |
||
| 624 | Date.today - 1 => '1 day late', |
||
| 625 | Date.today - 100 => 'about 3 months late', |
||
| 626 | Date.today - 20000 => 'over 54 years late', |
||
| 627 | } |
||
| 628 | 119:8661b858af72 | Chris | ::I18n.locale = :en |
| 629 | 0:513646585e45 | Chris | to_test.each do |date, expected| |
| 630 | assert_equal expected, due_date_distance_in_words(date) |
||
| 631 | end |
||
| 632 | end |
||
| 633 | 441:cbce1fd3b1b7 | Chris | |
| 634 | 0:513646585e45 | Chris | def test_avatar |
| 635 | # turn on avatars |
||
| 636 | Setting.gravatar_enabled = '1' |
||
| 637 | assert avatar(User.find_by_mail('jsmith@somenet.foo')).include?(Digest::MD5.hexdigest('jsmith@somenet.foo'))
|
||
| 638 | assert avatar('jsmith <jsmith@somenet.foo>').include?(Digest::MD5.hexdigest('jsmith@somenet.foo'))
|
||
| 639 | assert_nil avatar('jsmith')
|
||
| 640 | assert_nil avatar(nil) |
||
| 641 | 441:cbce1fd3b1b7 | Chris | |
| 642 | 0:513646585e45 | Chris | # turn off avatars |
| 643 | Setting.gravatar_enabled = '0' |
||
| 644 | 22:40f7cfd4df19 | chris | assert_equal '', avatar(User.find_by_mail('jsmith@somenet.foo'))
|
| 645 | 0:513646585e45 | Chris | end |
| 646 | 441:cbce1fd3b1b7 | Chris | |
| 647 | 0:513646585e45 | Chris | def test_link_to_user |
| 648 | user = User.find(2) |
||
| 649 | t = link_to_user(user) |
||
| 650 | assert_equal "<a href=\"/users/2\">#{ user.name }</a>", t
|
||
| 651 | end |
||
| 652 | 441:cbce1fd3b1b7 | Chris | |
| 653 | 0:513646585e45 | Chris | def test_link_to_user_should_not_link_to_locked_user |
| 654 | user = User.find(5) |
||
| 655 | assert user.locked? |
||
| 656 | t = link_to_user(user) |
||
| 657 | assert_equal user.name, t |
||
| 658 | end |
||
| 659 | 441:cbce1fd3b1b7 | Chris | |
| 660 | 0:513646585e45 | Chris | def test_link_to_user_should_not_link_to_anonymous |
| 661 | user = User.anonymous |
||
| 662 | assert user.anonymous? |
||
| 663 | t = link_to_user(user) |
||
| 664 | assert_equal ::I18n.t(:label_user_anonymous), t |
||
| 665 | end |
||
| 666 | 14:1d32c0a0efbf | Chris | |
| 667 | def test_link_to_project |
||
| 668 | project = Project.find(1) |
||
| 669 | assert_equal %(<a href="/projects/ecookbook">eCookbook</a>), |
||
| 670 | link_to_project(project) |
||
| 671 | assert_equal %(<a href="/projects/ecookbook/settings">eCookbook</a>), |
||
| 672 | link_to_project(project, :action => 'settings') |
||
| 673 | assert_equal %(<a href="http://test.host/projects/ecookbook?jump=blah">eCookbook</a>), |
||
| 674 | link_to_project(project, {:only_path => false, :jump => 'blah'})
|
||
| 675 | assert_equal %(<a href="/projects/ecookbook/settings" class="project">eCookbook</a>), |
||
| 676 | link_to_project(project, {:action => 'settings'}, :class => "project")
|
||
| 677 | end |
||
| 678 | 0:513646585e45 | Chris | end |