From f5eb9709cf614557fe1e91e780f41168d24e4eb3 Mon Sep 17 00:00:00 2001 From: Vasilii Iakliushin <viakliushin@gitlab.com> Date: Thu, 17 Sep 2020 16:24:25 +0200 Subject: [PATCH] Check `help_page_url` by documentation link linter Related issue: https://gitlab.com/gitlab-org/gitlab/-/issues/208354 Previou implementation MR: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/35351 **Problem** The documentation link linter checks links defined by `help_page_path` helper, however it ignores links from `help_page_url`. **Solution** Extend the pattern to match both `help_page_path` and `help_page_url` helper methods --- haml_lint/linter/documentation_links.rb | 2 +- .../linter/documentation_links_spec.rb | 98 ++++++++++--------- 2 files changed, 55 insertions(+), 45 deletions(-) diff --git a/haml_lint/linter/documentation_links.rb b/haml_lint/linter/documentation_links.rb index f8e0eec5cdc6c..a36b095bc11cd 100644 --- a/haml_lint/linter/documentation_links.rb +++ b/haml_lint/linter/documentation_links.rb @@ -13,7 +13,7 @@ class DocumentationLinks < Linter DOCS_DIRECTORY = File.join(File.expand_path('../..', __dir__), 'doc') HELP_PATH_LINK_PATTERN = <<~PATTERN - `(send nil? :help_page_path $...) + `(send nil? {:help_page_url :help_page_path} $...) PATTERN MARKDOWN_HEADER = %r{\A\#{1,6}\s+(?<header>.+)\Z}.freeze diff --git a/spec/haml_lint/linter/documentation_links_spec.rb b/spec/haml_lint/linter/documentation_links_spec.rb index 68de8317b82c3..5de455b6e8c8c 100644 --- a/spec/haml_lint/linter/documentation_links_spec.rb +++ b/spec/haml_lint/linter/documentation_links_spec.rb @@ -8,75 +8,85 @@ RSpec.describe HamlLint::Linter::DocumentationLinks do include_context 'linter' - context 'when link_to points to the existing file path' do - let(:haml) { "= link_to 'Description', help_page_path('README.md')" } + shared_examples 'link validation rules' do |link_pattern| + context 'when link_to points to the existing file path' do + let(:haml) { "= link_to 'Description', #{link_pattern}('README.md')" } - it { is_expected.not_to report_lint } - end + it { is_expected.not_to report_lint } + end - context 'when link_to points to the existing file with valid anchor' do - let(:haml) { "= link_to 'Description', help_page_path('README.md', anchor: 'overview'), target: '_blank'" } + context 'when link_to points to the existing file with valid anchor' do + let(:haml) { "= link_to 'Description', #{link_pattern}('README.md', anchor: 'overview'), target: '_blank'" } - it { is_expected.not_to report_lint } - end + it { is_expected.not_to report_lint } + end - context 'when link_to points to the existing file path without .md extension' do - let(:haml) { "= link_to 'Description', help_page_path('README')" } + context 'when link_to points to the existing file path without .md extension' do + let(:haml) { "= link_to 'Description', #{link_pattern}('README')" } - it { is_expected.not_to report_lint } - end + it { is_expected.not_to report_lint } + end - context 'when anchor is not correct' do - let(:haml) { "= link_to 'Description', help_page_path('README.md', anchor: 'wrong')" } + context 'when anchor is not correct' do + let(:haml) { "= link_to 'Description', #{link_pattern}('README.md', anchor: 'wrong')" } - it { is_expected.to report_lint } + it { is_expected.to report_lint } - context 'when help_page_path has multiple options' do - let(:haml) { "= link_to 'Description', help_page_path('README.md', key: :value, anchor: 'wrong')" } + context "when #{link_pattern} has multiple options" do + let(:haml) { "= link_to 'Description', #{link_pattern}('README.md', key: :value, anchor: 'wrong')" } + + it { is_expected.to report_lint } + end + end + + context 'when file path is wrong' do + let(:haml) { "= link_to 'Description', #{link_pattern}('wrong.md'), target: '_blank'" } it { is_expected.to report_lint } end - end - context 'when file path is wrong' do - let(:haml) { "= link_to 'Description', help_page_path('wrong.md'), target: '_blank'" } + context 'when link with wrong file path is assigned to a variable' do + let(:haml) { "- my_link = link_to 'Description', #{link_pattern}('wrong.md')" } - it { is_expected.to report_lint } - end + it { is_expected.to report_lint } + end - context 'when link with wrong file path is assigned to a variable' do - let(:haml) { "- my_link = link_to 'Description', help_page_path('wrong.md')" } + context 'when it is a broken code' do + let(:haml) { "= I am broken! ]]]]" } - it { is_expected.to report_lint } - end + it { is_expected.not_to report_lint } + end - context 'when it is a broken code' do - let(:haml) { "= I am broken! ]]]]" } + context 'when anchor belongs to a different element' do + let(:haml) { "= link_to 'Description', #{link_pattern}('README.md'), target: (anchor: 'blank')" } - it { is_expected.not_to report_lint } - end + it { is_expected.not_to report_lint } + end - context 'when anchor belongs to a different element' do - let(:haml) { "= link_to 'Description', help_page_path('README.md'), target: (anchor: 'blank')" } + context "when a simple #{link_pattern}" do + let(:haml) { "- url = #{link_pattern}('wrong.md')" } - it { is_expected.not_to report_lint } - end + it { is_expected.to report_lint } + end - context 'when a simple help_page_path' do - let(:haml) { "- url = help_page_path('wrong.md')" } + context 'when link is not a string' do + let(:haml) { "- url = #{link_pattern}(help_url)" } - it { is_expected.to report_lint } - end + it { is_expected.not_to report_lint } + end - context 'when link is not a string' do - let(:haml) { "- url = help_page_path(help_url)" } + context 'when link is a part of the tag' do + let(:haml) { ".data-form{ data: { url: #{link_pattern}('wrong.md') } }" } - it { is_expected.not_to report_lint } + it { is_expected.to report_lint } + end end - context 'when link is a part of the tag' do - let(:haml) { ".data-form{ data: { url: help_page_path('wrong.md') } }" } + context 'help_page_path' do + it_behaves_like 'link validation rules', 'help_page_path' + end - it { is_expected.to report_lint } + context 'help_page_url' do + it_behaves_like 'link validation rules', 'help_page_url' end end -- GitLab