Shindo.tests('Fog::Compute[:vsphere] | server model', ['vsphere']) do
  servers = Fog::Compute[:vsphere].servers
  server = servers.last

  tests('The server model should') do
    tests('have the action') do
      test('reload') { server.respond_to? 'reload' }
      %w[stop suspend destroy reboot].each do |action|
        test(action) { server.respond_to? action }
        test("#{action} returns successfully") { server.send(action.to_sym) ? true : false }
      end
      test('start') { server.respond_to?('start') }
      test('start returns false, because it is already poweredOn') { server.start ? true : false }
      test('guest_processes') { server.respond_to? 'guest_processes' }
      test('take_snapshot') do
        test('responds') { server.respond_to? 'take_snapshot' }
        test('returns successfully') { server.take_snapshot('name' => 'foobar').is_a? Hash }
      end
      test('snapshots') do
        test('responds') { server.respond_to? 'snapshots' }
        test('returns successfully') { server.snapshots.is_a? Fog::Vsphere::Compute::Snapshots }
      end
      test('find_snapshot') do
        test('responds') { server.respond_to? 'find_snapshot' }
        test('returns successfully') do
          server.find_snapshot('snapshot-0101').is_a? Fog::Vsphere::Compute::Snapshot
        end
        test('returns correct snapshot') do
          server.find_snapshot('snapshot-0101').ref == 'snapshot-0101'
        end
      end
      tests('revert_snapshot') do
        test('responds') { server.respond_to? 'revert_snapshot' }
        tests('returns correctly') do
          test('when correct input given') { server.revert_snapshot('snapshot-0101').is_a? Hash }
          test('when incorrect input given') do
            raises(ArgumentError) { server.revert_snapshot(1) }
          end
        end
      end
      test('tickets') do
        test('acquire ticket successfully') { server.acquire_ticket.is_a? Fog::Vsphere::Compute::Ticket }
      end
    end
    tests('have attributes') do
      model_attribute_hash = server.attributes
      attributes = %i[id
                      instance_uuid
                      uuid
                      power_state
                      tools_state
                      mo_ref
                      tools_version
                      hostname
                      mac_addresses
                      operatingsystem
                      connection_state
                      hypervisor
                      name
                      public_ip_address]
      tests('The server model should respond to') do
        attributes.each do |attribute|
          test(attribute.to_s) { server.respond_to? attribute }
        end
      end
      tests('The attributes hash should have key') do
        attributes.each do |attribute|
          test(attribute.to_s) { model_attribute_hash.key? attribute }
        end
      end
    end
    test('be a kind of Fog::Vsphere::Compute::Server') { server.is_a? Fog::Vsphere::Compute::Server }
  end
end