# frozen_string_literal: true require "rubocops/service" RSpec.describe RuboCop::Cop::FormulaAudit::Service do subject(:cop) { described_class.new } it "reports offenses when a service block is missing a required command" do expect_offense(<<~RUBY) class Foo < Formula url "https://brew.sh/foo-1.0.tgz" service do ^^^^^^^^^^ FormulaAudit/Service: Service blocks require `run` or `name` to be defined. run_type :cron working_dir "/tmp/example" end end RUBY end it "reports no offenses when a service block includes custom names and requires root" do expect_no_offenses(<<~RUBY) class Foo < Formula url "https://brew.sh/foo-1.0.tgz" service do name macos: "custom.mcxl.foo", linux: "custom.foo" require_root true end end RUBY end it "reports offenses when a service block includes more than custom names and no run command" do expect_offense(<<~RUBY) class Foo < Formula url "https://brew.sh/foo-1.0.tgz" service do ^^^^^^^^^^ FormulaAudit/Service: `run` must be defined to use methods other than `name` like [:working_dir]. name macos: "custom.mcxl.foo", linux: "custom.foo" working_dir "/tmp/example" end end RUBY end it "reports offenses when a formula's service block uses cellar paths" do expect_offense(<<~RUBY) class Foo < Formula url "https://brew.sh/foo-1.0.tgz" service do run [bin/"foo", "run", "-config", etc/"foo/config.json"] ^^^ FormulaAudit/Service: Use `opt_bin` instead of `bin` in service blocks. working_dir libexec ^^^^^^^ FormulaAudit/Service: Use `opt_libexec` instead of `libexec` in service blocks. end end RUBY expect_correction(<<~RUBY) class Foo < Formula url "https://brew.sh/foo-1.0.tgz" service do run [opt_bin/"foo", "run", "-config", etc/"foo/config.json"] working_dir opt_libexec end end RUBY end it "reports no offenses when a service block only uses opt paths" do expect_no_offenses(<<~RUBY) class Bin < Formula url "https://brew.sh/foo-1.0.tgz" service do run [opt_bin/"bin", "run", "-config", etc/"bin/config.json"] working_dir opt_libexec end end RUBY end end