diff --git a/test/models/plugin_test.rb b/test/models/plugin_test.rb new file mode 100644 index 0000000..1dc6558 --- /dev/null +++ b/test/models/plugin_test.rb @@ -0,0 +1,144 @@ +require "test_helper" + +class PluginTest < ActiveSupport::TestCase + setup do + @plugin = FactoryBot.build(:plugin) + end + + sub_test_case ".installed" do + setup do + gem_list = <<-GEM_LIST.strip_heredoc + dummy (3.3.3) + fluent-plugin-foo (0.1.2) + more_dummy (0.0.1) + GEM_LIST + stub(FluentGem).gem { "gem" } + stub(FluentGem).__double_definition_create__.call(:`, "gem list 2>&1") { gem_list } + @target = Plugin.new(gem_name: "fluent-plugin-foo", version: "0.1.2") + end + + test "detect foo plugin" do + assert_equal(@target.inspect, Plugin.installed.first.inspect) + end + + test "detected foo plugin is marked as installed" do + assert do + @target.installed? + end + end + + test "detected foo plugin version to be installed_version" do + assert_equal(@target.version, @target.installed_version) + end + end + + sub_test_case "#valid?" do + data("nil is invalid" => [nil, false], + "something filled is valid" => ["foobar", true]) + test "gem_name" do |(name, is_valid)| + @plugin.gem_name = name + assert_equal(is_valid, @plugin.valid?) + end + + data("nil is invalid" => [nil, false], + "something filled is valid" => ["0.0.1", true]) + test "version" do |(version, is_valid)| + @plugin.version = version + assert_equal(is_valid, @plugin.valid?) + end + end + + sub_test_case "#install!" do + def install_plugin(is_valid, is_installed) + stub(@plugin).valid? { is_valid } + stub(@plugin).installed? { is_installed } + @plugin.install! + end + + + data("installed" => [true, 0], + "not installed" => [false, 1]) + test "valid" do |(is_installed, n)| + mock(FluentGem).install(anything, "--no-ri", "--no-rdoc", "-v", anything).times(n) {} + install_plugin(true, is_installed) + end + + data("installed" => [true, :install], + "not installed" => [false, :installed]) + test "invalid" do |(is_installed, method)| + mock(FluentGem).__send__(method).times(0) + install_plugin(false, is_installed) + end + + test "system command error" do + stub(FluentGem).gem { "gem" } + mock(FluentGem).system("gem", "install", "fluent-plugin-dummy", "--no-ri", "--no-rdoc", "-v", "1.2.3").at_least(1) { false } + assert_raise(FluentGem::GemError.new("failed command: `gem install fluent-plugin-dummy --no-ri --no-rdoc -v 1.2.3`")) do + @plugin.install! + end + end + end + + data("installed" => [true, 1], + "uninstalled" => [false, 0]) + test "#uninstall!" do |(is_installed, n)| + installed_plugin = FactoryBot.build(:plugin, gem_name: "fluent-plugin-foobar") + mock(installed_plugin).installed? { is_installed } + mock(installed_plugin).gem_uninstall.times(n) {} + installed_plugin.uninstall! + end + + test "#upgrade!" do + installed_plugin = FactoryBot.build(:plugin, gem_name: "fluent-plugin-foobar", version: "1.0.0") + stub(installed_plugin).installed? { true } + stub(FluentGem).gem { "gem" } + stub(FluentGem).run("gem", "install", "fluent-plugin-foobar", "--no-ri", "--no-rdoc", "-v", "1.2.0") { true } + mock(installed_plugin).uninstall! {} + mock(FluentGem).install("fluent-plugin-foobar", "--no-ri", "--no-rdoc", "-v", "1.2.0") {} + installed_plugin.upgrade!("1.2.0") + end + + test "#to_param" do + assert do + @plugin.to_param == @plugin.gem_name + end + end + + sub_test_case "Gem version" do + setup do + @plugin = FactoryBot.build(:plugin, version: "1.0.0") + @versions = %w(1.0.1 0.99.1 1.0.0 0.99.0 0.1.0 0.0.3 0.0.2 0.0.1) + @authors = %w(foo bar) + json_response = @versions.map do |version| + { + number: version, + summary: "summary of #{version}", + authors: @authors + } + end.to_json + stub_request(:get, @plugin.gem_json_url).to_return(body: json_response) + end + + test "latest version is 1.0.0" do + assert_equal("1.0.1", @plugin.latest_version) + end + + test "1.0.0 is not lates" do + assert do + !@plugin.latest_version? + end + end + + test "released_versions is sorted" do + assert_equal(@versions.sort_by{|ver| Gem::Version.new(ver) }.reverse, @plugin.released_versions) + end + + test "authors" do + assert_equal(@authors, @plugin.authors) + end + + test "summary" do + assert_equal("summary of #{@plugin.version}", @plugin.summary) + end + end +end