require 'test_helper'

class TestNode < Test::Unit::TestCase
  def setup
    setup_solusvm
    @nodes = Solusvm::Node.new
  end

  def test_list
    VCR.use_cassette "node/list" do
      assert_equal %w(node1 node2 node3 node4), @nodes.list('xen')
    end
  end

  def test_list_empty
    VCR.use_cassette "node/list" do    
      assert !@nodes.list('openvz')
    end
  end

  def test_nodes_with_invalid_type
    assert_raise Solusvm::SolusvmError do
      @nodes.list('whatever')
    end
  end

  def test_statistics
    VCR.use_cassette "node/statistics" do
      @nodes.statistics(1)
    end
    
    node_statistics = @nodes.returned_parameters
    
    assert_equal '1000', node_statistics['freedisk']
    assert_equal '22', node_statistics['sshport']
    assert_equal 'city', node_statistics['city']
    assert_equal 'name', node_statistics['name']
    assert_equal '0', node_statistics['freeips']
    assert_equal 'country', node_statistics['country']
    assert_equal 'x86_64', node_statistics['arch']
    assert_equal '1', node_statistics['id']
    assert_equal '10', node_statistics['freememory']
    assert_equal '2', node_statistics['virtualservers']
    assert_equal '127.0.0.1', node_statistics['ip']
    assert_equal 'hostname.com', node_statistics['hostname']
    assert_equal 'success', node_statistics['status']
  end

  def test_list_all_ips_available
    Solusvm.config("api_id1", api_login[:key], :url => 'http://www.example.com/api')
    VCR.use_cassette "node/available_ips" do
      assert_equal %w(123.123.123.123 124.124.124.124 125.125.125.125).sort, @nodes.available_ips(1).sort 
    end
  end

  def test_list_all_ips_not_available
    Solusvm.config("api_id2", api_login[:key], :url => 'http://www.example.com/api')
    VCR.use_cassette "node/available_ips" do
      assert @nodes.available_ips(1).empty?
    end
  end

  def test_ids
    VCR.use_cassette "node/ids" do
      assert_equal %w(nodeid1 nodeid2 nodeid3 nodeid4), @nodes.ids('xen')
    end
  end

  def test_nodes_ids_error
    assert_raise Solusvm::SolusvmError do
      @nodes.ids('whatever')
    end
  end

  def test_virtualservers
    Solusvm.config("api_id1", api_login[:key], :url => 'http://www.example.com/api')
    VCR.use_cassette "node/virtualservers" do
      @nodes.virtualservers(1)
    end
    
    server = @nodes.returned_parameters["virtualservers"]["virtualserver"].first
    
    assert_equal "theid", server["vserverid"]
    assert_equal "thexid", server["ctid-xid"]
    assert_equal "theclientid", server["clientid"]
    assert_equal "theip", server["ipaddress"]
    assert_equal "thehostname", server["hostname"]
    assert_equal "thetemplate", server["template"]
    assert_equal "thediskspace", server["hdd"]
    assert_equal "thememory", server["memory"]
    assert_equal "theswap", server["swap-burst"]
    assert_equal "thetype", server["type"]
    assert_equal "themac", server["mac"]
  end

  def test_virtualservers_empty
    Solusvm.config("api_id2", api_login[:key], :url => 'http://www.example.com/api')
    VCR.use_cassette "node/virtualservers" do
      assert @nodes.virtualservers(1).empty?
    end
  end

  def test_virtualservers_fail
    Solusvm.config("api_id3", api_login[:key], :url => 'http://www.example.com/api')
    VCR.use_cassette "node/virtualservers" do
      assert_nil @nodes.virtualservers(1)
    end
  end

  def test_xenresources
    VCR.use_cassette "node/xenresources" do
      @nodes.xenresources(1)
    end
    
    node_resources = @nodes.returned_parameters
    
    assert_equal 'thefreememory', node_resources['freememory']
    assert_equal 'thefreehdd', node_resources['freehdd']
  end
end