diff --git a/Library/Homebrew/rubocops/cask/url.rb b/Library/Homebrew/rubocops/cask/url.rb index b2fe767ac5..2793d29cf4 100644 --- a/Library/Homebrew/rubocops/cask/url.rb +++ b/Library/Homebrew/rubocops/cask/url.rb @@ -8,13 +8,13 @@ module RuboCop # # @example # # bad - # url "https://example.com/foo.dmg", - # verified: "https://example.com" + # url "https://example.com/download/foo.dmg", + # verified: "https://example.com/download" # # # # good - # url "https://example.com/foo.dmg", - # verified: "example.com" + # url "https://example.com/download/foo.dmg", + # verified: "example.com/download/" # class Url < Base extend AutoCorrector @@ -30,13 +30,24 @@ module RuboCop hash_node.each_pair do |key_node, value_node| next unless key_node.source == "verified" next unless value_node.str_type? - next unless value_node.source.start_with?(%r{^"https?://}) + + if value_node.source.start_with?(%r{^"https?://}) + add_offense( + value_node.source_range, + message: "Verified URL parameter value should not start with https:// or http://.", + ) do |corrector| + corrector.replace(value_node.source_range, value_node.source.gsub(%r{^"https?://}, "\"")) + end + end + + next unless value_node.str_content.gsub(%r{https?://}, "").include?("/") # Skip if the stanza has no path. + next if value_node.str_content.end_with?("/") add_offense( value_node.source_range, - message: "Verified URL parameter value should not start with https:// or http://.", + message: "Verified URL parameter value should end with a /.", ) do |corrector| - corrector.replace(value_node.source_range, value_node.source.gsub(%r{^"https?://}, "\"")) + corrector.replace(value_node.source_range, value_node.source.gsub(/"$/, "/\"")) end end end diff --git a/Library/Homebrew/test/rubocops/cask/url_spec.rb b/Library/Homebrew/test/rubocops/cask/url_spec.rb index 23ef640b60..92c182c894 100644 --- a/Library/Homebrew/test/rubocops/cask/url_spec.rb +++ b/Library/Homebrew/test/rubocops/cask/url_spec.rb @@ -54,4 +54,50 @@ describe RuboCop::Cop::Cask::Url do include_examples "reports offenses" include_examples "autocorrects source" end + + context "when url 'verified' value has a path component that ends with a /" do + let(:source) do + <<~CASK + cask "foo" do + url "https://example.com/download/foo-v1.2.0.dmg", + verified: "example.com/download/" + end + CASK + end + + include_examples "does not report any offenses" + end + + context "when the url 'verified' value has a path component that doesn't end with a /" do + let(:source) do + <<~CASK + cask "foo" do + url "https://example.com/download/foo-v1.2.0.dmg", + verified: "example.com/download" + end + CASK + end + + let(:expected_offenses) do + [{ + message: "Verified URL parameter value should end with a /.", + severity: :convention, + line: 3, + column: 14, + source: "\"example.com/download\"", + }] + end + + let(:correct_source) do + <<~CASK + cask "foo" do + url "https://example.com/download/foo-v1.2.0.dmg", + verified: "example.com/download/" + end + CASK + end + + include_examples "reports offenses" + include_examples "autocorrects source" + end end