2015-09-11 14:41:01 +05:30
|
|
|
require 'spec_helper'
|
|
|
|
require 'nokogiri'
|
|
|
|
|
|
|
|
module Gitlab
|
2017-09-10 17:25:29 +05:30
|
|
|
describe Asciidoc do
|
2015-09-11 14:41:01 +05:30
|
|
|
let(:input) { '<b>ascii</b>' }
|
|
|
|
let(:context) { {} }
|
|
|
|
let(:html) { 'H<sub>2</sub>O' }
|
|
|
|
|
|
|
|
context "without project" do
|
2017-08-17 22:00:37 +05:30
|
|
|
before do
|
|
|
|
allow_any_instance_of(ApplicationSetting).to receive(:current).and_return(::ApplicationSetting.create_from_defaults)
|
|
|
|
end
|
|
|
|
|
2016-09-13 17:45:13 +05:30
|
|
|
it "converts the input using Asciidoctor and default options" do
|
2015-09-11 14:41:01 +05:30
|
|
|
expected_asciidoc_opts = {
|
|
|
|
safe: :secure,
|
2017-08-17 22:00:37 +05:30
|
|
|
backend: :gitlab_html5,
|
2015-09-11 14:41:01 +05:30
|
|
|
attributes: described_class::DEFAULT_ADOC_ATTRS
|
|
|
|
}
|
|
|
|
|
|
|
|
expect(Asciidoctor).to receive(:convert)
|
|
|
|
.with(input, expected_asciidoc_opts).and_return(html)
|
|
|
|
|
2017-08-17 22:00:37 +05:30
|
|
|
expect(render(input, context)).to eq(html)
|
2015-09-11 14:41:01 +05:30
|
|
|
end
|
|
|
|
|
|
|
|
context "with asciidoc_opts" do
|
2016-09-13 17:45:13 +05:30
|
|
|
it "merges the options with default ones" do
|
2015-09-11 14:41:01 +05:30
|
|
|
expected_asciidoc_opts = {
|
2017-08-17 22:00:37 +05:30
|
|
|
safe: :secure,
|
|
|
|
backend: :gitlab_html5,
|
|
|
|
attributes: described_class::DEFAULT_ADOC_ATTRS
|
2015-09-11 14:41:01 +05:30
|
|
|
}
|
|
|
|
|
|
|
|
expect(Asciidoctor).to receive(:convert)
|
|
|
|
.with(input, expected_asciidoc_opts).and_return(html)
|
|
|
|
|
2017-08-17 22:00:37 +05:30
|
|
|
render(input, context)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
context "XSS" do
|
|
|
|
links = {
|
|
|
|
'links' => {
|
|
|
|
input: 'link:mylink"onmouseover="alert(1)[Click Here]',
|
|
|
|
output: "<div>\n<p><a href=\"mylink\">Click Here</a></p>\n</div>"
|
|
|
|
},
|
|
|
|
'images' => {
|
|
|
|
input: 'image:https://localhost.com/image.png[Alt text" onerror="alert(7)]',
|
|
|
|
output: "<img src=\"https://localhost.com/image.png\" alt=\"Alt text\">"
|
|
|
|
},
|
|
|
|
'pre' => {
|
|
|
|
input: '```mypre"><script>alert(3)</script>',
|
|
|
|
output: "<div>\n<div>\n<pre lang=\"mypre\">\"><code></code></pre>\n</div>\n</div>"
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
links.each do |name, data|
|
|
|
|
it "does not convert dangerous #{name} into HTML" do
|
|
|
|
expect(render(data[:input], context)).to include(data[:output])
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
context 'external links' do
|
|
|
|
it 'adds the `rel` attribute to the link' do
|
|
|
|
output = render('link:https://google.com[Google]', context)
|
|
|
|
|
|
|
|
expect(output).to include('rel="nofollow noreferrer noopener"')
|
2015-09-11 14:41:01 +05:30
|
|
|
end
|
|
|
|
end
|
2017-09-10 17:25:29 +05:30
|
|
|
|
|
|
|
context 'LaTex code' do
|
|
|
|
it 'adds class js-render-math to the output' do
|
|
|
|
input = <<~MD
|
|
|
|
:stem: latexmath
|
|
|
|
|
|
|
|
[stem]
|
|
|
|
++++
|
|
|
|
\sqrt{4} = 2
|
|
|
|
++++
|
|
|
|
|
|
|
|
another part
|
|
|
|
|
|
|
|
[latexmath]
|
|
|
|
++++
|
|
|
|
\beta_x \gamma
|
|
|
|
++++
|
|
|
|
|
|
|
|
stem:[2+2] is 4
|
|
|
|
MD
|
|
|
|
|
|
|
|
expect(render(input, context)).to include('<pre data-math-style="display" class="code math js-render-math"><code>eta_x gamma</code></pre>')
|
|
|
|
expect(render(input, context)).to include('<p><code data-math-style="inline" class="code math js-render-math">2+2</code> is 4</p>')
|
|
|
|
end
|
|
|
|
end
|
2015-09-11 14:41:01 +05:30
|
|
|
end
|
|
|
|
|
|
|
|
def render(*args)
|
|
|
|
described_class.render(*args)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|