require "testing_env" require "fileutils" require "pathname" require "formulary" require "dev-cmd/audit" class FormulaTextTests < Homebrew::TestCase def setup super @dir = mktmpdir end def formula_text(name, body = nil, options = {}) path = Pathname.new "#{@dir}/#{name}.rb" path.open("w") do |f| f.write <<-EOS.undent class #{Formulary.class_s(name)} < Formula #{body} end #{options[:patch]} EOS end FormulaText.new path end def test_simple_valid_formula ft = formula_text "valid", 'url "http://www.example.com/valid-1.0.tar.gz"' refute ft.data?, "The formula should not have DATA" refute ft.end?, "The formula should not have __END__" assert ft.trailing_newline?, "The formula should have a trailing newline" assert ft =~ /\burl\b/, "The formula should match 'url'" assert_nil ft.line_number(/desc/), "The formula should not match 'desc'" assert_equal 2, ft.line_number(/\burl\b/) assert ft.include?("Valid"), "The formula should include \"Valid\"" end def test_trailing_newline ft = formula_text "newline" assert ft.trailing_newline?, "The formula must have a trailing newline" end def test_has_data ft = formula_text "data", "patch :DATA" assert ft.data?, "The formula must have DATA" end def test_has_end ft = formula_text "end", "", patch: "__END__\na patch here" assert ft.end?, "The formula must have __END__" assert_equal "class End < Formula\n \nend", ft.without_patch end end 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 end