Commit 06478ef3 authored by Robert Speicher's avatar Robert Speicher

Minor Markdown feature spec reorganization

parent b07ecbb5
...@@ -33,39 +33,31 @@ require 'erb' ...@@ -33,39 +33,31 @@ require 'erb'
# See the MarkdownFeature class for setup details. # See the MarkdownFeature class for setup details.
describe 'GitLab Markdown', feature: true do describe 'GitLab Markdown', feature: true do
include ActionView::Helpers::TagHelper
include ActionView::Helpers::UrlHelper
include Capybara::Node::Matchers include Capybara::Node::Matchers
include GitlabMarkdownHelper include GitlabMarkdownHelper
# `markdown` calls these two methods
def current_user
@feat.user
end
def user_color_scheme_class
:white
end
# Let's only parse this thing once # Let's only parse this thing once
before(:all) do before(:all) do
@feat = MarkdownFeature.new @feat = MarkdownFeature.new
# `markdown` expects a `@project` variable # `gfm_with_options` depends on a `@project` variable
@project = @feat.project @project = @feat.project
@md = markdown(@feat.raw_markdown) @html = markdown(@feat.raw_markdown)
@doc = Nokogiri::HTML::DocumentFragment.parse(@md)
end end
after(:all) do after(:all) do
@feat.teardown @feat.teardown
end end
def doc
@doc ||= Nokogiri::HTML::DocumentFragment.parse(@html)
end
# Given a header ID, goes to that element's parent (the header itself), then # Given a header ID, goes to that element's parent (the header itself), then
# its next sibling element (the body). # its next sibling element (the body).
def get_section(id) def get_section(id)
@doc.at_css("##{id}").parent.next_element doc.at_css("##{id}").parent.next_element
end end
# Sometimes it can be useful to see the parsed output of the Markdown document # Sometimes it can be useful to see the parsed output of the Markdown document
...@@ -74,11 +66,11 @@ describe 'GitLab Markdown', feature: true do ...@@ -74,11 +66,11 @@ describe 'GitLab Markdown', feature: true do
# #
# it 'writes to a file' do # it 'writes to a file' do
# File.open(Rails.root.join('tmp/capybara/markdown_spec.html'), 'w') do |file| # File.open(Rails.root.join('tmp/capybara/markdown_spec.html'), 'w') do |file|
# file.puts @md # file.puts @html
# end # end
# end # end
describe 'Markdown' do describe 'Redcarpet extensions' do
describe 'No Intra Emphasis' do describe 'No Intra Emphasis' do
it 'does not parse emphasis inside of words' do it 'does not parse emphasis inside of words' do
body = get_section('no-intra-emphasis') body = get_section('no-intra-emphasis')
...@@ -95,21 +87,21 @@ describe 'GitLab Markdown', feature: true do ...@@ -95,21 +87,21 @@ describe 'GitLab Markdown', feature: true do
end end
it 'allows Markdown in tables' do it 'allows Markdown in tables' do
expect(@doc.at_css('td:contains("Baz")').children.to_html). expect(doc.at_css('td:contains("Baz")').children.to_html).
to eq '<strong>Baz</strong>' to eq '<strong>Baz</strong>'
end end
end end
describe 'Fenced Code Blocks' do describe 'Fenced Code Blocks' do
it 'parses fenced code blocks' do it 'parses fenced code blocks' do
expect(@doc).to have_selector('pre.code.highlight.white.c') expect(doc).to have_selector('pre.code.highlight.white.c')
expect(@doc).to have_selector('pre.code.highlight.white.python') expect(doc).to have_selector('pre.code.highlight.white.python')
end end
end end
describe 'Strikethrough' do describe 'Strikethrough' do
it 'parses strikethroughs' do it 'parses strikethroughs' do
expect(@doc).to have_selector(%{del:contains("and this text doesn't")}) expect(doc).to have_selector(%{del:contains("and this text doesn't")})
end end
end end
...@@ -125,28 +117,28 @@ describe 'GitLab Markdown', feature: true do ...@@ -125,28 +117,28 @@ describe 'GitLab Markdown', feature: true do
describe 'HTML::Pipeline' do describe 'HTML::Pipeline' do
describe 'SanitizationFilter' do describe 'SanitizationFilter' do
it 'uses a permissive whitelist' do it 'uses a permissive whitelist' do
expect(@doc).to have_selector('b:contains("b tag")') expect(doc).to have_selector('b:contains("b tag")')
expect(@doc).to have_selector('em:contains("em tag")') expect(doc).to have_selector('em:contains("em tag")')
expect(@doc).to have_selector('code:contains("code tag")') expect(doc).to have_selector('code:contains("code tag")')
expect(@doc).to have_selector('kbd:contains("s")') expect(doc).to have_selector('kbd:contains("s")')
expect(@doc).to have_selector('strike:contains(Emoji)') expect(doc).to have_selector('strike:contains(Emoji)')
expect(@doc).to have_selector('img[src*="smile.png"]') expect(doc).to have_selector('img[src*="smile.png"]')
expect(@doc).to have_selector('br') expect(doc).to have_selector('br')
expect(@doc).to have_selector('hr') expect(doc).to have_selector('hr')
end end
it 'permits span elements' do it 'permits span elements' do
expect(@doc).to have_selector('span:contains("span tag")') expect(doc).to have_selector('span:contains("span tag")')
end end
it 'permits table alignment' do it 'permits table alignment' do
expect(@doc.at_css('th:contains("Header")')['style']).to eq 'text-align: center' expect(doc.at_css('th:contains("Header")')['style']).to eq 'text-align: center'
expect(@doc.at_css('th:contains("Row")')['style']).to eq 'text-align: right' expect(doc.at_css('th:contains("Row")')['style']).to eq 'text-align: right'
expect(@doc.at_css('th:contains("Example")')['style']).to eq 'text-align: left' expect(doc.at_css('th:contains("Example")')['style']).to eq 'text-align: left'
expect(@doc.at_css('td:contains("Foo")')['style']).to eq 'text-align: center' expect(doc.at_css('td:contains("Foo")')['style']).to eq 'text-align: center'
expect(@doc.at_css('td:contains("Bar")')['style']).to eq 'text-align: right' expect(doc.at_css('td:contains("Bar")')['style']).to eq 'text-align: right'
expect(@doc.at_css('td:contains("Baz")')['style']).to eq 'text-align: left' expect(doc.at_css('td:contains("Baz")')['style']).to eq 'text-align: left'
end end
it 'removes `rel` attribute from links' do it 'removes `rel` attribute from links' do
...@@ -155,12 +147,12 @@ describe 'GitLab Markdown', feature: true do ...@@ -155,12 +147,12 @@ describe 'GitLab Markdown', feature: true do
end end
it "removes `href` from `a` elements if it's fishy" do it "removes `href` from `a` elements if it's fishy" do
expect(@doc).not_to have_selector('a[href*="javascript"]') expect(doc).not_to have_selector('a[href*="javascript"]')
end end
end end
describe 'Escaping' do describe 'Escaping' do
let(:table) { @doc.css('table').last.at_css('tbody') } let(:table) { doc.css('table').last.at_css('tbody') }
it 'escapes non-tag angle brackets' do it 'escapes non-tag angle brackets' do
expect(table.at_xpath('.//tr[1]/td[3]').inner_html).to eq '1 &lt; 3 &amp; 5' expect(table.at_xpath('.//tr[1]/td[3]').inner_html).to eq '1 &lt; 3 &amp; 5'
...@@ -169,28 +161,28 @@ describe 'GitLab Markdown', feature: true do ...@@ -169,28 +161,28 @@ describe 'GitLab Markdown', feature: true do
describe 'Edge Cases' do describe 'Edge Cases' do
it 'allows markup inside link elements' do it 'allows markup inside link elements' do
expect(@doc.at_css('a[href="#link-emphasis"]').to_html). expect(doc.at_css('a[href="#link-emphasis"]').to_html).
to eq %{<a href="#link-emphasis"><em>text</em></a>} to eq %{<a href="#link-emphasis"><em>text</em></a>}
expect(@doc.at_css('a[href="#link-strong"]').to_html). expect(doc.at_css('a[href="#link-strong"]').to_html).
to eq %{<a href="#link-strong"><strong>text</strong></a>} to eq %{<a href="#link-strong"><strong>text</strong></a>}
expect(@doc.at_css('a[href="#link-code"]').to_html). expect(doc.at_css('a[href="#link-code"]').to_html).
to eq %{<a href="#link-code"><code>text</code></a>} to eq %{<a href="#link-code"><code>text</code></a>}
end end
end end
describe 'EmojiFilter' do describe 'EmojiFilter' do
it 'parses Emoji' do it 'parses Emoji' do
expect(@doc).to have_selector('img.emoji', count: 10) expect(doc).to have_selector('img.emoji', count: 10)
end end
end end
describe 'TableOfContentsFilter' do describe 'TableOfContentsFilter' do
it 'creates anchors inside header elements' do it 'creates anchors inside header elements' do
expect(@doc).to have_selector('h1 a#gitlab-markdown') expect(doc).to have_selector('h1 a#gitlab-markdown')
expect(@doc).to have_selector('h2 a#markdown') expect(doc).to have_selector('h2 a#markdown')
expect(@doc).to have_selector('h3 a#autolinkfilter') expect(doc).to have_selector('h3 a#autolinkfilter')
end end
end end
...@@ -249,7 +241,7 @@ describe 'GitLab Markdown', feature: true do ...@@ -249,7 +241,7 @@ describe 'GitLab Markdown', feature: true do
describe 'ReferenceFilter' do describe 'ReferenceFilter' do
it 'handles references in headers' do it 'handles references in headers' do
header = @doc.at_css('#reference-filters-eg-1').parent header = doc.at_css('#reference-filters-eg-1').parent
expect(header.css('a').size).to eq 2 expect(header.css('a').size).to eq 2
end end
...@@ -304,6 +296,15 @@ describe 'GitLab Markdown', feature: true do ...@@ -304,6 +296,15 @@ describe 'GitLab Markdown', feature: true do
end end
end end
end end
# `markdown` calls these two methods
def current_user
@feat.user
end
def user_color_scheme_class
:white
end
end end
# This is a helper class used by the GitLab Markdown feature spec # This is a helper class used by the GitLab Markdown feature spec
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment