require 'test_helper'

require 'chef/knife'
require 'knife-solo/deprecated_command'

class DummyNewCommand < Chef::Knife
  banner "knife dummy_new_command"

  option :foo,
    :long        => '--foo',
    :description => 'Foo option'

  def run
    # calls #new_run so we can be sure this gets called
    new_run
  end

  def new_run
    # dummy
  end
end

class DummyDeprecatedCommand < DummyNewCommand
  include KnifeSolo::DeprecatedCommand
end

class DeprecatedCommandTest < TestCase
  def test_help_warns_about_deprecation
    $stdout.expects(:puts).with(regexp_matches(/deprecated!/))
    assert_exits { command("--help") }
  end

  def test_warns_about_deprecation
    cmd = command
    cmd.ui.expects(:warn).with(regexp_matches(/deprecated!/))
    cmd.run
  end

  def test_runs_new_command
    cmd = command
    cmd.ui.stubs(:warn)
    cmd.expects(:new_run)
    cmd.run
  end

  def test_includes_options_from_new_command
    assert DummyDeprecatedCommand.options.include?(:foo)
  end

  def test_loads_dependencies_from_new_command
    DummyNewCommand.expects(:load_deps)
    DummyDeprecatedCommand.load_deps
  end

  def command(*args)
    DummyDeprecatedCommand.load_deps
    DummyDeprecatedCommand.new(args)
  end
end
