require 'test_plugin_helper'

class ForemanBootdisk::VmwareTest < ActiveSupport::TestCase
  describe "#create_vm" do
    setup do
      @cr = FactoryGirl.build(:vmware_cr)
      @cr.stubs(:test_connection)
    end

    test "does not call clone_vm when bootdisk provisioning" do
      args = { "provision_method" => "bootdisk" }
      mock_vm = mock('vm')
      mock_vm.stubs(:firmware)
      mock_vm.expects(:save).returns(mock_vm)
      @cr.stubs(:parse_networks).returns(args)
      @cr.expects(:clone_vm).times(0)
      @cr.expects(:new_vm).returns(mock_vm)
      @cr.create_vm(args)
    end
  end

  describe "#new_vm" do
    setup do
      @cr = FactoryGirl.build(:vmware_cr)
    end

    test "calls client with cdrom drive and correct boot order when bootdisk provisioning" do
      args = { "provision_method" => "bootdisk" }
      mock_client = mock('client')
      mock_servers = mock('servers')
      mock_cdrom = mock('cdrom')
      mock_client.expects(:servers).returns(mock_servers)
      mock_servers.expects(:new).with() do |args|
        assert_equal args[:boot_order], ['cdrom', 'disk']
        assert_includes args[:cdroms], mock_cdrom
      end
      @cr.expects(:new_cdrom).returns(mock_cdrom)
      @cr.expects(:new_interface)
      @cr.expects(:new_volume)
      @cr.expects(:datacenter)
      @cr.expects(:client).returns(mock_client)
      @cr.new_vm(args)
    end
  end

  describe "#parse_args" do
    setup do
      @cr = FactoryGirl.build(:vmware_cr)
    end

    test "should add a cdrom drive while keeping other parameters when provision_method is bootdisk" do
      mock_cdrom = mock('cdrom')
      @cr.expects(:new_cdrom).returns(mock_cdrom)
      attrs_in = HashWithIndifferentAccess.new(
        'cpus' => '1',
        :provision_method => 'bootdisk',
      )
      attrs_out = {
        :cpus => '1',
        :provision_method => 'bootdisk',
        :cdroms => [mock_cdrom],
        :boot_order => ['cdrom', 'disk'],
      }
      assert_equal attrs_out, @cr.parse_args(attrs_in)
    end
  end

  describe "#capabilities" do
    setup do
      @cr = FactoryGirl.build(:vmware_cr)
    end

    test "should include bootdisk" do
      assert_includes @cr.capabilities, :bootdisk
    end
  end
end