integtest/spec/all_books_spec.rb (949 lines of code) (raw):
# frozen_string_literal: true
require 'net/http'
require_relative 'spec_helper'
RSpec.describe 'building all books' do
shared_examples 'book basics' do |title, prefix|
context "for the #{title} book" do
page_context 'the book index', "html/#{prefix}/index.html" do
it 'contains a redirect to the only version of the book' do
expect(body).to include(
'<meta http-equiv="refresh" content="0; url=current/index.html">'
)
end
end
page_context "the current version's index",
"html/#{prefix}/current/index.html" do
it 'have the right title' do
expect(title).to eq(title)
end
it 'contains a table of contents' do
expect(body).to include('<div class="toc">')
end
end
end
end
context 'for a single book built by a single repo' do
convert_all_before_context(init_from_shell: false) do |src|
repo = src.repo_with_index 'repo', 'Some text.'
book = src.book 'Test'
book.source repo, 'index.asciidoc'
end
include_examples 'book basics', 'Test', 'test'
file_context 'raw/test/master/index.html' do
it "doesn't contain the noindex flag" do
expect(contents).not_to include(<<~HTML.strip)
<meta name="robots" content="noindex,nofollow"/>
HTML
end
end
def self.has_license(name, heading)
it "has license for #{name}" do
expect(contents).to include(<<~TXT)
/* #{name}
* #{heading}
TXT
end
end
file_context 'html/static/docs-v1.js' do
has_license 'code-prettify', 'The Apache 2.0 License'
has_license "code-prettify's lang-sql", 'The Apache 2.0 License'
has_license "code-prettify's lang-yaml", 'The Apache 2.0 License'
has_license 'details-polyfill', 'The MIT License (MIT)'
has_license 'js-cookie', 'The MIT License (MIT)'
has_license 'linkstate', 'The MIT License (MIT)'
has_license 'loose-envify', 'The MIT License (MIT)'
has_license 'preact', 'The MIT License (MIT)'
has_license 'preact-context', 'The Apache 2.0 License'
has_license 'preact-redux', 'The MIT License (MIT)'
has_license 'ramda', 'The MIT License (MIT)'
has_license 'redux', 'The MIT License (MIT)'
has_license 'redux-thunk', 'The MIT License (MIT)'
has_license 'symbol-observable', 'The MIT License (MIT)'
end
file_context 'html/static/styles-v1.css' do
has_license 'Bootstrap', 'The MIT License (MIT)'
has_license 'Inter', 'SIL OPEN FONT LICENSE'
has_license 'Noto Sans Japanese', 'SIL OPEN FONT LICENSE'
has_license 'Roboto Mono', 'APACHE LICENSE'
end
file_context 'html/static/Inter-Medium.5d08e0ba.woff2'
file_context 'html/static/NotoSansJP-Black.df80409c.woff2'
file_context 'html/static/roboto-mono-latin-400-normal.b1632429.woff2'
file_context 'html/sitemap.xml' do
it 'has an entry for the chapter' do
expect(contents).to include(<<~XML)
<loc>https://www.elastic.co/guide/test/current/chapter.html</loc>
XML
end
end
end
context 'for a single book with two chapters' do
convert_all_before_context do |src|
repo = src.repo 'repo'
repo.write 'index.asciidoc', <<~ASCIIDOC
= Title
[[chapter1]]
== Chapter 1
Some text.
[[chapter2]]
== Chapter 2
Some more text.
ASCIIDOC
repo.commit 'init'
book = src.book 'Test'
book.source repo, 'index.asciidoc'
end
include_examples 'book basics', 'Test', 'test'
file_context 'html/sitemap.xml' do
let(:chapter1_index) { contents.index 'chapter1.html' }
let(:chapter2_index) { contents.index 'chapter2.html' }
it 'the entry for chapter 1 is before the entry for chapter 2' do
# Sorting the file is important to prevent "jumping arround" when we
# rebuild it.
expect(chapter1_index).to be < chapter2_index
end
end
end
context 'for a single book built by a single repo with two sources' do
convert_all_before_context do |src|
repo = src.repo_with_index 'repo', <<~ASCIIDOC
Some text.
image::resources/readme/cat.jpg[A cat]
ASCIIDOC
root = File.expand_path '../../', __dir__
repo.cp "#{root}/resources/readme/cat.jpg", 'resources/readme/cat.jpg'
repo.commit 'add cat image'
book = src.book 'Test'
book.source repo, 'index.asciidoc'
book.source repo, 'resources'
end
include_examples 'book basics', 'Test', 'test'
page_context "the current version's raw chapter page",
'raw/test/current/chapter.html' do
it 'has a link to the image' do
expect(body).to include(<<~HTML.strip)
<img src="resources/readme/cat.jpg" alt="A cat">
HTML
end
end
page_context "the current version's chapter page",
'html/test/current/chapter.html' do
it 'has a link to the image' do
expect(body).to include(<<~HTML.strip)
<img src="resources/readme/cat.jpg" alt="A cat">
HTML
end
end
page_context "the master version's chapter page",
'html/test/master/chapter.html' do
it 'has a link to the image' do
expect(body).to include(<<~HTML.strip)
<img src="resources/readme/cat.jpg" alt="A cat">
HTML
end
end
file_context "the master version's raw chapter page",
'raw/test/master/chapter.html' do
it 'has a link to the image' do
expect(contents).to include(<<~HTML.strip)
<img src="resources/readme/cat.jpg" alt="A cat">
HTML
end
end
file_context 'html/test/current/resources/readme/cat.jpg'
file_context 'raw/test/current/resources/readme/cat.jpg'
file_context 'html/test/master/resources/readme/cat.jpg'
file_context 'raw/test/master/resources/readme/cat.jpg'
end
context 'for a single book built by two repos' do
def self.single_book_built_by_two_repos
convert_all_before_context do |src|
src.simple_include
yield src if block_given?
end
include_context 'single book built by two repos'
end
shared_context 'single book built by two repos' do
include_examples 'book basics', 'Test', 'test'
page_context 'html/test/current/chapter.html' do
it 'contains the text from the index' do
expect(body).to include('Include between here')
end
end
end
context "when the repos don't have any special configuration" do
single_book_built_by_two_repos
page_context 'html/test/current/chapter.html' do
it 'contains the included text' do
expect(body).to include('included text')
end
end
end
context 'when one of the repos has a branch map' do
single_book_built_by_two_repos do |src|
repo2 = src.repo 'repo2'
repo2.switch_to_new_branch 'override'
repo2.write 'included.asciidoc', <<~ASCIIDOC
correct text to include
ASCIIDOC
repo2.commit 'on override branch'
book = src.book 'Test'
book.source repo2, 'included.asciidoc',
map_branches: { 'master': 'override' }
end
page_context 'html/test/current/chapter.html' do
it 'contains the included text' do
expect(body).to include('correct text to include')
end
end
end
end
context 'for two books built by a single repo' do
convert_all_before_context do |src|
repo = src.repo 'repo'
repo.write 'first/index.asciidoc', <<~ASCIIDOC
= Title
== Chapter
Some text.
ASCIIDOC
repo.write 'second/index.asciidoc', <<~ASCIIDOC
= Title
== Chapter
Some text.
ASCIIDOC
repo.commit 'init'
book1 = src.book 'First'
book1.index = 'first/index.asciidoc'
book1.source repo, 'first'
book2 = src.book 'Second'
book2.index = 'second/index.asciidoc'
book2.source repo, 'second'
end
include_examples 'book basics', 'First', 'first'
include_examples 'book basics', 'Second', 'second'
end
context 'for a relative config file' do
convert_all_before_context relative_conf: true do |src|
repo = src.repo_with_index 'repo', 'Some text.'
book = src.book 'Test'
book.source repo, 'index.asciidoc'
end
include_examples 'book basics', 'Test', 'test'
end
context 'when target_branch is specified' do
convert_all_before_context target_branch: 'new_branch' do |src|
repo = src.repo_with_index 'repo', 'Some text.'
book = src.book 'Test'
book.source repo, 'index.asciidoc'
end
include_examples 'book basics', 'Test', 'test'
it 'prints that it is forking the new branch from master' do
expect(out).to include('target_repo: Forking <new_branch> from master')
end
end
context 'when a book overrides edit_me' do
def self.index
<<~ASCIIDOC
= Test
:edit_url: overridden
[[chapter]]
== Chapter
Words.
ASCIIDOC
end
def self.override_edit_me(respect)
convert_all_before_context target_branch: 'new_branch' do |src|
repo = src.repo_with_file 'repo', 'index.asciidoc', index
book = src.book 'Test'
book.respect_edit_url_overrides = true if respect
book.source repo, 'index.asciidoc'
end
end
let(:edit_me) do
<<~HTML.strip
<a class="edit_me" rel="nofollow" title="Edit this page on GitHub" href="#{edit_url}">edit</a>
HTML
end
context "when respect_edit_url_overrides isn't specified" do
override_edit_me false
let(:repo) { @src.repo 'repo' }
let(:edit_url) { "#{repo.root}/edit/master/index.asciidoc" }
page_context 'html/test/master/chapter.html' do
it 'contains the standard edit_me link' do
expect(body).to include(edit_me)
end
end
end
context 'when respect_edit_url_overrides is specified' do
override_edit_me true
let(:edit_url) { 'overridden' }
page_context 'html/test/master/chapter.html' do
it 'contains the overridden edit_me link' do
expect(body).to include(edit_me)
end
end
end
end
context 'when there is a link to elastic.co' do
convert_all_before_context do |src|
repo = src.repo_with_index 'repo', <<~ASCIIDOC
https://www.elastic.co/cloud/[link]
ASCIIDOC
book = src.book 'Test'
book.source repo, 'index.asciidoc'
end
page_context 'raw/test/master/chapter.html' do
it 'contains a relative link to www.elatic.co' do
expect(body).to include(<<~HTML.strip)
<a href="/cloud/" class="ulink" target="_top">link</a>
HTML
end
end
end
context 'for a book with many branches' do
convert_all_before_context do |src|
repo = src.repo_with_index 'repo', <<~ASCIIDOC
The branch is {source_branch}.
ASCIIDOC
repo.switch_to_new_branch 'foo'
repo.switch_to_new_branch '7.x'
repo.switch_to_new_branch '1.2'
book = src.book 'Test'
book.source repo, 'index.asciidoc'
book.branches.push 'foo', '7.x', '1.2'
end
shared_examples 'contains branch' do |branch|
it 'uses {source_branch} to resolve the branch name' do
expect(body).to include("The branch is #{branch}.")
end
end
page_context 'html/test/master/chapter.html' do
include_examples 'contains branch', 'master'
end
page_context 'html/test/foo/chapter.html' do
include_examples 'contains branch', 'foo'
end
page_context 'html/test/7.x/chapter.html' do
include_examples 'contains branch', '7.x'
end
page_context 'html/test/1.2/chapter.html' do
include_examples 'contains branch', '1.2'
end
end
context 'when one source is private' do
convert_all_before_context do |src|
repo = src.repo_with_index 'repo', <<~ASCIIDOC
Words
include::../private_repo/foo.asciidoc[]
ASCIIDOC
private_repo = src.repo 'private_repo'
private_repo.write 'foo.asciidoc', <<~ASCIIDOC
[[foo]]
== Foo
Words
ASCIIDOC
private_repo.commit 'build foo'
book = src.book 'Test'
book.source repo, 'index.asciidoc'
book.source private_repo, 'foo.asciidoc', is_private: true
end
page_context 'html/test/current/chapter.html' do
it 'does contain an edit link because it is from a public source' do
expect(body).to include(%(title="Edit this page on GitHub"))
end
end
page_context 'html/test/current/foo.html' do
it "doesn't contain an edit link because it is from a private source" do
expect(body).not_to include(%(title="Edit this page on GitHub"))
end
end
end
context 'for a book with console alternatives' do
def self.examples_dir
"#{__dir__}/../readme_examples/"
end
def self.setup_example(repo, lang, hash)
repo.cp(
"#{examples_dir}/#{lang}/#{hash}.adoc",
"examples/#{hash}.adoc"
)
repo.commit 'add example'
end
convert_all_before_context do |src|
repo = src.repo_with_index 'repo', ConsoleExamples::README_LIKE
js_repo = src.repo 'js'
setup_example js_repo, 'js', '8a7e0a79b1743d5fd94d79a7106ee930'
setup_example js_repo, 'js', '9fa2da152878d1d5933d483a3c2af35e'
csharp_repo = src.repo 'csharp'
csharp_repo.write 'dummy', 'dummy'
csharp_repo.commit 'init'
csharp_repo.switch_to_new_branch 'mapped'
setup_example csharp_repo, 'csharp', '8a7e0a79b1743d5fd94d79a7106ee930'
java_repo = src.repo 'java'
java_repo.write 'examples/dummy', 'dummy'
java_repo.commit 'init'
book = src.book 'Test'
book.source repo, 'index.asciidoc'
js_alt = { source_lang: 'console', alternative_lang: 'js' }
book.source js_repo, 'examples', alternatives: js_alt
book.source(
csharp_repo,
'examples',
map_branches: { 'master': 'mapped' },
alternatives: { source_lang: 'console', alternative_lang: 'csharp' }
)
java_alts = { source_lang: 'console', alternative_lang: 'java' }
book.source(java_repo, 'examples', alternatives: java_alts)
end
include_examples 'README-like console alternatives',
'raw/test/master', 'html/test/master'
end
context 'when run with --open' do
repo_root = File.expand_path '../../', __dir__
readme_resources = "#{repo_root}/resources/readme"
include_context 'source and dest'
before(:context) do
repo = @src.repo_with_index 'repo', <<~ASCIIDOC
Some text.
image::resources/readme/cat.jpg[A cat]
image::resources/readme/example.svg[An example svg]
ASCIIDOC
repo.cp "#{readme_resources}/cat.jpg", 'resources/readme/cat.jpg'
repo.cp "#{readme_resources}/example.svg", 'resources/readme/example.svg'
repo.commit 'add images'
book = @src.book 'Test'
book.source repo, 'index.asciidoc'
book.source repo, 'resources'
@opened_docs = @dest.prepare_convert_all(@src.conf).open
end
after(:context) do
@opened_docs&.exit
end
let(:root) { 'http://localhost:8000/guide' }
let(:book_root) { "#{root}/test/current" }
let(:guide_index) { Net::HTTP.get_response(URI("#{root}/")) }
let(:legacy_redirect) do
Net::HTTP.get_response(URI("#{root}/reference/setup/"))
end
let(:cat_image) do
Net::HTTP.get_response(URI("#{book_root}/resources/readme/cat.jpg"))
end
let(:svg_image) do
Net::HTTP.get_response(URI("#{book_root}/resources/readme/example.svg"))
end
include_examples 'the root'
include_examples 'the favicon'
it 'serves the guide index' do
expect(guide_index).to serve(doc_body(include(<<~HTML.strip)))
<a href="test/current/index.html" class="ulink" target="_top">Test
HTML
end
it 'serves a legacy redirect' do
expect(legacy_redirect).to redirect_to(
eq(
"#{root}/en/elasticsearch/reference/current/setup.html"
)
)
end
context 'for a JPG' do
it 'serves the right bytes' do
bytes = File.open("#{readme_resources}/cat.jpg", 'rb', &:read)
expect(cat_image).to serve(eq(bytes))
end
it 'serves the right Content-Type' do
expect(cat_image['Content-Type']).to eq('image/jpeg')
end
end
context 'for an SVG' do
it 'serves the right bytes' do
bytes = File.open("#{readme_resources}/example.svg", 'rb', &:read)
expect(svg_image).to serve(eq(bytes))
end
it 'serves the right Content-Type' do
expect(svg_image['Content-Type']).to eq('image/svg+xml')
end
end
end
context 'when the config has toc_extra' do
convert_all_before_context do |src|
repo = src.repo_with_index 'repo', 'words'
book = src.book 'Test'
book.source repo, 'index.asciidoc'
src.write 'toc_extra.html', '<p>extra html</p>'
book.toc_extra = 'toc_extra.html'
src.toc_extra = 'toc_extra.html'
end
file_context 'the toc', 'raw/index.html' do
it 'includes the extra html' do
expect(contents).to include(<<~HTML)
<!--EXTRA-->
<div id="extra">
<p>extra html</p>
</div>
HTML
end
end
end
context 'when a book has toc_extra' do
convert_all_before_context do |src|
repo = src.repo_with_index 'repo', 'words'
book = src.book 'Test'
book.source repo, 'index.asciidoc'
src.write 'toc_extra.html', '<p>extra html</p>'
book.toc_extra = 'toc_extra.html'
# Add a second branch to the book so it gets "versions" table of contents
repo.switch_to_new_branch 'other'
book.branches << 'other'
end
file_context 'the toc', 'raw/test/index.html' do
it 'includes the extra html' do
expect(contents).to include(<<~HTML)
<div id="extra">
<p>extra html</p>
</div>
HTML
end
end
end
context 'when a book contains migration warnings' do
shared_context 'convert with migration warnings' do |suppress|
convert_before do |src, dest|
repo = src.repo_with_index 'repo', <<~ASCIIDOC
--------
CODE HERE
----
ASCIIDOC
book = src.book 'Test'
book.source repo, 'index.asciidoc'
book.suppress_migration_warnings = suppress
dest.prepare_convert_all(src.conf).convert(expect_failure: !suppress)
dest.checkout_conversion if suppress
end
end
context 'and they are not suppressed' do
include_context 'convert with migration warnings', false
it 'fails with an appropriate error status' do
expect(statuses[0]).to eq(2)
end
it 'complains about the MIGRATION warning' do
expect(outputs[0]).to include(<<~LOG)
asciidoctor: WARNING: index.asciidoc: line 7: MIGRATION: code block end doesn't match start
LOG
end
end
context 'and they are suppressed' do
include_context 'convert with migration warnings', true
it "doesn't complain about the MIGRATION warning" do
expect(outputs[0]).not_to include(<<~LOG)
asciidoctor: WARNING: index.asciidoc: line 7: MIGRATION: code block end doesn't match start
LOG
end
file_context 'raw/test/master/chapter.html' do
it 'contains the snippet' do
expect(contents).to include('CODE HERE')
end
end
end
end
context 'when the book is configured with noindex' do
convert_all_before_context do |src|
repo = src.repo_with_index 'repo', 'test'
book = src.book 'Test'
book.source repo, 'index.asciidoc'
book.noindex = true
end
file_context 'raw/test/master/index.html' do
it 'contains the noindex flag' do
expect(contents).to include(<<~HTML.strip)
<meta name="robots" content="noindex,nofollow"/>
HTML
end
end
end
context 'when the book has "live" branches' do
convert_all_before_context do |src|
repo = src.repo_with_index 'repo', 'test'
repo.switch_to_new_branch '0.10'
repo.switch_to_new_branch '0.9_oldbutlive'
repo.switch_to_new_branch '0.8_nonlive'
book = src.book 'Test'
book.source repo, 'index.asciidoc'
book.branches = ['master', '0.10', '0.9_oldbutlive', '0.8_nonlive']
book.live_branches = ['0.10', '0.9_oldbutlive']
book.current_branch = '0.10'
end
let(:repo) { @src.repo 'repo' }
page_context 'the master branch',
'html/test/master/index.html' do
it 'contains the noindex flag' do
expect(contents).to include(<<~HTML.strip)
<meta name="robots" content="noindex,nofollow"/>
HTML
end
context 'the live versions drop down' do
it 'contains only the live branches' do
expect(body).to include(<<~HTML.strip)
<select id="live_versions"><option value="master" selected>master</option><option value="0.10">0.10</option><option value="0.9_oldbutlive">0.9_oldbutlive</option><option value="other">other versions</option></select>
HTML
end
end
context 'the other versions drop down' do
it 'contains all branches' do
expect(body).to include(<<~HTML.strip)
<span id="other_versions">other versions: <select><option value="master" selected>master</option><option value="0.10">0.10</option><option value="0.9_oldbutlive">0.9_oldbutlive</option><option value="0.8_nonlive">0.8_nonlive</option></select>
HTML
end
end
it 'includes the prelim docs header' do
expect(body).to include <<~HTML
<div class="page_header">
This documentation contains work-in-progress information for future Elastic Stack and Cloud releases. Use the version selector to view supported release docs. It also contains some Elastic Cloud serverless information. Check out our <a href="https://www.elastic.co/docs/current/serverless">serverless docs</a> for more details.
</div>
HTML
end
end
page_context "the master branch's chap",
'html/test/master/chapter.html' do
let(:edit_url) { "#{repo.root}/edit/master/index.asciidoc" }
it 'contains an edit_me link' do
expect(body).to include <<~HTML.strip
<a class="edit_me" rel="nofollow" title="Edit this page on GitHub" href="#{edit_url}">edit</a>
HTML
end
end
page_context 'the current branch', 'html/test/0.10/index.html' do
it "doesn't contain the noindex flag" do
expect(contents).not_to include(<<~HTML.strip)
<meta name="robots" content="noindex,nofollow"/>
HTML
end
context 'the live versions drop down' do
it 'contains only the live branches' do
expect(body).to include(<<~HTML.strip)
<select id="live_versions"><option value="0.10" selected>0.10</option><option value="0.9_oldbutlive">0.9_oldbutlive</option><option value="other">other versions</option></select>
HTML
end
end
context 'the other versions drop down' do
it 'contains all branches' do
expect(body).to include(<<~HTML.strip)
<span id="other_versions">other versions: <select><option value="master">master</option><option value="0.10" selected>0.10</option><option value="0.9_oldbutlive">0.9_oldbutlive</option><option value="0.8_nonlive">0.8_nonlive</option></select>
HTML
end
end
it "doesn't contain a page header" do
expect(body).not_to include 'class="page_header"'
end
end
page_context "the current branch's chap",
'html/test/0.10/chapter.html' do
let(:edit_url) { "#{repo.root}/edit/0.10/index.asciidoc" }
it 'contains an edit_me link' do
expect(body).to include <<~HTML.strip
<a class="edit_me" rel="nofollow" title="Edit this page on GitHub" href="#{edit_url}">edit</a>
HTML
end
end
page_context 'the old branch', 'html/test/0.9_oldbutlive/index.html' do
it "doesn't contain the noindex flag" do
expect(contents).not_to include(<<~HTML.strip)
<meta name="robots" content="noindex,nofollow"/>
HTML
end
context 'the live versions drop down' do
it 'contains only the live branches' do
expect(body).to include(<<~HTML.strip)
<select id="live_versions"><option value="0.10">0.10</option><option value="0.9_oldbutlive" selected>0.9_oldbutlive</option><option value="other">other versions</option></select>
HTML
end
end
context 'the other versions drop down' do
it 'contains all branches' do
expect(body).to include(<<~HTML.strip)
<span id="other_versions">other versions: <select><option value="master">master</option><option value="0.10">0.10</option><option value="0.9_oldbutlive" selected>0.9_oldbutlive</option><option value="0.8_nonlive">0.8_nonlive</option></select>
HTML
end
end
it 'includes the "old" version header' do
expect(body).to include <<~HTML
<div class="page_header">
A newer version is available. For the latest information, see the
<a href="../current/index.html">current release documentation</a>.
</div>
HTML
end
end
page_context "the old branch's chapter",
'html/test/0.9_oldbutlive/chapter.html' do
let(:edit_url) { "#{repo.root}/edit/0.9_oldbutlive/index.asciidoc" }
it 'contains an edit_me link' do
expect(body).to include <<~HTML.strip
<a class="edit_me" rel="nofollow" title="Edit this page on GitHub" href="#{edit_url}">edit</a>
HTML
end
end
page_context "the dead branch's index",
'html/test/0.8_nonlive/index.html' do
it 'contains the noindex flag' do
expect(contents).to include(<<~HTML.strip)
<meta name="robots" content="noindex,nofollow"/>
HTML
end
context 'the live versions drop down' do
it 'contains the deprecated branch' do
expect(body).to include(<<~HTML.strip)
<select id="live_versions"><option value="0.10">0.10</option><option value="0.9_oldbutlive">0.9_oldbutlive</option><option value="0.8_nonlive" selected>0.8_nonlive</option><option value="other">other versions</option>
HTML
end
end
context 'the other versions drop down' do
it 'contains all branches' do
expect(body).to include(<<~HTML.strip)
<span id="other_versions">other versions: <select><option value="master">master</option><option value="0.10">0.10</option><option value="0.9_oldbutlive">0.9_oldbutlive</option><option value="0.8_nonlive" selected>0.8_nonlive</option></select>
HTML
end
end
it 'includes the "dead" version header' do
expect(body).to include <<~HTML
<div class="page_header">
<strong>IMPORTANT</strong>: No additional bug fixes or documentation updates
will be released for this version. For the latest information, see the
<a href="../current/index.html">current release documentation</a>.
</div>
HTML
end
end
page_context "the dead branch's chapter",
'html/test/0.8_nonlive/chapter.html' do
let(:edit_url) { "#{repo.root}/edit/master/index.asciidoc" }
it "doesn't contain an edit_me link" do
expect(body).not_to include('class="edit_me"')
end
end
end
context 'when a live branch is not in the list of branches' do
convert_before do |src, dest|
repo = src.repo_with_index 'repo', 'some text'
book = src.book 'Test'
book.source repo, 'index.asciidoc'
book.branches = ['master']
book.live_branches = ['newer', 'master', 'missing']
dest.prepare_convert_all(src.conf).convert(expect_failure: true)
end
it 'fails with an appropriate error status' do
puts outputs
expect(statuses[0]).to eq(2)
end
it 'logs the missing file' do
expect(outputs[0]).to include(<<~LOG.strip)
Live branch(es) <newer, missing> not in <branches> in book <Test>
LOG
end
end
context 'when run with --announce_preview' do
target_branch = 'foo_1'
preview_location = "http://#{target_branch}.docs-preview.app.elstc.co/guide"
convert_before do |src, dest|
repo = src.repo_with_index 'repo', 'Some text.'
book = src.book 'Test'
book.source repo, 'index.asciidoc'
dest.prepare_convert_all(src.conf)
.target_branch(target_branch)
.announce_preview(preview_location)
.convert
end
it 'logs the location of the preview' do
expect(outputs[0]).to include(
"A preview will soon be available at #{preview_location}"
)
end
end
context 'when there is a NODE_NAME in the environment' do
convert_before do |src, dest|
repo = src.repo_with_index 'repo', 'Some text.'
book = src.book 'Test'
book.source repo, 'index.asciidoc'
dest.prepare_convert_all(src.conf)
.node_name('my-node-name')
.convert
end
let(:commit_info) { @dest.commit_info }
it 'adds the NODE_NAME to the commit message' do
expect(commit_info).to include('my-node-name')
end
end
context "when the index for the book isn't in the repo" do
convert_before do |src, dest|
repo = src.repo_with_index 'src', 'words'
book = src.book 'Test'
book.source repo, 'index.asciidoc'
book.index = 'not_index.asciidoc'
dest.prepare_convert_all(src.conf).convert(expect_failure: true)
end
it 'fails with an appropriate error status' do
expect(statuses[0]).to eq(2)
end
it 'logs the missing file' do
expect(outputs[0]).to match(%r{
Can't\ find\ index\ \[.+/src/not_index.asciidoc\]
}x)
end
end
context 'when a version is different than a branch' do
convert_all_before_context do |src|
repo = src.repo_with_index 'src', 'words'
repo.switch_to_new_branch 'branch-1.0'
repo.switch_to_new_branch '7.8'
book = src.book 'Version Names'
book.source repo, 'index.asciidoc'
# Even though our version numbers often don't include "v", include it here
# to make it easier to distinguish the branch name from the version name.
book.branches = [7.8, { 'branch-1.0' => 'v1.0' }]
book.current_branch = '7.8'
end
# TODO: "book basics" doesn't handle the branch=>version syntax
# include_examples "book basics", "Version Names", "version-names"
it 'includes index file for each version' do
expect(dest_file('html/index.html')).to file_exist
expect(dest_file('html/version-names/index.html')).to file_exist
expect(dest_file('html/version-names/current/index.html')).to file_exist
expect(dest_file('html/version-names/7.8/index.html')).to file_exist
expect(dest_file('html/version-names/v1.0/index.html')).to file_exist
end
it "doesn't contain index file for branch name" do
branch_index_file = 'html/version-names/branch-1.0/index.html'
expect(dest_file(branch_index_file)).not_to file_exist
end
page_context 'html/version-names/index.html' do
it 'contains the correct version name' do
expect(body).to include('Version Names: v1.0')
expect(body).to include('<a href="v1.0/index.html"')
end
it "doesn't contain the branch name" do
expect(body).not_to include('branch-1.0')
end
end
page_context 'html/version-names/v1.0/index.html' do
it 'uses the version name in the <title>' do
expect(head_title).to eq('Title [v1.0] | Elastic')
end
it "doesn't contain the branch name anywhere" do
expect(contents).not_to include('branch-1.0')
end
end
page_context 'html/version-names/current/toc.html' do
it 'contains a list item for the version' do
expect(contents).to include('<option value="v1.0">v1.0</option>')
end
it "doesn't contain the branch name anywhere" do
expect(contents).not_to include('branch-1.0')
end
end
end
context 'when asciidoctor fails' do
def self.setup
convert_before do |src, dest|
repo = src.repo_with_index 'src', 'include::missing.adoc[]'
yield repo if block_given?
book = src.book 'Test'
book.source repo, 'index.asciidoc'
dest.prepare_convert_all(src.conf).convert(expect_failure: true)
end
end
shared_examples 'error logging' do
it 'fails with an appropriate error status' do
expect(statuses[0]).to eq(2)
end
it 'logs the init' do
expect(outputs[0]).to match(/init \(.+\) <Test>/)
end
it 'logs the failure from asciidoc' do
expect(outputs[0]).to match(/
ERROR:\ index\.asciidoc:\ line\ \d+:
\ include\ file\ not\ found:\ .+missing.adoc
/x)
end
end
context "when the last commit doesn't have utf8 characters" do
setup
include_examples 'error logging'
end
context 'when the last commit has utf8 characters' do
setup do |repo|
repo.append 'index.asciidoc', <<~ASCIIDOC
words
ASCIIDOC
repo.commit 'utf8: á'
end
include_examples 'error logging'
it 'logs the utf8 line' do
expect(outputs[0]).to match(/utf8: á \(.+\) <Test>/)
end
end
end
context 'for a book with a custom index page' do
convert_all_before_context do |src|
repo = src.repo_with_index 'my-repo', 'placeholder text'
repo.write 'index-custom-title-page.html', '<h1>My Custom Header</h1>'
repo.commit 'add custom title page'
repo.switch_to_new_branch 'second-branch'
book = src.book 'Test'
book.source repo, '.'
book.branches = ['master', 'second-branch']
end
file_context 'raw/test/master/index.html' do
it 'contains the custom header' do
expect(contents).to include('<h1>My Custom Header</h1>')
end
it 'does not contain the table of contents' do
expect(contents).not_to include('START_TOC')
expect(contents).not_to include('<div class="toc">')
end
end
file_context 'raw/test/master/toc.html' do
it 'contains the table of contents' do
# extract_toc_from_index() grabs everything *between* START_TOC and
# END_TOC.
expect(contents).not_to include('START_TOC')
expect(contents).to include('<div class="toc">')
end
end
end
context 'when there is an x.10 version' do
convert_all_before_context do |src|
repo = src.repo_with_index 'src', 'placeholder text'
repo.switch_to_new_branch '7.9'
repo.switch_to_new_branch '7.10-alpha'
repo.switch_to_new_branch '7.10'
repo.switch_to_new_branch '7.11'
repo.switch_to_new_branch '7.x'
book = src.book 'Version Tests'
book.source repo, 'index.asciidoc'
book.branches = ['master', '7.x', '7.11', '7.10', '7.10-alpha', '7.9']
book.current_branch = '7.10'
end
shared_examples 'future version' do
it 'contains a "future" header' do
expect(body).to include('<div class="page_header">')
expect(body).to include('This documentation contains work-in-progress')
end
end
shared_examples 'past version' do
it 'contains a "past" header' do
expect(body).to include('<div class="page_header">')
expect(body).to include('A newer version is available.')
end
end
page_context 'html/version-tests/7.10/index.html' do
it 'does not contain a header' do
expect(body).not_to include('<div class="page_header">')
end
end
page_context 'html/version-tests/master/index.html' do
include_examples 'future version'
end
page_context 'html/version-tests/7.x/index.html' do
include_examples 'future version'
end
page_context 'html/version-tests/7.11/index.html' do
include_examples 'future version'
end
page_context 'html/version-tests/7.9/index.html' do
include_examples 'past version'
end
page_context 'html/version-tests/7.10-alpha/index.html' do
include_examples 'past version'
end
end
end