diff --git a/lib/mjml.rb b/lib/mjml.rb index 51ed50e..9fb7bee 100644 --- a/lib/mjml.rb +++ b/lib/mjml.rb @@ -74,8 +74,9 @@ def self.check_for_custom_mjml_binary end def self.check_for_mjml_package(package_manager, bin_command, binary_path) - pm_bin = `which #{package_manager}`.chomp - return if pm_bin.blank? + stdout, _, status = Open3.capture3("which #{package_manager}") + return unless status.success? + pm_bin = stdout.chomp stdout, _, status = Open3.capture3("#{pm_bin} #{bin_command}") return unless status.success? @@ -93,11 +94,14 @@ def self.check_for_package_mjml_binary end def self.check_for_global_mjml_binary - mjml_bin = `which mjml`.chomp + stdout, _, status = Open3.capture3("which mjml") + return unless status.success? + mjml_bin = stdout.chomp return mjml_bin if mjml_bin.present? && check_version(mjml_bin) end def self.check_for_mrml_binary + return unless Mjml.use_mrml MRML.present? rescue NameError Mjml.mjml_binary_error_string = 'Couldn\'t find MRML - did you add \'mrml\' to your Gemfile?' diff --git a/test/fixtures/valid-mjml-binary/empty-path/which b/test/fixtures/valid-mjml-binary/empty-path/which new file mode 100755 index 0000000..8ffdeb4 --- /dev/null +++ b/test/fixtures/valid-mjml-binary/empty-path/which @@ -0,0 +1,7 @@ +#!/bin/sh + +# simulate GNU which's stderr message when it cannot find something +>&2 echo "I should not show up in test output" + +# simulate an empty path by always returning nonzero +exit 1 diff --git a/test/mjml_test.rb b/test/mjml_test.rb index b997cd4..23e6850 100644 --- a/test/mjml_test.rb +++ b/test/mjml_test.rb @@ -168,8 +168,19 @@ class NotifierMailerTest < ActiveSupport::TestCase Mjml.valid_mjml_binary = nil MRML.stubs(:present?).raises(NameError) + Mjml.stubs(:puts) # silence printed error message from test output assert_nil(Mjml.valid_mjml_binary) expect(Mjml.mjml_binary_error_string).must_equal 'Couldn\'t find MRML - did you add \'mrml\' to your Gemfile?' end + + it "with nothing on the path, sets valid_mjml_binary to nil" do + old_path = ENV["PATH"] + ENV["PATH"] = "./test/fixtures/valid-mjml-binary/empty-path/" + + Mjml.stubs(:puts) # silence printed error message from test output + assert_nil(Mjml.valid_mjml_binary) + ensure + ENV["PATH"] = old_path + end end end