require 'test/unit'
require 'test/gemutilities'
require 'rubygems/command_manager'

class TestGemSourcesCommand < RubyGemTestCase

  def setup
    super
    Gem::CommandManager.instance # preload command objects
  end

  def test_execute
    util_setup_source_info_cache
    cmd = Gem::Commands::SourcesCommand.new
    cmd.send :handle_options, []

    ui = MockGemUi.new
    use_ui ui do
      cmd.execute
    end

    expected = <<-EOF
*** CURRENT SOURCES ***

http://gems.example.com
    EOF

    assert_equal expected, ui.output
    assert_equal '', ui.error
  end

  def test_execute_add
    util_setup_fake_fetcher

    @si = Gem::SourceIndex.new @gem1.full_name => @gem1.name

    @fetcher.data['http://beta-gems.example.com/yaml'] = @si.to_yaml

    cmd = Gem::Commands::SourcesCommand.new
    cmd.send :handle_options, %w[--add http://beta-gems.example.com]

    util_setup_source_info_cache

    ui = MockGemUi.new
    use_ui ui do
      cmd.execute
    end

    expected = <<-EOF
Bulk updating Gem source index for: http://beta-gems.example.com
http://beta-gems.example.com added to sources
    EOF

    assert_equal expected, ui.output
    assert_equal '', ui.error

    Gem::SourceInfoCache.cache.flush
    assert_equal %w[http://beta-gems.example.com http://gems.example.com],
                 Gem::SourceInfoCache.cache_data.keys
  end

  def test_execute_add_nonexistent_source
    util_setup_fake_fetcher

    @si = Gem::SourceIndex.new @gem1.full_name => @gem1.name

    @fetcher.data['http://beta-gems.example.com/yaml'] = proc do
      raise Gem::RemoteFetcher::FetchError, 'it died'
    end


    Gem::RemoteFetcher.instance_variable_set :@fetcher, @fetcher

    cmd = Gem::Commands::SourcesCommand.new
    cmd.send :handle_options, %w[--add http://beta-gems.example.com]

    util_setup_source_info_cache

    ui = MockGemUi.new
    use_ui ui do
      cmd.execute
    end

    expected = <<-EOF
Error fetching http://beta-gems.example.com:
\tit died
    EOF

    assert_equal expected, ui.output
    assert_equal '', ui.error
  end

  def test_execute_add_bad_uri
    cmd = Gem::Commands::SourcesCommand.new
    cmd.send :handle_options, %w[--add beta-gems.example.com]

    util_setup_source_info_cache

    ui = MockGemUi.new
    use_ui ui do
      cmd.execute
    end

    expected = <<-EOF
beta-gems.example.com is not a URI
    EOF

    assert_equal expected, ui.output
    assert_equal '', ui.error
  end

  def test_execute_remove
    cmd = Gem::Commands::SourcesCommand.new
    cmd.send :handle_options, %w[--remove http://gems.example.com]

    util_setup_source_info_cache

    ui = MockGemUi.new
    use_ui ui do
      cmd.execute
    end

    expected = <<-EOF
http://gems.example.com removed from sources
    EOF

    assert_equal expected, ui.output
    assert_equal '', ui.error

    Gem::SourceInfoCache.cache.flush
    assert_equal [], Gem::SourceInfoCache.cache_data.keys
  end

end



syntax highlighted by Code2HTML, v. 0.9.1