mirror of
https://github.com/Evolix/chexpire.git
synced 2024-05-05 02:05:09 +02:00
SystemCommand wrapper
This commit is contained in:
parent
2a329ad934
commit
022d681c33
37
app/services/system_command.rb
Normal file
37
app/services/system_command.rb
Normal file
|
@ -0,0 +1,37 @@
|
|||
require "null_logger"
|
||||
|
||||
class SystemCommand
|
||||
attr_reader :program
|
||||
attr_reader :args
|
||||
attr_reader :logger
|
||||
|
||||
def initialize(program, args, logger: NullLogger.new)
|
||||
@program = program
|
||||
@args = Array.wrap(args)
|
||||
@logger = logger
|
||||
end
|
||||
|
||||
def execute
|
||||
logger.log :before_command, syscmd
|
||||
|
||||
raw = `syscmd`
|
||||
|
||||
logger.log :after_command, raw
|
||||
|
||||
raw
|
||||
end
|
||||
|
||||
def syscmd
|
||||
escaped_args = args.map { |arg|
|
||||
'"' + escape_arg(arg) + '"'
|
||||
}
|
||||
|
||||
[program, escaped_args].join(" ")
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def escape_arg(arg)
|
||||
arg.to_s.gsub('"') { '\"' }
|
||||
end
|
||||
end
|
21
test/services/system_command_test.rb
Normal file
21
test/services/system_command_test.rb
Normal file
|
@ -0,0 +1,21 @@
|
|||
require "test_helper"
|
||||
require "system_command"
|
||||
|
||||
class SystemCommandTest < ActiveSupport::TestCase
|
||||
test "should execute and log a command" do
|
||||
mock_logger = Minitest::Mock.new
|
||||
expected = 'whois "example.org"'
|
||||
|
||||
mock_logger.expect(:log, nil, [:before_command, expected])
|
||||
mock_logger.expect(:log, nil, [:after_command, "my result"])
|
||||
|
||||
command = SystemCommand.new("whois", "example.org", logger: mock_logger)
|
||||
assert_equal expected, command.syscmd
|
||||
|
||||
command.stub(:`, "my result") do
|
||||
assert_equal "my result", command.execute
|
||||
end
|
||||
|
||||
mock_logger.verify
|
||||
end
|
||||
end
|
Loading…
Reference in a new issue