brew/Library/Homebrew/test/rubocops/cask/stanza_grouping_spec.rb
Claudia 5be80a78f6
Use Homebrew-controlled domain for Cask dummy URLs
In a number of Cask specs, the value of the `homepage` stanza is currently set
to https://example.com. As of 2018-11-28, the TLS certificate served by
example.com seems to be expired, possibly due to an oversight on ICANN’s side.

While the certificate is certainly going to be renewed soon, it would be
desirable for Homebrew’s test result to be less dependent on ICANN’s actions.
This commit changes the homepages of all test Casks to http://brew.sh, whose
domain and TLS certificate are both controlled by Homebrew.
2018-11-28 20:51:55 +01:00

301 lines
6.5 KiB
Ruby

require "rubocops/rubocop-cask"
require "test/rubocops/cask/shared_examples/cask_cop"
describe RuboCop::Cop::Cask::StanzaGrouping do
include CaskCop
subject(:cop) { described_class.new }
let(:missing_line_msg) do
"stanza groups should be separated by a single empty line"
end
let(:extra_line_msg) do
"stanzas within the same group should have no lines between them"
end
context "when there is only one stanza" do
let(:source) do
<<-CASK.undent
cask 'foo' do
version :latest
end
CASK
end
include_examples "does not report any offenses"
end
context "when no stanzas are incorrectly grouped" do
let(:source) do
<<-CASK.undent
cask 'foo' do
version :latest
sha256 :no_check
end
CASK
end
include_examples "does not report any offenses"
end
context "when one stanza is incorrectly grouped" do
let(:source) do
<<-CASK.undent
cask 'foo' do
version :latest
sha256 :no_check
end
CASK
end
let(:correct_source) do
<<-CASK.undent
cask 'foo' do
version :latest
sha256 :no_check
end
CASK
end
let(:expected_offenses) do
[{
message: extra_line_msg,
severity: :convention,
line: 3,
column: 0,
source: "\n",
}]
end
include_examples "reports offenses"
include_examples "autocorrects source"
end
context "when many stanzas are incorrectly grouped" do
let(:source) do
<<-CASK.undent
cask 'foo' do
version :latest
sha256 :no_check
url 'https://foo.brew.sh/foo.zip'
name 'Foo'
homepage 'https://foo.brew.sh'
app 'Foo.app'
uninstall :quit => 'com.example.foo',
:kext => 'com.example.foo.kextextension'
end
CASK
end
let(:correct_source) do
<<-CASK.undent
cask 'foo' do
version :latest
sha256 :no_check
url 'https://foo.brew.sh/foo.zip'
name 'Foo'
homepage 'https://foo.brew.sh'
app 'Foo.app'
uninstall :quit => 'com.example.foo',
:kext => 'com.example.foo.kextextension'
end
CASK
end
let(:expected_offenses) do
[{
message: missing_line_msg,
severity: :convention,
line: 4,
column: 0,
source: " url 'https://foo.brew.sh/foo.zip'",
}, {
message: extra_line_msg,
severity: :convention,
line: 5,
column: 0,
source: "\n",
}, {
message: extra_line_msg,
severity: :convention,
line: 7,
column: 0,
source: "\n",
}, {
message: missing_line_msg,
severity: :convention,
line: 11,
column: 0,
source: " uninstall :quit => 'com.example.foo',",
}]
end
include_examples "reports offenses"
include_examples "autocorrects source"
end
context "when caveats stanza is incorrectly grouped" do
let(:source) do
format(<<-CASK.undent, caveats: caveats.strip)
cask 'foo' do
version :latest
sha256 :no_check
url 'https://foo.brew.sh/foo.zip'
name 'Foo'
app 'Foo.app'
%{caveats}
end
CASK
end
let(:correct_source) do
format(<<-CASK.undent, caveats: caveats.strip)
cask 'foo' do
version :latest
sha256 :no_check
url 'https://foo.brew.sh/foo.zip'
name 'Foo'
app 'Foo.app'
%{caveats}
end
CASK
end
context "when caveats is a one-line string" do
let(:caveats) { "caveats 'This is a one-line caveat.'" }
include_examples "autocorrects source"
end
context "when caveats is a heredoc" do
let(:caveats) do
<<-CAVEATS.undent
caveats <<-EOS.undent
This is a multiline caveat.
Let's hope it doesn't cause any problems!
EOS
CAVEATS
end
include_examples "autocorrects source"
end
context "when caveats is a block" do
let(:caveats) do
<<-CAVEATS.undent
caveats do
puts 'This is a multiline caveat.'
puts "Let's hope it doesn't cause any problems!"
end
CAVEATS
end
include_examples "autocorrects source"
end
end
context "when the postflight stanza is incorrectly grouped" do
let(:source) do
<<-CASK.undent
cask 'foo' do
version :latest
sha256 :no_check
url 'https://foo.brew.sh/foo.zip'
name 'Foo'
app 'Foo.app'
postflight do
puts 'We have liftoff!'
end
end
CASK
end
let(:correct_source) do
<<-CASK.undent
cask 'foo' do
version :latest
sha256 :no_check
url 'https://foo.brew.sh/foo.zip'
name 'Foo'
app 'Foo.app'
postflight do
puts 'We have liftoff!'
end
end
CASK
end
include_examples "autocorrects source"
end
context "when a stanza has a comment" do
let(:source) do
<<-CASK.undent
cask 'foo' do
version :latest
sha256 :no_check
# comment with an empty line between
# comment directly above
postflight do
puts 'We have liftoff!'
end
url 'https://foo.brew.sh/foo.zip'
name 'Foo'
app 'Foo.app'
end
CASK
end
let(:correct_source) do
<<-CASK.undent
cask 'foo' do
version :latest
sha256 :no_check
# comment with an empty line between
# comment directly above
postflight do
puts 'We have liftoff!'
end
url 'https://foo.brew.sh/foo.zip'
name 'Foo'
app 'Foo.app'
end
CASK
end
include_examples "autocorrects source"
end
# TODO: detect incorrectly grouped stanzas in nested expressions
context "when stanzas are nested in a conditional expression" do
let(:source) do
<<-CASK.undent
cask 'foo' do
if true
version :latest
sha256 :no_check
end
end
CASK
end
include_examples "does not report any offenses"
end
end