integtest/spec/all_books_broken_link_detection_spec.rb (251 lines of code) (raw):

# frozen_string_literal: true require_relative 'spec_helper' ## # Assertions about when books are rebuilt based on changes in source # repositories or the book's configuration. RSpec.describe 'building all books' do KIBANA_LINKS_FILE = 'src/core/public/doc_links/doc_links_service.ts' shared_context 'there is a broken link in the docs' do |text, check_links| convert_before do |src, dest| repo = src.repo_with_index 'repo', text book = src.book 'Test' book.source repo, 'index.asciidoc' convert = dest.prepare_convert_all src.conf convert.skip_link_check unless check_links convert.convert(expect_failure: check_links) end end shared_context 'there is a broken absolute link in the docs' do |check_links| include_context 'there is a broken link in the docs', 'https://www.elastic.co/guide/foo', check_links end shared_context 'there is a broken relative link in the docs' do |check_links| include_context 'there is a broken link in the docs', 'link:/guide/foo[]', check_links end shared_context 'there is a kibana link' do |check_links, url, expect_failure| convert_before do |src, dest| # Kibana is special and we check links in it with a little magic kibana_repo = src.repo 'kibana' kibana_repo.write KIBANA_LINKS_FILE, <<~JS export const documentationLinks = { foo: `#{url}`, }; JS kibana_repo.commit 'init' # TODO: remove as part of https://github.com/elastic/docs/issues/2264, # and make "main" the default branch for all repos. kibana_repo.rename_branch 'main' # The preview of the book is important here because it is how we detect # the versions of kibana to check. # TODO: This is probably worth generalizing. Lots of repos reference docs. repo = src.repo_with_index 'repo', "Doesn't matter" # TODO: remove as part of https://github.com/elastic/docs/issues/2264 repo.rename_branch 'main' book = src.book 'Test', prefix: 'en/kibana' book.source repo, 'index.asciidoc' # TODO: remove as part of https://github.com/elastic/docs/issues/2264 book.branches = [{ "main": 'master' }] book.live_branches = ['main'] book.current_branch = 'main' convert = dest.prepare_convert_all src.conf convert.skip_link_check unless check_links convert.convert(expect_failure: expect_failure) end end shared_context 'there is a broken link in kibana' do |check_links| # If we check links, we expect failure, and if we don't check links, we # don't expect failure. include_context 'there is a kibana link', check_links, '${ELASTIC_WEBSITE_URL}guide/foo', check_links end describe 'when broken link detection is disabled' do describe 'when there is a broken absolute link in the docs' do include_context 'there is a broken absolute link in the docs', false it 'logs that it skipped link checking' do expect(outputs[0]).to include('Skipped Checking links') end end describe 'when there is a broken relative link in the docs' do include_context 'there is a broken relative link in the docs', false it 'logs that it skipped link checking' do expect(outputs[0]).to include('Skipped Checking links') end end describe 'when there is a broken link in kibana' do include_context 'there is a broken link in kibana', false it 'logs that it skipped link checking' do expect(outputs[0]).to include('Skipped Checking links') end end end describe 'when broken link detection is enabled' do shared_examples 'all links are ok' do it 'logs that all the links are ok' do expect(outputs[-1]).to include('All cross-document links OK') end end shared_examples 'there are broken links in the docs' do it 'logs there are bad cross document links' do expect(outputs[-1]).to include('Bad cross-document links:') end it 'logs the bad link' do expect(outputs[-1]).to include(indent(<<~LOG.strip, ' ')) /tmp/docsbuild/target_repo/html/test/current/chapter.html contains broken links to: - foo LOG end end shared_examples 'there are broken links in kibana' do |url| it 'logs there are bad cross document links' do expect(outputs[-1]).to include('Bad cross-document links:') end it 'logs the bad link' do expect(outputs[-1]).to include(indent(<<~LOG.strip, ' ')) Kibana [master]: src/core/public/doc_links/doc_links_service.ts contains broken links to: - #{url} LOG end end describe 'when all of the links are intact' do convert_before do |src, dest| repo = src.repo_with_index( 'repo', 'https://www.elastic.co/guide/test/current/chapter.html' ) book = src.book 'Test' book.source repo, 'index.asciidoc' dest.prepare_convert_all(src.conf).convert end include_examples 'all links are ok' end describe 'when there is a broken absolute link in the docs' do include_context 'there is a broken absolute link in the docs', true include_examples 'there are broken links in the docs' end describe 'when there is a broken relative link in the docs' do include_context 'there is a broken relative link in the docs', true include_examples 'there are broken links in the docs' end describe 'when there is a broken link in kibana' do include_context 'there is a broken link in kibana', true include_examples 'there are broken links in kibana', 'foo' end describe 'when a link in kibana goes to the website outside the guide' do include_context 'there is a kibana link', true, '${ELASTIC_WEBSITE_URL}not-part-of-the-guide', false include_examples 'all links are ok' end describe 'when a link in kibana goes to an Elastic GitHub URL' do include_context 'there is a kibana link', true, '${ELASTIC_GITHUB}kibana/issues/new/choose', false include_examples 'all links are ok' end describe 'when there is a broken APM link' do include_context 'there is a kibana link', true, '${APM_DOCS}not-an-apm-page.html', true include_examples 'there are broken links in kibana', 'en/apm/not-an-apm-page.html' end describe 'when using --keep_hash and --sub_dir together like a PR test' do describe 'when there is a broken link in one of the books being built' do convert_before do |src, dest| repo1 = src.repo_with_index 'repo1', "Doesn't matter" book1 = src.book 'Test1' book1.source repo1, 'index.asciidoc' repo2 = src.repo_with_index 'repo2', "Also doesn't matter" book2 = src.book 'Test2' book2.source repo2, 'index.asciidoc' dest.prepare_convert_all(src.conf).convert repo2.write 'index.asciidoc', <<~ASCIIDOC = Title [[chapter]] == Chapter https://www.elastic.co/guide/foo ASCIIDOC dest.prepare_convert_all(src.conf) .keep_hash .sub_dir(repo2, 'master') .convert(expect_failure: true) end it 'logs there are bad cross document links' do expect(outputs[1]).to include('Bad cross-document links:') end it 'logs the bad link' do expect(outputs[1]).to include(indent(<<~LOG.strip, ' ')) /tmp/docsbuild/target_repo/html/test2/current/chapter.html contains broken links to: - foo LOG end end describe "when there is a broken link in a book that isn't being built" do convert_before do |src, dest| repo1 = src.repo_with_index 'repo1', "Doesn't matter" book1 = src.book 'Test1' book1.source repo1, 'index.asciidoc' repo2 = src.repo_with_index 'repo2', "Also doesn't matter" book2 = src.book 'Test2' book2.source repo2, 'index.asciidoc' dest.prepare_convert_all(src.conf).convert repo1.write 'index.asciidoc', <<~ASCIIDOC = Title [[chapter]] == Chapter https://www.elastic.co/guide/foo ASCIIDOC dest.prepare_convert_all(src.conf) .keep_hash .sub_dir(repo2, 'master') .convert end include_examples 'all links are ok' end describe 'when there is a broken link in kibana' do def self.setup(src, dest) kibana_repo = src.repo_with_index 'kibana', "Doesn't matter" # TODO: remove as part of https://github.com/elastic/docs/issues/2264, # and make "main" the default branch for all repos. kibana_repo.rename_branch 'main' kibana_repo.write KIBANA_LINKS_FILE, 'no links here' kibana_repo.commit 'add empty links file' kibana_book = src.book 'Kibana', prefix: 'en/kibana' kibana_book.source kibana_repo, 'index.asciidoc' # TODO: remove as part of https://github.com/elastic/docs/issues/2264 kibana_book.branches = [{ "main": 'master' }] kibana_book.live_branches = ['main'] kibana_book.current_branch = 'main' repo2 = src.repo_with_index 'repo2', "Also doesn't matter" # TODO: remove as part of https://github.com/elastic/docs/issues/2264 repo2.rename_branch 'main' book2 = src.book 'Test2' book2.source repo2, 'index.asciidoc' # TODO: remove as part of https://github.com/elastic/docs/issues/2264 book2.branches = [{ "main": 'master' }] book2.live_branches = ['main'] book2.current_branch = 'main' dest.prepare_convert_all(src.conf).convert kibana_repo.write KIBANA_LINKS_FILE, <<~JS export const documentationLinks = { foo: `${ELASTIC_WEBSITE_URL}guide/bar`, }; JS end describe 'when the broken link is in an unbuilt branch' do convert_before do |src, dest| setup src, dest src.repo('kibana').commit 'add bad link' dest.prepare_convert_all(src.conf) .keep_hash .sub_dir(src.repo('repo2'), 'master') .convert end include_examples 'all links are ok' end describe 'when the broken link is in a *new* unbuilt branch' do convert_before do |src, dest| setup src, dest kibana = src.repo('kibana') kibana.switch_to_new_branch 'new_branch' kibana.commit 'add bad link' dest.prepare_convert_all(src.conf) .keep_hash .sub_dir(src.repo('repo2'), 'master') .convert end include_examples 'all links are ok' end describe 'when the broken link is in the --sub_dir' do convert_before do |src, dest| setup src, dest dest.prepare_convert_all(src.conf) .keep_hash .sub_dir(src.repo('kibana'), 'main') .convert(expect_failure: true) end include_examples 'there are broken links in kibana', 'bar' end end end end end