require File.expand_path('spec/spec_helper')
require 'fog/arubacloud/compute/models/server'

describe Fog::ArubaCloud::Compute::Server do
  include ModelSetup
  # :service is already took from ModelSetup, no need to redefine it

  let (:server_class) do
    class Fog::ArubaCloud::Compute::Server
      def self.read_identity
        instance_variable_get('@identity')
      end
    end
    Fog::ArubaCloud::Compute::Server
  end

  let(:server) { Fog::ArubaCloud::Compute::Server.new }
  let(:collection) { Object.new }
  let(:service) { Object.new }


  it 'should have an unique id' do
    server_class.read_identity.must_equal(:id)
  end

  it 'should have 18 attributes' do
    server_class.attributes.must_equal([
                                           :id,
                                           :name,
                                           :state,
                                           :memory,
                                           :cpu,
                                           :hypervisor,
                                           :datacenter_id,
                                           :hd_qty,
                                           :hd_total_size,
                                           :smart_ipv4,
                                           :smart_package,
                                           :vnc_port,
                                           :admin_passwd,
                                           :vm_type,
                                           :ipv4_addr,
                                           :package_id,
                                           :template_id,
                                           :template_description
                                       ])
  end

  describe '#ready?' do
    describe 'when the machine is ready' do
      before :each do
        server.state = 3
      end

      it 'should return true' do
        server.stub(:reload, true) do
          server.ready?.must_equal true
        end
      end
    end

    describe 'when the machine is not in ready state' do
      before :each do
        server.state = 1
      end

      it 'should return false' do
        server.stub(:reload, true) do
          server.ready?.must_equal false
        end
      end
    end
  end

  describe '#stopped?' do
    describe 'when its stopped' do
      before :each do
        server.state = 2
      end

      it 'should return true' do
        server.stub(:reload, true) do
          server.stopped?.must_equal true
        end
      end
    end

    describe 'when its not stopped' do
      before :each do
        server.state = 1
      end

      it 'should return false' do
        server.stopped?.must_equal false
      end
    end

    describe 'when its in creating state' do
      describe 'when its in create state' do
        before :each do
          server.state = 1
        end

        it 'should return true' do
          server.stub(:reload, true) do
            server.creating?.must_equal true
          end
        end
      end

      describe 'when its in a different state' do
        before :each do
          server.state = 4
        end

        it 'should return false' do
          server.stub(:reload, true) do
            server.creating?.must_equal false
          end
        end
      end
    end

    describe '#power_on' do
      describe 'on a poweron vm' do
        before :each do
          server.identity = 154033
          server.state = 3
        end

        it 'should return Fog::ArubaCloud::Errors::VmStatus' do
          server.stub(:service, service) do
            proc {server.power_on}.must_raise(Fog::ArubaCloud::Errors::VmStatus)
          end
        end
      end
    end

    describe '#power_off' do
      describe 'on a powered off vm' do
        before :each do
          server.identity = 234234
          server.state = 2
        end

        it 'should return Fog::ArubaCloud::Errors::VmStatus' do
          server.stub(:service, service) do
            proc {server.power_off}.must_raise(Fog::ArubaCloud::Errors::VmStatus)
          end
        end
      end
    end

  end
end