From ebe4042b2f9b7b66e1c2ee9082de002795ea0b81 Mon Sep 17 00:00:00 2001 From: Markus Reiter Date: Tue, 28 Feb 2017 13:42:52 +0100 Subject: [PATCH] Convert FormulaAuditor test to spec. --- Library/Homebrew/test/audit_test.rb | 464 ------------------ Library/Homebrew/test/dev-cmd/audit_spec.rb | 498 ++++++++++++++++++++ Library/Homebrew/test/spec_helper.rb | 4 + 3 files changed, 502 insertions(+), 464 deletions(-) delete mode 100644 Library/Homebrew/test/audit_test.rb diff --git a/Library/Homebrew/test/audit_test.rb b/Library/Homebrew/test/audit_test.rb deleted file mode 100644 index b8f01602c6..0000000000 --- a/Library/Homebrew/test/audit_test.rb +++ /dev/null @@ -1,464 +0,0 @@ -require "testing_env" -require "fileutils" -require "pathname" -require "formulary" -require "dev-cmd/audit" - -class FormulaAuditorTests < Homebrew::TestCase - def setup - super - @dir = mktmpdir - end - - def formula_auditor(name, text, options = {}) - path = Pathname.new "#{@dir}/#{name}.rb" - path.open("w") do |f| - f.write text - end - FormulaAuditor.new Formulary.factory(path), options - end - - def test_init_no_problems - fa = formula_auditor "foo", <<-EOS.undent - class Foo < Formula - url "http://example.com/foo-1.0.tgz" - end - EOS - - assert_equal [], fa.problems - end - - def test_audit_file_permissions - File.stubs(:umask).returns 022 - fa = formula_auditor "foo", <<-EOS.undent - class Foo < Formula - url "http://example.com/foo-1.0.tgz" - end - EOS - - path = fa.formula.path - path.chmod 0400 - - fa.audit_file - assert_equal ["Incorrect file permissions (400): chmod 644 #{path}"], - fa.problems - end - - def test_audit_file_data_no_end - fa = formula_auditor "foo", <<-EOS.undent - class Foo < Formula - url "http://example.com/foo-1.0.tgz" - patch :DATA - end - EOS - fa.audit_file - assert_equal ["'DATA' was found, but no '__END__'"], fa.problems - end - - def test_audit_file_end_no_data - fa = formula_auditor "foo", <<-EOS.undent - class Foo < Formula - url "http://example.com/foo-1.0.tgz" - end - __END__ - a patch goes here - EOS - fa.audit_file - assert_equal ["'__END__' was found, but 'DATA' is not used"], fa.problems - end - - def test_audit_file_no_trailing_newline - fa = formula_auditor "foo", 'class Foo "http://www.freedesktop.org/wiki/bar", - "baz" => "http://www.freedesktop.org/wiki/Software/baz", - "qux" => "https://code.google.com/p/qux", - "quux" => "http://github.com/quux", - "corge" => "http://savannah.nongnu.org/corge", - "grault" => "http://grault.github.io/", - "garply" => "http://www.gnome.org/garply", - "sf1" => "http://foo.sourceforge.net/", - "sf2" => "http://foo.sourceforge.net", - "sf3" => "http://foo.sf.net/", - "sf4" => "http://foo.sourceforge.io/", - "waldo" => "http://www.gnu.org/waldo", - } - - formula_homepages.each do |name, homepage| - fa = formula_auditor name, <<-EOS.undent - class #{Formulary.class_s(name)} < Formula - homepage "#{homepage}" - url "http://example.com/#{name}-1.0.tgz" - end - EOS - - fa.audit_homepage - if homepage =~ %r{http:\/\/www\.freedesktop\.org} - if homepage =~ /Software/ - assert_match "#{homepage} should be styled " \ - "`https://wiki.freedesktop.org/www/Software/project_name`", - fa.problems.first - else - assert_match "#{homepage} should be styled " \ - "`https://wiki.freedesktop.org/project_name`", - fa.problems.first - end - elsif homepage =~ %r{https:\/\/code\.google\.com} - assert_match "#{homepage} should end with a slash", fa.problems.first - elsif homepage =~ /foo\.(sf|sourceforge)\.net/ - assert_match "#{homepage} should be `https://foo.sourceforge.io/`", fa.problems.first - else - assert_match "Please use https:// for #{homepage}", fa.problems.first - end - end - end - - def test_audit_without_homepage - fa = formula_auditor "foo", <<-EOS.undent, online: true - class Foo < Formula - url "http://example.com/foo-1.0.tgz" - end - EOS - - fa.audit_homepage - assert_match "Formula should have a homepage.", fa.problems.first - end - - def test_audit_xcodebuild_suggests_symroot - fa = formula_auditor "foo", <<-EOS.undent - class Foo < Formula - url "http://example.com/foo-1.0.tgz" - homepage "http://example.com" - - def install - xcodebuild "-project", "meow.xcodeproject" - end - end - EOS - - fa.audit_text - - assert_match 'xcodebuild should be passed an explicit "SYMROOT"', fa.problems.first - end - - def test_audit_bare_xcodebuild_suggests_symroot_also - fa = formula_auditor "foo", <<-EOS.undent - class Foo < Formula - url "http://example.com/foo-1.0.tgz" - homepage "http://example.com" - - def install - xcodebuild - end - end - EOS - - fa.audit_text - - assert_match 'xcodebuild should be passed an explicit "SYMROOT"', fa.problems.first - end -end diff --git a/Library/Homebrew/test/dev-cmd/audit_spec.rb b/Library/Homebrew/test/dev-cmd/audit_spec.rb index 397e6912dd..c4afe65924 100644 --- a/Library/Homebrew/test/dev-cmd/audit_spec.rb +++ b/Library/Homebrew/test/dev-cmd/audit_spec.rb @@ -59,3 +59,501 @@ describe FormulaText do expect(ft.without_patch).to eq("class End < Formula\n \nend") end end + +describe FormulaAuditor do + def formula_auditor(name, text, options = {}) + path = Pathname.new "#{dir}/#{name}.rb" + path.open("w") do |f| + f.write text + end + + described_class.new(Formulary.factory(path), options) + end + + let(:dir) { @dir = Pathname.new(Dir.mktmpdir) } + + after(:each) do + dir.rmtree unless @dir.nil? + end + + describe "#problems" do + it "is empty by default" do + fa = formula_auditor "foo", <<-EOS.undent + class Foo < Formula + url "http://example.com/foo-1.0.tgz" + end + EOS + + expect(fa.problems).to be_empty + end + end + + describe "#audit_file" do + specify "file permissions" do + allow(File).to receive(:umask).and_return(022) + + fa = formula_auditor "foo", <<-EOS.undent + class Foo < Formula + url "http://example.com/foo-1.0.tgz" + end + EOS + + path = fa.formula.path + path.chmod 0400 + + fa.audit_file + expect(fa.problems) + .to eq(["Incorrect file permissions (400): chmod 644 #{path}"]) + end + + specify "DATA but no __END__" do + fa = formula_auditor "foo", <<-EOS.undent + class Foo < Formula + url "http://example.com/foo-1.0.tgz" + patch :DATA + end + EOS + + fa.audit_file + expect(fa.problems).to eq(["'DATA' was found, but no '__END__'"]) + end + + specify "__END__ but no DATA" do + fa = formula_auditor "foo", <<-EOS.undent + class Foo < Formula + url "http://example.com/foo-1.0.tgz" + end + __END__ + a patch goes here + EOS + + fa.audit_file + expect(fa.problems).to eq(["'__END__' was found, but 'DATA' is not used"]) + end + + specify "no trailing newline" do + fa = formula_auditor "foo", 'class Foo "http://www.freedesktop.org/wiki/bar", + "baz" => "http://www.freedesktop.org/wiki/Software/baz", + "qux" => "https://code.google.com/p/qux", + "quux" => "http://github.com/quux", + "corge" => "http://savannah.nongnu.org/corge", + "grault" => "http://grault.github.io/", + "garply" => "http://www.gnome.org/garply", + "sf1" => "http://foo.sourceforge.net/", + "sf2" => "http://foo.sourceforge.net", + "sf3" => "http://foo.sf.net/", + "sf4" => "http://foo.sourceforge.io/", + "waldo" => "http://www.gnu.org/waldo", + } + + formula_homepages.each do |name, homepage| + fa = formula_auditor name, <<-EOS.undent + class #{Formulary.class_s(name)} < Formula + homepage "#{homepage}" + url "http://example.com/#{name}-1.0.tgz" + end + EOS + + fa.audit_homepage + if homepage =~ %r{http:\/\/www\.freedesktop\.org} + if homepage =~ /Software/ + expect(fa.problems.first).to match( + "#{homepage} should be styled " \ + "`https://wiki.freedesktop.org/www/Software/project_name`", + ) + else + expect(fa.problems.first).to match( + "#{homepage} should be styled " \ + "`https://wiki.freedesktop.org/project_name`", + ) + end + elsif homepage =~ %r{https:\/\/code\.google\.com} + expect(fa.problems.first) + .to match("#{homepage} should end with a slash") + elsif homepage =~ /foo\.(sf|sourceforge)\.net/ + expect(fa.problems.first) + .to match("#{homepage} should be `https://foo.sourceforge.io/`") + else + expect(fa.problems.first) + .to match("Please use https:// for #{homepage}") + end + end + end + + specify "missing homepage" do + fa = formula_auditor "foo", <<-EOS.undent, online: true + class Foo < Formula + url "http://example.com/foo-1.0.tgz" + end + EOS + + fa.audit_homepage + expect(fa.problems.first).to match("Formula should have a homepage.") + end + end + + describe "#audit_text" do + specify "xcodebuild suggests symroot" do + fa = formula_auditor "foo", <<-EOS.undent + class Foo < Formula + url "http://example.com/foo-1.0.tgz" + homepage "http://example.com" + + def install + xcodebuild "-project", "meow.xcodeproject" + end + end + EOS + + fa.audit_text + expect(fa.problems.first) + .to match('xcodebuild should be passed an explicit "SYMROOT"') + end + + specify "bare xcodebuild also suggests symroot" do + fa = formula_auditor "foo", <<-EOS.undent + class Foo < Formula + url "http://example.com/foo-1.0.tgz" + homepage "http://example.com" + + def install + xcodebuild + end + end + EOS + + fa.audit_text + expect(fa.problems.first) + .to match('xcodebuild should be passed an explicit "SYMROOT"') + end + end +end diff --git a/Library/Homebrew/test/spec_helper.rb b/Library/Homebrew/test/spec_helper.rb index 193de6b8f6..7905142a80 100644 --- a/Library/Homebrew/test/spec_helper.rb +++ b/Library/Homebrew/test/spec_helper.rb @@ -36,6 +36,10 @@ RSpec.configure do |config| config.include(Test::Helper::Fixtures) config.include(Test::Helper::Formula) + config.before(:each, :needs_compat) do + skip "Requires compatibility layer." if ENV["HOMEBREW_NO_COMPAT"] + end + config.before(:each, :needs_official_cmd_taps) do skip "Needs official command Taps." unless ENV["HOMEBREW_TEST_OFFICIAL_CMD_TAPS"] end