resources/asciidoctor/spec/edit_me_spec.rb (333 lines of code) (raw):
# frozen_string_literal: true
require 'pathname'
require 'docbook_compat/extension'
require 'edit_me/extension'
RSpec.describe EditMe do
before(:each) do
Asciidoctor::Extensions.register DocbookCompat
Asciidoctor::Extensions.register EditMe
end
after(:each) do
Asciidoctor::Extensions.unregister_all
end
let(:spec_dir) { __dir__ }
context 'when edit_urls is invalid' do
include_context 'convert with logs'
let(:input) { 'Words' }
context 'because it is missing an edit url' do
let(:convert_attributes) { { 'edit_urls' => '<stdin>' } }
it 'emits an error' do
expect(logs).to include('ERROR: invalid edit_urls, no url')
end
end
context 'because it is missing the toplevel' do
let(:convert_attributes) { { 'edit_urls' => ',http://example.com' } }
it 'emits an error' do
expect(logs).to include('ERROR: invalid edit_urls, no toplevel')
end
end
end
##
# Includes `standard document part` for every part of the document that we
# can test using common code. Before including this in a context you have to
# define a `shared_examples 'standard document part'` that is appropriate to
# that context.
shared_examples 'all standard document parts' do
include_examples 'standard document part', 'chapter'
include_examples 'standard document part', 'section'
include_examples 'standard document part', 'appendix'
include_examples 'standard document part', 'glossary'
include_examples 'standard document part', 'bibliography'
include_examples 'standard document part', 'dedication'
include_examples 'standard document part', 'colophon'
include_examples 'standard document part', 'float'
end
context 'when edit_urls is configured' do
let(:edit_urls) do
<<~CSV
<stdin>,www.example.com/stdin
#{spec_dir},www.example.com/spec_dir
CSV
end
let(:convert_attributes) { { 'edit_urls' => edit_urls } }
def edit_link(url)
attrs = 'class="edit_me" rel="nofollow" ' \
'title="Edit this page on GitHub" href="' + url + '"'
"<a #{attrs}>edit</a>"
end
let(:stdin_link) do
edit_link 'www.example.com/stdin'
end
def spec_dir_link(file)
edit_link "www.example.com/spec_dir/resources/edit_me/#{file}"
end
include_context 'convert without logs'
shared_examples 'standard document part' do |type|
context "for a document with #{type}s" do
shared_examples 'has standard edit links' do
it "adds a link to #{type} 1" do
link = spec_dir_link "#{type}1.adoc"
expect(converted).to include(link)
end
it "adds a link to #{type} 2" do
link = spec_dir_link "#{type}2.adoc"
expect(converted).to include(link)
end
end
context "that doesn't override edit_url" do
let(:input) do
<<~ASCIIDOC
include::resources/edit_me/#{type}1.adoc[]
include::resources/edit_me/#{type}2.adoc[]
ASCIIDOC
end
include_examples 'has standard edit links'
end
context 'that overrides edit_url' do
let(:input) do
<<~ASCIIDOC
== Chapter
:edit_url: foo
include::resources/edit_me/#{type}1.adoc[]
:edit_url: bar
include::resources/edit_me/#{type}2.adoc[]
ASCIIDOC
end
context 'when overriding the edit_url is allowed' do
let(:convert_attributes) do
{
'edit_urls' => edit_urls,
'respect_edit_url_overrides' => 'true',
}
end
it 'adds a link to the enclosing chapter' do
expect(converted).to include(stdin_link)
end
it "adds a link to #{type} 1" do
link = edit_link 'foo'
expect(converted).to include(link)
end
it "adds a link to #{type} 2" do
link = edit_link 'bar'
expect(converted).to include(link)
end
context 'when overriding to an empty string' do
let(:input) do
<<~ASCIIDOC
:edit_url:
include::resources/edit_me/#{type}1.adoc[]
include::resources/edit_me/#{type}2.adoc[]
ASCIIDOC
end
it "doesn't add edit links to #{type} 1" do
expect(converted).to include("#{type.capitalize} 1</")
end
it "doesn't add edit links to #{type} 2" do
expect(converted).to include("#{type.capitalize} 2</")
end
end
end
context "when overriding the edit_url isn't allowed" do
include_examples 'has standard edit links'
end
end
end
end
include_examples 'all standard document parts'
context 'when edit_urls has two matches' do
let(:convert_attributes) do
edit_urls = <<~CSV
<stdin>,www.example.com/stdin
#{spec_dir},www.example.com/spec_dir
#{spec_dir}/resources/edit_me/section2.adoc,www.example.com/section2
CSV
{ 'edit_urls' => edit_urls }
end
let(:input) do
<<~ASCIIDOC
include::resources/edit_me/section1.adoc[]
include::resources/edit_me/section2.adoc[]
ASCIIDOC
end
it 'uses the longest match' do
link = edit_link 'www.example.com/section2'
expect(converted).to include <<~HTML
<h2 class="title"><a id="_section_2"></a>Section 2</h2>#{link}</div>
HTML
end
end
context 'when edit_urls explictly disables a path' do
let(:convert_attributes) do
edit_urls = <<~CSV
<stdin>,www.example.com/stdin
#{spec_dir},www.example.com/spec_dir
#{spec_dir}/resources/edit_me/section2.adoc,<disable>
CSV
{ 'edit_urls' => edit_urls }
end
let(:input) do
<<~ASCIIDOC
include::resources/edit_me/section1.adoc[]
include::resources/edit_me/section2.adoc[]
ASCIIDOC
end
it "doesn't have an edit me link" do
expect(converted).to include <<~HTML
<h2 class="title"><a id="_section_2"></a>Section 2</h2></div>
HTML
end
end
end
context 'when edit_urls is configured in a private book' do
let(:edit_urls) do
<<~CSV
<stdin>,www.example.com/stdin
#{spec_dir},www.example.com/spec_dir
CSV
end
let(:convert_attributes) do
{
'edit_urls' => edit_urls,
'private_edit_urls' => true,
}
end
def edit_link(url)
attrs = 'class="edit_me edit_me_private" rel="nofollow" ' \
'title="Editing on GitHub is available to Elastic" href="' + url + '"'
"<a #{attrs}>edit</a>"
end
let(:stdin_link) do
edit_link 'www.example.com/stdin'
end
def spec_dir_link(file)
edit_link "www.example.com/spec_dir/resources/edit_me/#{file}"
end
include_context 'convert without logs'
shared_examples 'standard document part' do |type|
context "for a document with #{type}s" do
shared_examples 'has standard edit links' do
it "adds a link to #{type} 1" do
link = spec_dir_link "#{type}1.adoc"
expect(converted).to include(link)
end
it "adds a link to #{type} 2" do
link = spec_dir_link "#{type}2.adoc"
expect(converted).to include(link)
end
end
context "that doesn't override edit_url" do
let(:input) do
<<~ASCIIDOC
include::resources/edit_me/#{type}1.adoc[]
include::resources/edit_me/#{type}2.adoc[]
ASCIIDOC
end
include_examples 'has standard edit links'
end
context 'that overrides edit_url' do
let(:input) do
<<~ASCIIDOC
== Chapter
:edit_url: foo
include::resources/edit_me/#{type}1.adoc[]
:edit_url: bar
include::resources/edit_me/#{type}2.adoc[]
ASCIIDOC
end
context 'when overriding the edit_url is allowed' do
let(:convert_attributes) do
{
'edit_urls' => edit_urls,
'respect_edit_url_overrides' => 'true',
'private_edit_urls' => true,
}
end
it 'adds a link to the enclosing chapter' do
expect(converted).to include(stdin_link)
end
it "adds a link to #{type} 1" do
link = edit_link 'foo'
expect(converted).to include(link)
end
it "adds a link to #{type} 2" do
link = edit_link 'bar'
expect(converted).to include(link)
end
context 'when overriding to an empty string' do
let(:input) do
<<~ASCIIDOC
:edit_url:
include::resources/edit_me/#{type}1.adoc[]
include::resources/edit_me/#{type}2.adoc[]
ASCIIDOC
end
it "doesn't add edit links to #{type} 1" do
expect(converted).to include("#{type.capitalize} 1</")
end
it "doesn't add edit links to #{type} 2" do
expect(converted).to include("#{type.capitalize} 2</")
end
end
end
context "when overriding the edit_url isn't allowed" do
include_examples 'has standard edit links'
end
end
end
end
include_examples 'all standard document parts'
context 'when edit_urls has two matches' do
let(:convert_attributes) do
edit_urls = <<~CSV
<stdin>,www.example.com/stdin
#{spec_dir},www.example.com/spec_dir
#{spec_dir}/resources/edit_me/section2.adoc,www.example.com/section2
CSV
{
'edit_urls' => edit_urls,
'private_edit_urls' => true,
}
end
let(:input) do
<<~ASCIIDOC
include::resources/edit_me/section1.adoc[]
include::resources/edit_me/section2.adoc[]
ASCIIDOC
end
it 'uses the longest match' do
link = edit_link 'www.example.com/section2'
expect(converted).to include <<~HTML
<h2 class="title"><a id="_section_2"></a>Section 2</h2>#{link}</div>
HTML
end
end
context 'when edit_urls explictly disables a path' do
let(:convert_attributes) do
edit_urls = <<~CSV
<stdin>,www.example.com/stdin
#{spec_dir},www.example.com/spec_dir
#{spec_dir}/resources/edit_me/section2.adoc,<disable>
CSV
{
'edit_urls' => edit_urls,
'private_edit_urls' => true,
}
end
let(:input) do
<<~ASCIIDOC
include::resources/edit_me/section1.adoc[]
include::resources/edit_me/section2.adoc[]
ASCIIDOC
end
it "doesn't have an edit me link" do
expect(converted).to include <<~HTML
<h2 class="title"><a id="_section_2"></a>Section 2</h2></div>
HTML
end
end
end
context 'when edit_urls is not configured' do
include_context 'convert without logs'
shared_examples 'standard document part' do |type|
context "for a document with #{type}s" do
let(:input) do
<<~ASCIIDOC
include::resources/edit_me/#{type}1.adoc[]
include::resources/edit_me/#{type}2.adoc[]
ASCIIDOC
end
it "doesn't add a link to #{type} 1" do
expect(converted).to include("#{type.capitalize} 1</")
end
it "doesn't add a link to #{type} 2" do
expect(converted).to include("#{type.capitalize} 2</")
end
end
end
include_examples 'all standard document parts'
end
end