##// END OF EJS Templates
Fixes broken test....
Jean-Philippe Lang -
r3508:c499d2d150c7
parent child
Show More
@@ -1,594 +1,594
1 # Redmine - project management software
1 # Redmine - project management software
2 # Copyright (C) 2006-2009 Jean-Philippe Lang
2 # Copyright (C) 2006-2009 Jean-Philippe Lang
3 #
3 #
4 # This program is free software; you can redistribute it and/or
4 # This program is free software; you can redistribute it and/or
5 # modify it under the terms of the GNU General Public License
5 # modify it under the terms of the GNU General Public License
6 # as published by the Free Software Foundation; either version 2
6 # as published by the Free Software Foundation; either version 2
7 # of the License, or (at your option) any later version.
7 # of the License, or (at your option) any later version.
8 #
8 #
9 # This program is distributed in the hope that it will be useful,
9 # This program is distributed in the hope that it will be useful,
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 # GNU General Public License for more details.
12 # GNU General Public License for more details.
13 #
13 #
14 # You should have received a copy of the GNU General Public License
14 # You should have received a copy of the GNU General Public License
15 # along with this program; if not, write to the Free Software
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.
16 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
17
17
18 require File.dirname(__FILE__) + '/../../test_helper'
18 require File.dirname(__FILE__) + '/../../test_helper'
19
19
20 class ApplicationHelperTest < HelperTestCase
20 class ApplicationHelperTest < HelperTestCase
21 include ApplicationHelper
21 include ApplicationHelper
22 include ActionView::Helpers::TextHelper
22 include ActionView::Helpers::TextHelper
23 include ActionView::Helpers::DateHelper
23 include ActionView::Helpers::DateHelper
24
24
25 fixtures :projects, :roles, :enabled_modules, :users,
25 fixtures :projects, :roles, :enabled_modules, :users,
26 :repositories, :changesets,
26 :repositories, :changesets,
27 :trackers, :issue_statuses, :issues, :versions, :documents,
27 :trackers, :issue_statuses, :issues, :versions, :documents,
28 :wikis, :wiki_pages, :wiki_contents,
28 :wikis, :wiki_pages, :wiki_contents,
29 :boards, :messages,
29 :boards, :messages,
30 :attachments,
30 :attachments,
31 :enumerations
31 :enumerations
32
32
33 def setup
33 def setup
34 super
34 super
35 end
35 end
36
36
37 def test_auto_links
37 def test_auto_links
38 to_test = {
38 to_test = {
39 'http://foo.bar' => '<a class="external" href="http://foo.bar">http://foo.bar</a>',
39 'http://foo.bar' => '<a class="external" href="http://foo.bar">http://foo.bar</a>',
40 'http://foo.bar/~user' => '<a class="external" href="http://foo.bar/~user">http://foo.bar/~user</a>',
40 'http://foo.bar/~user' => '<a class="external" href="http://foo.bar/~user">http://foo.bar/~user</a>',
41 'http://foo.bar.' => '<a class="external" href="http://foo.bar">http://foo.bar</a>.',
41 'http://foo.bar.' => '<a class="external" href="http://foo.bar">http://foo.bar</a>.',
42 'https://foo.bar.' => '<a class="external" href="https://foo.bar">https://foo.bar</a>.',
42 'https://foo.bar.' => '<a class="external" href="https://foo.bar">https://foo.bar</a>.',
43 'This is a link: http://foo.bar.' => 'This is a link: <a class="external" href="http://foo.bar">http://foo.bar</a>.',
43 'This is a link: http://foo.bar.' => 'This is a link: <a class="external" href="http://foo.bar">http://foo.bar</a>.',
44 'A link (eg. http://foo.bar).' => 'A link (eg. <a class="external" href="http://foo.bar">http://foo.bar</a>).',
44 'A link (eg. http://foo.bar).' => 'A link (eg. <a class="external" href="http://foo.bar">http://foo.bar</a>).',
45 '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>.',
45 '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>.',
46 'http://www.foo.bar/Test_(foobar)' => '<a class="external" href="http://www.foo.bar/Test_(foobar)">http://www.foo.bar/Test_(foobar)</a>',
46 'http://www.foo.bar/Test_(foobar)' => '<a class="external" href="http://www.foo.bar/Test_(foobar)">http://www.foo.bar/Test_(foobar)</a>',
47 '(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>)',
47 '(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>)',
48 '(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>)',
48 '(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>)',
49 '(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>).',
49 '(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>).',
50 '(see "inline link":http://www.foo.bar/Test_(foobar))' => '(see <a href="http://www.foo.bar/Test_(foobar)" class="external">inline link</a>)',
50 '(see "inline link":http://www.foo.bar/Test_(foobar))' => '(see <a href="http://www.foo.bar/Test_(foobar)" class="external">inline link</a>)',
51 '(see "inline link":http://www.foo.bar/Test)' => '(see <a href="http://www.foo.bar/Test" class="external">inline link</a>)',
51 '(see "inline link":http://www.foo.bar/Test)' => '(see <a href="http://www.foo.bar/Test" class="external">inline link</a>)',
52 '(see "inline link":http://www.foo.bar/Test).' => '(see <a href="http://www.foo.bar/Test" class="external">inline link</a>).',
52 '(see "inline link":http://www.foo.bar/Test).' => '(see <a href="http://www.foo.bar/Test" class="external">inline link</a>).',
53 'www.foo.bar' => '<a class="external" href="http://www.foo.bar">www.foo.bar</a>',
53 'www.foo.bar' => '<a class="external" href="http://www.foo.bar">www.foo.bar</a>',
54 'http://foo.bar/page?p=1&t=z&s=' => '<a class="external" href="http://foo.bar/page?p=1&#38;t=z&#38;s=">http://foo.bar/page?p=1&#38;t=z&#38;s=</a>',
54 'http://foo.bar/page?p=1&t=z&s=' => '<a class="external" href="http://foo.bar/page?p=1&#38;t=z&#38;s=">http://foo.bar/page?p=1&#38;t=z&#38;s=</a>',
55 'http://foo.bar/page#125' => '<a class="external" href="http://foo.bar/page#125">http://foo.bar/page#125</a>',
55 'http://foo.bar/page#125' => '<a class="external" href="http://foo.bar/page#125">http://foo.bar/page#125</a>',
56 'http://foo@www.bar.com' => '<a class="external" href="http://foo@www.bar.com">http://foo@www.bar.com</a>',
56 'http://foo@www.bar.com' => '<a class="external" href="http://foo@www.bar.com">http://foo@www.bar.com</a>',
57 'http://foo:bar@www.bar.com' => '<a class="external" href="http://foo:bar@www.bar.com">http://foo:bar@www.bar.com</a>',
57 'http://foo:bar@www.bar.com' => '<a class="external" href="http://foo:bar@www.bar.com">http://foo:bar@www.bar.com</a>',
58 'ftp://foo.bar' => '<a class="external" href="ftp://foo.bar">ftp://foo.bar</a>',
58 'ftp://foo.bar' => '<a class="external" href="ftp://foo.bar">ftp://foo.bar</a>',
59 'ftps://foo.bar' => '<a class="external" href="ftps://foo.bar">ftps://foo.bar</a>',
59 'ftps://foo.bar' => '<a class="external" href="ftps://foo.bar">ftps://foo.bar</a>',
60 'sftp://foo.bar' => '<a class="external" href="sftp://foo.bar">sftp://foo.bar</a>',
60 'sftp://foo.bar' => '<a class="external" href="sftp://foo.bar">sftp://foo.bar</a>',
61 # two exclamation marks
61 # two exclamation marks
62 '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>',
62 '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>',
63 # escaping
63 # escaping
64 'http://foo"bar' => '<a class="external" href="http://foo&quot;bar">http://foo"bar</a>',
64 'http://foo"bar' => '<a class="external" href="http://foo&quot;bar">http://foo"bar</a>',
65 }
65 }
66 to_test.each { |text, result| assert_equal "<p>#{result}</p>", textilizable(text) }
66 to_test.each { |text, result| assert_equal "<p>#{result}</p>", textilizable(text) }
67 end
67 end
68
68
69 def test_auto_mailto
69 def test_auto_mailto
70 assert_equal '<p><a class="email" href="mailto:test@foo.bar">test@foo.bar</a></p>',
70 assert_equal '<p><a class="email" href="mailto:test@foo.bar">test@foo.bar</a></p>',
71 textilizable('test@foo.bar')
71 textilizable('test@foo.bar')
72 end
72 end
73
73
74 def test_inline_images
74 def test_inline_images
75 to_test = {
75 to_test = {
76 '!http://foo.bar/image.jpg!' => '<img src="http://foo.bar/image.jpg" alt="" />',
76 '!http://foo.bar/image.jpg!' => '<img src="http://foo.bar/image.jpg" alt="" />',
77 'floating !>http://foo.bar/image.jpg!' => 'floating <div style="float:right"><img src="http://foo.bar/image.jpg" alt="" /></div>',
77 'floating !>http://foo.bar/image.jpg!' => 'floating <div style="float:right"><img src="http://foo.bar/image.jpg" alt="" /></div>',
78 'with class !(some-class)http://foo.bar/image.jpg!' => 'with class <img src="http://foo.bar/image.jpg" class="some-class" alt="" />',
78 'with class !(some-class)http://foo.bar/image.jpg!' => 'with class <img src="http://foo.bar/image.jpg" class="some-class" alt="" />',
79 # inline styles should be stripped
79 # inline styles should be stripped
80 'with style !{width:100px;height100px}http://foo.bar/image.jpg!' => 'with style <img src="http://foo.bar/image.jpg" alt="" />',
80 'with style !{width:100px;height100px}http://foo.bar/image.jpg!' => 'with style <img src="http://foo.bar/image.jpg" alt="" />',
81 '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" />',
81 '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" />',
82 '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 &quot;title&quot;" alt="This is a double-quoted &quot;title&quot;" />',
82 '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 &quot;title&quot;" alt="This is a double-quoted &quot;title&quot;" />',
83 }
83 }
84 to_test.each { |text, result| assert_equal "<p>#{result}</p>", textilizable(text) }
84 to_test.each { |text, result| assert_equal "<p>#{result}</p>", textilizable(text) }
85 end
85 end
86
86
87 def test_inline_images_inside_tags
87 def test_inline_images_inside_tags
88 raw = <<-RAW
88 raw = <<-RAW
89 h1. !foo.png! Heading
89 h1. !foo.png! Heading
90
90
91 Centered image:
91 Centered image:
92
92
93 p=. !bar.gif!
93 p=. !bar.gif!
94 RAW
94 RAW
95
95
96 assert textilizable(raw).include?('<img src="foo.png" alt="" />')
96 assert textilizable(raw).include?('<img src="foo.png" alt="" />')
97 assert textilizable(raw).include?('<img src="bar.gif" alt="" />')
97 assert textilizable(raw).include?('<img src="bar.gif" alt="" />')
98 end
98 end
99
99
100 def test_acronyms
100 def test_acronyms
101 to_test = {
101 to_test = {
102 'this is an acronym: GPL(General Public License)' => 'this is an acronym: <acronym title="General Public License">GPL</acronym>',
102 'this is an acronym: GPL(General Public License)' => 'this is an acronym: <acronym title="General Public License">GPL</acronym>',
103 'GPL(This is a double-quoted "title")' => '<acronym title="This is a double-quoted &quot;title&quot;">GPL</acronym>',
103 'GPL(This is a double-quoted "title")' => '<acronym title="This is a double-quoted &quot;title&quot;">GPL</acronym>',
104 }
104 }
105 to_test.each { |text, result| assert_equal "<p>#{result}</p>", textilizable(text) }
105 to_test.each { |text, result| assert_equal "<p>#{result}</p>", textilizable(text) }
106
106
107 end
107 end
108
108
109 def test_attached_images
109 def test_attached_images
110 to_test = {
110 to_test = {
111 'Inline image: !logo.gif!' => 'Inline image: <img src="/attachments/download/3" title="This is a logo" alt="This is a logo" />',
111 'Inline image: !logo.gif!' => 'Inline image: <img src="/attachments/download/3" title="This is a logo" alt="This is a logo" />',
112 'Inline image: !logo.GIF!' => 'Inline image: <img src="/attachments/download/3" title="This is a logo" alt="This is a logo" />',
112 'Inline image: !logo.GIF!' => 'Inline image: <img src="/attachments/download/3" title="This is a logo" alt="This is a logo" />',
113 'No match: !ogo.gif!' => 'No match: <img src="ogo.gif" alt="" />',
113 'No match: !ogo.gif!' => 'No match: <img src="ogo.gif" alt="" />',
114 'No match: !ogo.GIF!' => 'No match: <img src="ogo.GIF" alt="" />',
114 'No match: !ogo.GIF!' => 'No match: <img src="ogo.GIF" alt="" />',
115 # link image
115 # link image
116 '!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>',
116 '!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>',
117 }
117 }
118 attachments = Attachment.find(:all)
118 attachments = Attachment.find(:all)
119 to_test.each { |text, result| assert_equal "<p>#{result}</p>", textilizable(text, :attachments => attachments) }
119 to_test.each { |text, result| assert_equal "<p>#{result}</p>", textilizable(text, :attachments => attachments) }
120 end
120 end
121
121
122 def test_textile_external_links
122 def test_textile_external_links
123 to_test = {
123 to_test = {
124 'This is a "link":http://foo.bar' => 'This is a <a href="http://foo.bar" class="external">link</a>',
124 'This is a "link":http://foo.bar' => 'This is a <a href="http://foo.bar" class="external">link</a>',
125 'This is an intern "link":/foo/bar' => 'This is an intern <a href="/foo/bar">link</a>',
125 'This is an intern "link":/foo/bar' => 'This is an intern <a href="/foo/bar">link</a>',
126 '"link (Link title)":http://foo.bar' => '<a href="http://foo.bar" title="Link title" class="external">link</a>',
126 '"link (Link title)":http://foo.bar' => '<a href="http://foo.bar" title="Link title" class="external">link</a>',
127 '"link (Link title with "double-quotes")":http://foo.bar' => '<a href="http://foo.bar" title="Link title with &quot;double-quotes&quot;" class="external">link</a>',
127 '"link (Link title with "double-quotes")":http://foo.bar' => '<a href="http://foo.bar" title="Link title with &quot;double-quotes&quot;" class="external">link</a>',
128 "This is not a \"Link\":\n\nAnother paragraph" => "This is not a \"Link\":</p>\n\n\n\t<p>Another paragraph",
128 "This is not a \"Link\":\n\nAnother paragraph" => "This is not a \"Link\":</p>\n\n\n\t<p>Another paragraph",
129 # no multiline link text
129 # no multiline link text
130 "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",
130 "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",
131 # mailto link
131 # mailto link
132 "\"system administrator\":mailto:sysadmin@example.com?subject=redmine%20permissions" => "<a href=\"mailto:sysadmin@example.com?subject=redmine%20permissions\">system administrator</a>",
132 "\"system administrator\":mailto:sysadmin@example.com?subject=redmine%20permissions" => "<a href=\"mailto:sysadmin@example.com?subject=redmine%20permissions\">system administrator</a>",
133 # two exclamation marks
133 # two exclamation marks
134 '"a link":http://example.net/path!602815048C7B5C20!302.html' => '<a href="http://example.net/path!602815048C7B5C20!302.html" class="external">a link</a>',
134 '"a link":http://example.net/path!602815048C7B5C20!302.html' => '<a href="http://example.net/path!602815048C7B5C20!302.html" class="external">a link</a>',
135 # escaping
135 # escaping
136 '"test":http://foo"bar' => '<a href="http://foo&quot;bar" class="external">test</a>',
136 '"test":http://foo"bar' => '<a href="http://foo&quot;bar" class="external">test</a>',
137 }
137 }
138 to_test.each { |text, result| assert_equal "<p>#{result}</p>", textilizable(text) }
138 to_test.each { |text, result| assert_equal "<p>#{result}</p>", textilizable(text) }
139 end
139 end
140
140
141 def test_redmine_links
141 def test_redmine_links
142 issue_link = link_to('#3', {:controller => 'issues', :action => 'show', :id => 3},
142 issue_link = link_to('#3', {:controller => 'issues', :action => 'show', :id => 3},
143 :class => 'issue status-1 priority-1 overdue', :title => 'Error 281 when updating a recipe (New)')
143 :class => 'issue status-1 priority-1 overdue', :title => 'Error 281 when updating a recipe (New)')
144
144
145 changeset_link = link_to('r1', {:controller => 'repositories', :action => 'revision', :id => 'ecookbook', :rev => 1},
145 changeset_link = link_to('r1', {:controller => 'repositories', :action => 'revision', :id => 'ecookbook', :rev => 1},
146 :class => 'changeset', :title => 'My very first commit')
146 :class => 'changeset', :title => 'My very first commit')
147 changeset_link2 = link_to('r2', {:controller => 'repositories', :action => 'revision', :id => 'ecookbook', :rev => 2},
147 changeset_link2 = link_to('r2', {:controller => 'repositories', :action => 'revision', :id => 'ecookbook', :rev => 2},
148 :class => 'changeset', :title => 'This commit fixes #1, #2 and references #1 & #3')
148 :class => 'changeset', :title => 'This commit fixes #1, #2 and references #1 & #3')
149
149
150 document_link = link_to('Test document', {:controller => 'documents', :action => 'show', :id => 1},
150 document_link = link_to('Test document', {:controller => 'documents', :action => 'show', :id => 1},
151 :class => 'document')
151 :class => 'document')
152
152
153 version_link = link_to('1.0', {:controller => 'versions', :action => 'show', :id => 2},
153 version_link = link_to('1.0', {:controller => 'versions', :action => 'show', :id => 2},
154 :class => 'version')
154 :class => 'version')
155
155
156 message_url = {:controller => 'messages', :action => 'show', :board_id => 1, :id => 4}
156 message_url = {:controller => 'messages', :action => 'show', :board_id => 1, :id => 4}
157
157
158 project_url = {:controller => 'projects', :action => 'show', :id => 'subproject1'}
158 project_url = {:controller => 'projects', :action => 'show', :id => 'subproject1'}
159
159
160 source_url = {:controller => 'repositories', :action => 'entry', :id => 'ecookbook', :path => ['some', 'file']}
160 source_url = {:controller => 'repositories', :action => 'entry', :id => 'ecookbook', :path => ['some', 'file']}
161 source_url_with_ext = {:controller => 'repositories', :action => 'entry', :id => 'ecookbook', :path => ['some', 'file.ext']}
161 source_url_with_ext = {:controller => 'repositories', :action => 'entry', :id => 'ecookbook', :path => ['some', 'file.ext']}
162
162
163 to_test = {
163 to_test = {
164 # tickets
164 # tickets
165 '#3, [#3], (#3) and #3.' => "#{issue_link}, [#{issue_link}], (#{issue_link}) and #{issue_link}.",
165 '#3, [#3], (#3) and #3.' => "#{issue_link}, [#{issue_link}], (#{issue_link}) and #{issue_link}.",
166 # changesets
166 # changesets
167 'r1' => changeset_link,
167 'r1' => changeset_link,
168 'r1.' => "#{changeset_link}.",
168 'r1.' => "#{changeset_link}.",
169 'r1, r2' => "#{changeset_link}, #{changeset_link2}",
169 'r1, r2' => "#{changeset_link}, #{changeset_link2}",
170 'r1,r2' => "#{changeset_link},#{changeset_link2}",
170 'r1,r2' => "#{changeset_link},#{changeset_link2}",
171 # documents
171 # documents
172 'document#1' => document_link,
172 'document#1' => document_link,
173 'document:"Test document"' => document_link,
173 'document:"Test document"' => document_link,
174 # versions
174 # versions
175 'version#2' => version_link,
175 'version#2' => version_link,
176 'version:1.0' => version_link,
176 'version:1.0' => version_link,
177 'version:"1.0"' => version_link,
177 'version:"1.0"' => version_link,
178 # source
178 # source
179 'source:/some/file' => link_to('source:/some/file', source_url, :class => 'source'),
179 'source:/some/file' => link_to('source:/some/file', source_url, :class => 'source'),
180 'source:/some/file.' => link_to('source:/some/file', source_url, :class => 'source') + ".",
180 'source:/some/file.' => link_to('source:/some/file', source_url, :class => 'source') + ".",
181 'source:/some/file.ext.' => link_to('source:/some/file.ext', source_url_with_ext, :class => 'source') + ".",
181 'source:/some/file.ext.' => link_to('source:/some/file.ext', source_url_with_ext, :class => 'source') + ".",
182 'source:/some/file. ' => link_to('source:/some/file', source_url, :class => 'source') + ".",
182 'source:/some/file. ' => link_to('source:/some/file', source_url, :class => 'source') + ".",
183 'source:/some/file.ext. ' => link_to('source:/some/file.ext', source_url_with_ext, :class => 'source') + ".",
183 'source:/some/file.ext. ' => link_to('source:/some/file.ext', source_url_with_ext, :class => 'source') + ".",
184 'source:/some/file, ' => link_to('source:/some/file', source_url, :class => 'source') + ",",
184 'source:/some/file, ' => link_to('source:/some/file', source_url, :class => 'source') + ",",
185 'source:/some/file@52' => link_to('source:/some/file@52', source_url.merge(:rev => 52), :class => 'source'),
185 'source:/some/file@52' => link_to('source:/some/file@52', source_url.merge(:rev => 52), :class => 'source'),
186 'source:/some/file.ext@52' => link_to('source:/some/file.ext@52', source_url_with_ext.merge(:rev => 52), :class => 'source'),
186 'source:/some/file.ext@52' => link_to('source:/some/file.ext@52', source_url_with_ext.merge(:rev => 52), :class => 'source'),
187 'source:/some/file#L110' => link_to('source:/some/file#L110', source_url.merge(:anchor => 'L110'), :class => 'source'),
187 'source:/some/file#L110' => link_to('source:/some/file#L110', source_url.merge(:anchor => 'L110'), :class => 'source'),
188 'source:/some/file.ext#L110' => link_to('source:/some/file.ext#L110', source_url_with_ext.merge(:anchor => 'L110'), :class => 'source'),
188 'source:/some/file.ext#L110' => link_to('source:/some/file.ext#L110', source_url_with_ext.merge(:anchor => 'L110'), :class => 'source'),
189 'source:/some/file@52#L110' => link_to('source:/some/file@52#L110', source_url.merge(:rev => 52, :anchor => 'L110'), :class => 'source'),
189 'source:/some/file@52#L110' => link_to('source:/some/file@52#L110', source_url.merge(:rev => 52, :anchor => 'L110'), :class => 'source'),
190 'export:/some/file' => link_to('export:/some/file', source_url.merge(:format => 'raw'), :class => 'source download'),
190 'export:/some/file' => link_to('export:/some/file', source_url.merge(:format => 'raw'), :class => 'source download'),
191 # message
191 # message
192 'message#4' => link_to('Post 2', message_url, :class => 'message'),
192 'message#4' => link_to('Post 2', message_url, :class => 'message'),
193 'message#5' => link_to('RE: post 2', message_url.merge(:anchor => 'message-5'), :class => 'message'),
193 'message#5' => link_to('RE: post 2', message_url.merge(:anchor => 'message-5'), :class => 'message'),
194 # project
194 # project
195 'project#3' => link_to('eCookbook Subproject 1', project_url, :class => 'project'),
195 'project#3' => link_to('eCookbook Subproject 1', project_url, :class => 'project'),
196 'project:subproject1' => link_to('eCookbook Subproject 1', project_url, :class => 'project'),
196 'project:subproject1' => link_to('eCookbook Subproject 1', project_url, :class => 'project'),
197 'project:"eCookbook subProject 1"' => link_to('eCookbook Subproject 1', project_url, :class => 'project'),
197 'project:"eCookbook subProject 1"' => link_to('eCookbook Subproject 1', project_url, :class => 'project'),
198 # escaping
198 # escaping
199 '!#3.' => '#3.',
199 '!#3.' => '#3.',
200 '!r1' => 'r1',
200 '!r1' => 'r1',
201 '!document#1' => 'document#1',
201 '!document#1' => 'document#1',
202 '!document:"Test document"' => 'document:"Test document"',
202 '!document:"Test document"' => 'document:"Test document"',
203 '!version#2' => 'version#2',
203 '!version#2' => 'version#2',
204 '!version:1.0' => 'version:1.0',
204 '!version:1.0' => 'version:1.0',
205 '!version:"1.0"' => 'version:"1.0"',
205 '!version:"1.0"' => 'version:"1.0"',
206 '!source:/some/file' => 'source:/some/file',
206 '!source:/some/file' => 'source:/some/file',
207 # not found
207 # not found
208 '#0123456789' => '#0123456789',
208 '#0123456789' => '#0123456789',
209 # invalid expressions
209 # invalid expressions
210 'source:' => 'source:',
210 'source:' => 'source:',
211 # url hash
211 # url hash
212 "http://foo.bar/FAQ#3" => '<a class="external" href="http://foo.bar/FAQ#3">http://foo.bar/FAQ#3</a>',
212 "http://foo.bar/FAQ#3" => '<a class="external" href="http://foo.bar/FAQ#3">http://foo.bar/FAQ#3</a>',
213 }
213 }
214 @project = Project.find(1)
214 @project = Project.find(1)
215 to_test.each { |text, result| assert_equal "<p>#{result}</p>", textilizable(text), "#{text} failed" }
215 to_test.each { |text, result| assert_equal "<p>#{result}</p>", textilizable(text), "#{text} failed" }
216 end
216 end
217
217
218 def test_attachment_links
218 def test_attachment_links
219 attachment_link = link_to('error281.txt', {:controller => 'attachments', :action => 'download', :id => '1'}, :class => 'attachment')
219 attachment_link = link_to('error281.txt', {:controller => 'attachments', :action => 'download', :id => '1'}, :class => 'attachment')
220 to_test = {
220 to_test = {
221 'attachment:error281.txt' => attachment_link
221 'attachment:error281.txt' => attachment_link
222 }
222 }
223 to_test.each { |text, result| assert_equal "<p>#{result}</p>", textilizable(text, :attachments => Issue.find(3).attachments), "#{text} failed" }
223 to_test.each { |text, result| assert_equal "<p>#{result}</p>", textilizable(text, :attachments => Issue.find(3).attachments), "#{text} failed" }
224 end
224 end
225
225
226 def test_wiki_links
226 def test_wiki_links
227 to_test = {
227 to_test = {
228 '[[CookBook documentation]]' => '<a href="/projects/ecookbook/wiki/CookBook_documentation" class="wiki-page">CookBook documentation</a>',
228 '[[CookBook documentation]]' => '<a href="/projects/ecookbook/wiki/CookBook_documentation" class="wiki-page">CookBook documentation</a>',
229 '[[Another page|Page]]' => '<a href="/projects/ecookbook/wiki/Another_page" class="wiki-page">Page</a>',
229 '[[Another page|Page]]' => '<a href="/projects/ecookbook/wiki/Another_page" class="wiki-page">Page</a>',
230 # link with anchor
230 # link with anchor
231 '[[CookBook documentation#One-section]]' => '<a href="/projects/ecookbook/wiki/CookBook_documentation#One-section" class="wiki-page">CookBook documentation</a>',
231 '[[CookBook documentation#One-section]]' => '<a href="/projects/ecookbook/wiki/CookBook_documentation#One-section" class="wiki-page">CookBook documentation</a>',
232 '[[Another page#anchor|Page]]' => '<a href="/projects/ecookbook/wiki/Another_page#anchor" class="wiki-page">Page</a>',
232 '[[Another page#anchor|Page]]' => '<a href="/projects/ecookbook/wiki/Another_page#anchor" class="wiki-page">Page</a>',
233 # page that doesn't exist
233 # page that doesn't exist
234 '[[Unknown page]]' => '<a href="/projects/ecookbook/wiki/Unknown_page" class="wiki-page new">Unknown page</a>',
234 '[[Unknown page]]' => '<a href="/projects/ecookbook/wiki/Unknown_page" class="wiki-page new">Unknown page</a>',
235 '[[Unknown page|404]]' => '<a href="/projects/ecookbook/wiki/Unknown_page" class="wiki-page new">404</a>',
235 '[[Unknown page|404]]' => '<a href="/projects/ecookbook/wiki/Unknown_page" class="wiki-page new">404</a>',
236 # link to another project wiki
236 # link to another project wiki
237 '[[onlinestore:]]' => '<a href="/projects/onlinestore/wiki/" class="wiki-page">onlinestore</a>',
237 '[[onlinestore:]]' => '<a href="/projects/onlinestore/wiki/" class="wiki-page">onlinestore</a>',
238 '[[onlinestore:|Wiki]]' => '<a href="/projects/onlinestore/wiki/" class="wiki-page">Wiki</a>',
238 '[[onlinestore:|Wiki]]' => '<a href="/projects/onlinestore/wiki/" class="wiki-page">Wiki</a>',
239 '[[onlinestore:Start page]]' => '<a href="/projects/onlinestore/wiki/Start_page" class="wiki-page">Start page</a>',
239 '[[onlinestore:Start page]]' => '<a href="/projects/onlinestore/wiki/Start_page" class="wiki-page">Start page</a>',
240 '[[onlinestore:Start page|Text]]' => '<a href="/projects/onlinestore/wiki/Start_page" class="wiki-page">Text</a>',
240 '[[onlinestore:Start page|Text]]' => '<a href="/projects/onlinestore/wiki/Start_page" class="wiki-page">Text</a>',
241 '[[onlinestore:Unknown page]]' => '<a href="/projects/onlinestore/wiki/Unknown_page" class="wiki-page new">Unknown page</a>',
241 '[[onlinestore:Unknown page]]' => '<a href="/projects/onlinestore/wiki/Unknown_page" class="wiki-page new">Unknown page</a>',
242 # striked through link
242 # striked through link
243 '-[[Another page|Page]]-' => '<del><a href="/projects/ecookbook/wiki/Another_page" class="wiki-page">Page</a></del>',
243 '-[[Another page|Page]]-' => '<del><a href="/projects/ecookbook/wiki/Another_page" class="wiki-page">Page</a></del>',
244 '-[[Another page|Page]] link-' => '<del><a href="/projects/ecookbook/wiki/Another_page" class="wiki-page">Page</a> link</del>',
244 '-[[Another page|Page]] link-' => '<del><a href="/projects/ecookbook/wiki/Another_page" class="wiki-page">Page</a> link</del>',
245 # escaping
245 # escaping
246 '![[Another page|Page]]' => '[[Another page|Page]]',
246 '![[Another page|Page]]' => '[[Another page|Page]]',
247 # project does not exist
247 # project does not exist
248 '[[unknowproject:Start]]' => '[[unknowproject:Start]]',
248 '[[unknowproject:Start]]' => '[[unknowproject:Start]]',
249 '[[unknowproject:Start|Page title]]' => '[[unknowproject:Start|Page title]]',
249 '[[unknowproject:Start|Page title]]' => '[[unknowproject:Start|Page title]]',
250 }
250 }
251 @project = Project.find(1)
251 @project = Project.find(1)
252 to_test.each { |text, result| assert_equal "<p>#{result}</p>", textilizable(text) }
252 to_test.each { |text, result| assert_equal "<p>#{result}</p>", textilizable(text) }
253 end
253 end
254
254
255 def test_html_tags
255 def test_html_tags
256 to_test = {
256 to_test = {
257 "<div>content</div>" => "<p>&lt;div&gt;content&lt;/div&gt;</p>",
257 "<div>content</div>" => "<p>&lt;div&gt;content&lt;/div&gt;</p>",
258 "<div class=\"bold\">content</div>" => "<p>&lt;div class=\"bold\"&gt;content&lt;/div&gt;</p>",
258 "<div class=\"bold\">content</div>" => "<p>&lt;div class=\"bold\"&gt;content&lt;/div&gt;</p>",
259 "<script>some script;</script>" => "<p>&lt;script&gt;some script;&lt;/script&gt;</p>",
259 "<script>some script;</script>" => "<p>&lt;script&gt;some script;&lt;/script&gt;</p>",
260 # do not escape pre/code tags
260 # do not escape pre/code tags
261 "<pre>\nline 1\nline2</pre>" => "<pre>\nline 1\nline2</pre>",
261 "<pre>\nline 1\nline2</pre>" => "<pre>\nline 1\nline2</pre>",
262 "<pre><code>\nline 1\nline2</code></pre>" => "<pre><code>\nline 1\nline2</code></pre>",
262 "<pre><code>\nline 1\nline2</code></pre>" => "<pre><code>\nline 1\nline2</code></pre>",
263 "<pre><div>content</div></pre>" => "<pre>&lt;div&gt;content&lt;/div&gt;</pre>",
263 "<pre><div>content</div></pre>" => "<pre>&lt;div&gt;content&lt;/div&gt;</pre>",
264 "HTML comment: <!-- no comments -->" => "<p>HTML comment: &lt;!-- no comments --&gt;</p>",
264 "HTML comment: <!-- no comments -->" => "<p>HTML comment: &lt;!-- no comments --&gt;</p>",
265 "<!-- opening comment" => "<p>&lt;!-- opening comment</p>",
265 "<!-- opening comment" => "<p>&lt;!-- opening comment</p>",
266 # remove attributes except class
266 # remove attributes except class
267 "<pre class='foo'>some text</pre>" => "<pre class='foo'>some text</pre>",
267 "<pre class='foo'>some text</pre>" => "<pre class='foo'>some text</pre>",
268 "<pre onmouseover='alert(1)'>some text</pre>" => "<pre>some text</pre>",
268 "<pre onmouseover='alert(1)'>some text</pre>" => "<pre>some text</pre>",
269 }
269 }
270 to_test.each { |text, result| assert_equal result, textilizable(text) }
270 to_test.each { |text, result| assert_equal result, textilizable(text) }
271 end
271 end
272
272
273 def test_allowed_html_tags
273 def test_allowed_html_tags
274 to_test = {
274 to_test = {
275 "<pre>preformatted text</pre>" => "<pre>preformatted text</pre>",
275 "<pre>preformatted text</pre>" => "<pre>preformatted text</pre>",
276 "<notextile>no *textile* formatting</notextile>" => "no *textile* formatting",
276 "<notextile>no *textile* formatting</notextile>" => "no *textile* formatting",
277 "<notextile>this is <tag>a tag</tag></notextile>" => "this is &lt;tag&gt;a tag&lt;/tag&gt;"
277 "<notextile>this is <tag>a tag</tag></notextile>" => "this is &lt;tag&gt;a tag&lt;/tag&gt;"
278 }
278 }
279 to_test.each { |text, result| assert_equal result, textilizable(text) }
279 to_test.each { |text, result| assert_equal result, textilizable(text) }
280 end
280 end
281
281
282 def test_pre_tags
282 def test_pre_tags
283 raw = <<-RAW
283 raw = <<-RAW
284 Before
284 Before
285
285
286 <pre>
286 <pre>
287 <prepared-statement-cache-size>32</prepared-statement-cache-size>
287 <prepared-statement-cache-size>32</prepared-statement-cache-size>
288 </pre>
288 </pre>
289
289
290 After
290 After
291 RAW
291 RAW
292
292
293 expected = <<-EXPECTED
293 expected = <<-EXPECTED
294 <p>Before</p>
294 <p>Before</p>
295 <pre>
295 <pre>
296 &lt;prepared-statement-cache-size&gt;32&lt;/prepared-statement-cache-size&gt;
296 &lt;prepared-statement-cache-size&gt;32&lt;/prepared-statement-cache-size&gt;
297 </pre>
297 </pre>
298 <p>After</p>
298 <p>After</p>
299 EXPECTED
299 EXPECTED
300
300
301 assert_equal expected.gsub(%r{[\r\n\t]}, ''), textilizable(raw).gsub(%r{[\r\n\t]}, '')
301 assert_equal expected.gsub(%r{[\r\n\t]}, ''), textilizable(raw).gsub(%r{[\r\n\t]}, '')
302 end
302 end
303
303
304 def test_pre_content_should_not_parse_wiki_and_redmine_links
304 def test_pre_content_should_not_parse_wiki_and_redmine_links
305 raw = <<-RAW
305 raw = <<-RAW
306 [[CookBook documentation]]
306 [[CookBook documentation]]
307
307
308 #1
308 #1
309
309
310 <pre>
310 <pre>
311 [[CookBook documentation]]
311 [[CookBook documentation]]
312
312
313 #1
313 #1
314 </pre>
314 </pre>
315 RAW
315 RAW
316
316
317 expected = <<-EXPECTED
317 expected = <<-EXPECTED
318 <p><a href="/projects/ecookbook/wiki/CookBook_documentation" class="wiki-page">CookBook documentation</a></p>
318 <p><a href="/projects/ecookbook/wiki/CookBook_documentation" class="wiki-page">CookBook documentation</a></p>
319 <p><a href="/issues/1" class="issue status-1 priority-1" title="Can't print recipes (New)">#1</a></p>
319 <p><a href="/issues/1" class="issue status-1 priority-1" title="Can't print recipes (New)">#1</a></p>
320 <pre>
320 <pre>
321 [[CookBook documentation]]
321 [[CookBook documentation]]
322
322
323 #1
323 #1
324 </pre>
324 </pre>
325 EXPECTED
325 EXPECTED
326
326
327 @project = Project.find(1)
327 @project = Project.find(1)
328 assert_equal expected.gsub(%r{[\r\n\t]}, ''), textilizable(raw).gsub(%r{[\r\n\t]}, '')
328 assert_equal expected.gsub(%r{[\r\n\t]}, ''), textilizable(raw).gsub(%r{[\r\n\t]}, '')
329 end
329 end
330
330
331 def test_non_closing_pre_blocks_should_be_closed
331 def test_non_closing_pre_blocks_should_be_closed
332 raw = <<-RAW
332 raw = <<-RAW
333 <pre><code>
333 <pre><code>
334 RAW
334 RAW
335
335
336 expected = <<-EXPECTED
336 expected = <<-EXPECTED
337 <pre><code>
337 <pre><code>
338 </code></pre>
338 </code></pre>
339 EXPECTED
339 EXPECTED
340
340
341 @project = Project.find(1)
341 @project = Project.find(1)
342 assert_equal expected.gsub(%r{[\r\n\t]}, ''), textilizable(raw).gsub(%r{[\r\n\t]}, '')
342 assert_equal expected.gsub(%r{[\r\n\t]}, ''), textilizable(raw).gsub(%r{[\r\n\t]}, '')
343 end
343 end
344
344
345 def test_syntax_highlight
345 def test_syntax_highlight
346 raw = <<-RAW
346 raw = <<-RAW
347 <pre><code class="ruby">
347 <pre><code class="ruby">
348 # Some ruby code here
348 # Some ruby code here
349 </code></pre>
349 </code></pre>
350 RAW
350 RAW
351
351
352 expected = <<-EXPECTED
352 expected = <<-EXPECTED
353 <pre><code class="ruby syntaxhl"><span class="no">1</span> <span class="c"># Some ruby code here</span>
353 <pre><code class="ruby syntaxhl"><span class=\"CodeRay\"><span class="no">1</span> <span class="c"># Some ruby code here</span></span>
354 </code></pre>
354 </code></pre>
355 EXPECTED
355 EXPECTED
356
356
357 assert_equal expected.gsub(%r{[\r\n\t]}, ''), textilizable(raw).gsub(%r{[\r\n\t]}, '')
357 assert_equal expected.gsub(%r{[\r\n\t]}, ''), textilizable(raw).gsub(%r{[\r\n\t]}, '')
358 end
358 end
359
359
360 def test_wiki_links_in_tables
360 def test_wiki_links_in_tables
361 to_test = {"|[[Page|Link title]]|[[Other Page|Other title]]|\n|Cell 21|[[Last page]]|" =>
361 to_test = {"|[[Page|Link title]]|[[Other Page|Other title]]|\n|Cell 21|[[Last page]]|" =>
362 '<tr><td><a href="/projects/ecookbook/wiki/Page" class="wiki-page new">Link title</a></td>' +
362 '<tr><td><a href="/projects/ecookbook/wiki/Page" class="wiki-page new">Link title</a></td>' +
363 '<td><a href="/projects/ecookbook/wiki/Other_Page" class="wiki-page new">Other title</a></td>' +
363 '<td><a href="/projects/ecookbook/wiki/Other_Page" class="wiki-page new">Other title</a></td>' +
364 '</tr><tr><td>Cell 21</td><td><a href="/projects/ecookbook/wiki/Last_page" class="wiki-page new">Last page</a></td></tr>'
364 '</tr><tr><td>Cell 21</td><td><a href="/projects/ecookbook/wiki/Last_page" class="wiki-page new">Last page</a></td></tr>'
365 }
365 }
366 @project = Project.find(1)
366 @project = Project.find(1)
367 to_test.each { |text, result| assert_equal "<table>#{result}</table>", textilizable(text).gsub(/[\t\n]/, '') }
367 to_test.each { |text, result| assert_equal "<table>#{result}</table>", textilizable(text).gsub(/[\t\n]/, '') }
368 end
368 end
369
369
370 def test_text_formatting
370 def test_text_formatting
371 to_test = {'*_+bold, italic and underline+_*' => '<strong><em><ins>bold, italic and underline</ins></em></strong>',
371 to_test = {'*_+bold, italic and underline+_*' => '<strong><em><ins>bold, italic and underline</ins></em></strong>',
372 '(_text within parentheses_)' => '(<em>text within parentheses</em>)',
372 '(_text within parentheses_)' => '(<em>text within parentheses</em>)',
373 'a *Humane Web* Text Generator' => 'a <strong>Humane Web</strong> Text Generator',
373 'a *Humane Web* Text Generator' => 'a <strong>Humane Web</strong> Text Generator',
374 '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>',
374 '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>',
375 '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',
375 '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',
376 }
376 }
377 to_test.each { |text, result| assert_equal "<p>#{result}</p>", textilizable(text) }
377 to_test.each { |text, result| assert_equal "<p>#{result}</p>", textilizable(text) }
378 end
378 end
379
379
380 def test_wiki_horizontal_rule
380 def test_wiki_horizontal_rule
381 assert_equal '<hr />', textilizable('---')
381 assert_equal '<hr />', textilizable('---')
382 assert_equal '<p>Dashes: ---</p>', textilizable('Dashes: ---')
382 assert_equal '<p>Dashes: ---</p>', textilizable('Dashes: ---')
383 end
383 end
384
384
385 def test_acronym
385 def test_acronym
386 assert_equal '<p>This is an acronym: <acronym title="American Civil Liberties Union">ACLU</acronym>.</p>',
386 assert_equal '<p>This is an acronym: <acronym title="American Civil Liberties Union">ACLU</acronym>.</p>',
387 textilizable('This is an acronym: ACLU(American Civil Liberties Union).')
387 textilizable('This is an acronym: ACLU(American Civil Liberties Union).')
388 end
388 end
389
389
390 def test_footnotes
390 def test_footnotes
391 raw = <<-RAW
391 raw = <<-RAW
392 This is some text[1].
392 This is some text[1].
393
393
394 fn1. This is the foot note
394 fn1. This is the foot note
395 RAW
395 RAW
396
396
397 expected = <<-EXPECTED
397 expected = <<-EXPECTED
398 <p>This is some text<sup><a href=\"#fn1\">1</a></sup>.</p>
398 <p>This is some text<sup><a href=\"#fn1\">1</a></sup>.</p>
399 <p id="fn1" class="footnote"><sup>1</sup> This is the foot note</p>
399 <p id="fn1" class="footnote"><sup>1</sup> This is the foot note</p>
400 EXPECTED
400 EXPECTED
401
401
402 assert_equal expected.gsub(%r{[\r\n\t]}, ''), textilizable(raw).gsub(%r{[\r\n\t]}, '')
402 assert_equal expected.gsub(%r{[\r\n\t]}, ''), textilizable(raw).gsub(%r{[\r\n\t]}, '')
403 end
403 end
404
404
405 def test_table_of_content
405 def test_table_of_content
406 raw = <<-RAW
406 raw = <<-RAW
407 {{toc}}
407 {{toc}}
408
408
409 h1. Title
409 h1. Title
410
410
411 Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Maecenas sed libero.
411 Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Maecenas sed libero.
412
412
413 h2. Subtitle with a [[Wiki]] link
413 h2. Subtitle with a [[Wiki]] link
414
414
415 Nullam commodo metus accumsan nulla. Curabitur lobortis dui id dolor.
415 Nullam commodo metus accumsan nulla. Curabitur lobortis dui id dolor.
416
416
417 h2. Subtitle with [[Wiki|another Wiki]] link
417 h2. Subtitle with [[Wiki|another Wiki]] link
418
418
419 h2. Subtitle with %{color:red}red text%
419 h2. Subtitle with %{color:red}red text%
420
420
421 h1. Another title
421 h1. Another title
422
422
423 RAW
423 RAW
424
424
425 expected = '<ul class="toc">' +
425 expected = '<ul class="toc">' +
426 '<li class="heading1"><a href="#Title">Title</a></li>' +
426 '<li class="heading1"><a href="#Title">Title</a></li>' +
427 '<li class="heading2"><a href="#Subtitle-with-a-Wiki-link">Subtitle with a Wiki link</a></li>' +
427 '<li class="heading2"><a href="#Subtitle-with-a-Wiki-link">Subtitle with a Wiki link</a></li>' +
428 '<li class="heading2"><a href="#Subtitle-with-another-Wiki-link">Subtitle with another Wiki link</a></li>' +
428 '<li class="heading2"><a href="#Subtitle-with-another-Wiki-link">Subtitle with another Wiki link</a></li>' +
429 '<li class="heading2"><a href="#Subtitle-with-red-text">Subtitle with red text</a></li>' +
429 '<li class="heading2"><a href="#Subtitle-with-red-text">Subtitle with red text</a></li>' +
430 '<li class="heading1"><a href="#Another-title">Another title</a></li>' +
430 '<li class="heading1"><a href="#Another-title">Another title</a></li>' +
431 '</ul>'
431 '</ul>'
432
432
433 assert textilizable(raw).gsub("\n", "").include?(expected)
433 assert textilizable(raw).gsub("\n", "").include?(expected)
434 end
434 end
435
435
436 def test_blockquote
436 def test_blockquote
437 # orig raw text
437 # orig raw text
438 raw = <<-RAW
438 raw = <<-RAW
439 John said:
439 John said:
440 > Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Maecenas sed libero.
440 > Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Maecenas sed libero.
441 > Nullam commodo metus accumsan nulla. Curabitur lobortis dui id dolor.
441 > Nullam commodo metus accumsan nulla. Curabitur lobortis dui id dolor.
442 > * Donec odio lorem,
442 > * Donec odio lorem,
443 > * sagittis ac,
443 > * sagittis ac,
444 > * malesuada in,
444 > * malesuada in,
445 > * adipiscing eu, dolor.
445 > * adipiscing eu, dolor.
446 >
446 >
447 > >Nulla varius pulvinar diam. Proin id arcu id lorem scelerisque condimentum. Proin vehicula turpis vitae lacus.
447 > >Nulla varius pulvinar diam. Proin id arcu id lorem scelerisque condimentum. Proin vehicula turpis vitae lacus.
448 > Proin a tellus. Nam vel neque.
448 > Proin a tellus. Nam vel neque.
449
449
450 He's right.
450 He's right.
451 RAW
451 RAW
452
452
453 # expected html
453 # expected html
454 expected = <<-EXPECTED
454 expected = <<-EXPECTED
455 <p>John said:</p>
455 <p>John said:</p>
456 <blockquote>
456 <blockquote>
457 Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Maecenas sed libero.
457 Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Maecenas sed libero.
458 Nullam commodo metus accumsan nulla. Curabitur lobortis dui id dolor.
458 Nullam commodo metus accumsan nulla. Curabitur lobortis dui id dolor.
459 <ul>
459 <ul>
460 <li>Donec odio lorem,</li>
460 <li>Donec odio lorem,</li>
461 <li>sagittis ac,</li>
461 <li>sagittis ac,</li>
462 <li>malesuada in,</li>
462 <li>malesuada in,</li>
463 <li>adipiscing eu, dolor.</li>
463 <li>adipiscing eu, dolor.</li>
464 </ul>
464 </ul>
465 <blockquote>
465 <blockquote>
466 <p>Nulla varius pulvinar diam. Proin id arcu id lorem scelerisque condimentum. Proin vehicula turpis vitae lacus.</p>
466 <p>Nulla varius pulvinar diam. Proin id arcu id lorem scelerisque condimentum. Proin vehicula turpis vitae lacus.</p>
467 </blockquote>
467 </blockquote>
468 <p>Proin a tellus. Nam vel neque.</p>
468 <p>Proin a tellus. Nam vel neque.</p>
469 </blockquote>
469 </blockquote>
470 <p>He's right.</p>
470 <p>He's right.</p>
471 EXPECTED
471 EXPECTED
472
472
473 assert_equal expected.gsub(%r{\s+}, ''), textilizable(raw).gsub(%r{\s+}, '')
473 assert_equal expected.gsub(%r{\s+}, ''), textilizable(raw).gsub(%r{\s+}, '')
474 end
474 end
475
475
476 def test_table
476 def test_table
477 raw = <<-RAW
477 raw = <<-RAW
478 This is a table with empty cells:
478 This is a table with empty cells:
479
479
480 |cell11|cell12||
480 |cell11|cell12||
481 |cell21||cell23|
481 |cell21||cell23|
482 |cell31|cell32|cell33|
482 |cell31|cell32|cell33|
483 RAW
483 RAW
484
484
485 expected = <<-EXPECTED
485 expected = <<-EXPECTED
486 <p>This is a table with empty cells:</p>
486 <p>This is a table with empty cells:</p>
487
487
488 <table>
488 <table>
489 <tr><td>cell11</td><td>cell12</td><td></td></tr>
489 <tr><td>cell11</td><td>cell12</td><td></td></tr>
490 <tr><td>cell21</td><td></td><td>cell23</td></tr>
490 <tr><td>cell21</td><td></td><td>cell23</td></tr>
491 <tr><td>cell31</td><td>cell32</td><td>cell33</td></tr>
491 <tr><td>cell31</td><td>cell32</td><td>cell33</td></tr>
492 </table>
492 </table>
493 EXPECTED
493 EXPECTED
494
494
495 assert_equal expected.gsub(%r{\s+}, ''), textilizable(raw).gsub(%r{\s+}, '')
495 assert_equal expected.gsub(%r{\s+}, ''), textilizable(raw).gsub(%r{\s+}, '')
496 end
496 end
497
497
498 def test_table_with_line_breaks
498 def test_table_with_line_breaks
499 raw = <<-RAW
499 raw = <<-RAW
500 This is a table with line breaks:
500 This is a table with line breaks:
501
501
502 |cell11
502 |cell11
503 continued|cell12||
503 continued|cell12||
504 |-cell21-||cell23
504 |-cell21-||cell23
505 cell23 line2
505 cell23 line2
506 cell23 *line3*|
506 cell23 *line3*|
507 |cell31|cell32
507 |cell31|cell32
508 cell32 line2|cell33|
508 cell32 line2|cell33|
509
509
510 RAW
510 RAW
511
511
512 expected = <<-EXPECTED
512 expected = <<-EXPECTED
513 <p>This is a table with line breaks:</p>
513 <p>This is a table with line breaks:</p>
514
514
515 <table>
515 <table>
516 <tr>
516 <tr>
517 <td>cell11<br />continued</td>
517 <td>cell11<br />continued</td>
518 <td>cell12</td>
518 <td>cell12</td>
519 <td></td>
519 <td></td>
520 </tr>
520 </tr>
521 <tr>
521 <tr>
522 <td><del>cell21</del></td>
522 <td><del>cell21</del></td>
523 <td></td>
523 <td></td>
524 <td>cell23<br/>cell23 line2<br/>cell23 <strong>line3</strong></td>
524 <td>cell23<br/>cell23 line2<br/>cell23 <strong>line3</strong></td>
525 </tr>
525 </tr>
526 <tr>
526 <tr>
527 <td>cell31</td>
527 <td>cell31</td>
528 <td>cell32<br/>cell32 line2</td>
528 <td>cell32<br/>cell32 line2</td>
529 <td>cell33</td>
529 <td>cell33</td>
530 </tr>
530 </tr>
531 </table>
531 </table>
532 EXPECTED
532 EXPECTED
533
533
534 assert_equal expected.gsub(%r{\s+}, ''), textilizable(raw).gsub(%r{\s+}, '')
534 assert_equal expected.gsub(%r{\s+}, ''), textilizable(raw).gsub(%r{\s+}, '')
535 end
535 end
536
536
537 def test_textile_should_not_mangle_brackets
537 def test_textile_should_not_mangle_brackets
538 assert_equal '<p>[msg1][msg2]</p>', textilizable('[msg1][msg2]')
538 assert_equal '<p>[msg1][msg2]</p>', textilizable('[msg1][msg2]')
539 end
539 end
540
540
541 def test_default_formatter
541 def test_default_formatter
542 Setting.text_formatting = 'unknown'
542 Setting.text_formatting = 'unknown'
543 text = 'a *link*: http://www.example.net/'
543 text = 'a *link*: http://www.example.net/'
544 assert_equal '<p>a *link*: <a href="http://www.example.net/">http://www.example.net/</a></p>', textilizable(text)
544 assert_equal '<p>a *link*: <a href="http://www.example.net/">http://www.example.net/</a></p>', textilizable(text)
545 Setting.text_formatting = 'textile'
545 Setting.text_formatting = 'textile'
546 end
546 end
547
547
548 def test_due_date_distance_in_words
548 def test_due_date_distance_in_words
549 to_test = { Date.today => 'Due in 0 days',
549 to_test = { Date.today => 'Due in 0 days',
550 Date.today + 1 => 'Due in 1 day',
550 Date.today + 1 => 'Due in 1 day',
551 Date.today + 100 => 'Due in about 3 months',
551 Date.today + 100 => 'Due in about 3 months',
552 Date.today + 20000 => 'Due in over 54 years',
552 Date.today + 20000 => 'Due in over 54 years',
553 Date.today - 1 => '1 day late',
553 Date.today - 1 => '1 day late',
554 Date.today - 100 => 'about 3 months late',
554 Date.today - 100 => 'about 3 months late',
555 Date.today - 20000 => 'over 54 years late',
555 Date.today - 20000 => 'over 54 years late',
556 }
556 }
557 to_test.each do |date, expected|
557 to_test.each do |date, expected|
558 assert_equal expected, due_date_distance_in_words(date)
558 assert_equal expected, due_date_distance_in_words(date)
559 end
559 end
560 end
560 end
561
561
562 def test_avatar
562 def test_avatar
563 # turn on avatars
563 # turn on avatars
564 Setting.gravatar_enabled = '1'
564 Setting.gravatar_enabled = '1'
565 assert avatar(User.find_by_mail('jsmith@somenet.foo')).include?(Digest::MD5.hexdigest('jsmith@somenet.foo'))
565 assert avatar(User.find_by_mail('jsmith@somenet.foo')).include?(Digest::MD5.hexdigest('jsmith@somenet.foo'))
566 assert avatar('jsmith <jsmith@somenet.foo>').include?(Digest::MD5.hexdigest('jsmith@somenet.foo'))
566 assert avatar('jsmith <jsmith@somenet.foo>').include?(Digest::MD5.hexdigest('jsmith@somenet.foo'))
567 assert_nil avatar('jsmith')
567 assert_nil avatar('jsmith')
568 assert_nil avatar(nil)
568 assert_nil avatar(nil)
569
569
570 # turn off avatars
570 # turn off avatars
571 Setting.gravatar_enabled = '0'
571 Setting.gravatar_enabled = '0'
572 assert_nil avatar(User.find_by_mail('jsmith@somenet.foo'))
572 assert_nil avatar(User.find_by_mail('jsmith@somenet.foo'))
573 end
573 end
574
574
575 def test_link_to_user
575 def test_link_to_user
576 user = User.find(2)
576 user = User.find(2)
577 t = link_to_user(user)
577 t = link_to_user(user)
578 assert_equal "<a href=\"/users/2\">#{ user.name }</a>", t
578 assert_equal "<a href=\"/users/2\">#{ user.name }</a>", t
579 end
579 end
580
580
581 def test_link_to_user_should_not_link_to_locked_user
581 def test_link_to_user_should_not_link_to_locked_user
582 user = User.find(5)
582 user = User.find(5)
583 assert user.locked?
583 assert user.locked?
584 t = link_to_user(user)
584 t = link_to_user(user)
585 assert_equal user.name, t
585 assert_equal user.name, t
586 end
586 end
587
587
588 def test_link_to_user_should_not_link_to_anonymous
588 def test_link_to_user_should_not_link_to_anonymous
589 user = User.anonymous
589 user = User.anonymous
590 assert user.anonymous?
590 assert user.anonymous?
591 t = link_to_user(user)
591 t = link_to_user(user)
592 assert_equal ::I18n.t(:label_user_anonymous), t
592 assert_equal ::I18n.t(:label_user_anonymous), t
593 end
593 end
594 end
594 end
General Comments 0
You need to be logged in to leave comments. Login now