Shindo.tests('Fog::Compute[:cloudsigma] | snapshot requests', ['cloudsigma']) do
  pending if Fog.mocking?

  @snapshot_format = {
      'uuid' => String,
      'allocated_size' => Fog::Nullable::Integer,
      'drive' => Fog::Nullable::Hash,
      'meta' => Fog::Nullable::Hash,
      'name' => String,
      'owner' => Fog::Nullable::Hash,
      'resource_uri' => Fog::Nullable::String,
      'status' => String,
      'tags' => Array,
      'timestamp' => String
  }
  @promoted_volume_format = {
      'uuid' => String,
      'affinities' => Array,
      'allow_multimount' => Fog::Boolean,
      'jobs' => Array,
      'licenses' => Array,
      'media' => String,
      'meta' => Fog::Nullable::Hash,
      'mounted_on' => Array,
      'name' => String,
      'owner' => Fog::Nullable::Hash,
      'resource_uri' => Fog::Nullable::Hash, # this field's type is the only difference from volume format
      'size' => Integer,
      'status' => String,
      'storage_type' => String,
      'tags' => Array
  }

  @volume = Fog::Compute[:cloudsigma].volumes.create(:name => 'fogsnapshottest', :size => 1024**3, :media => :disk)
  @volume.wait_for { available? } unless Fog.mocking?
  @snapshot_create_args = {:name => 'fogtest', :drive => @volume.uuid}

  tests('success') do

    tests("#create_snapshot(#@snapshot_create_args)").formats(@snapshot_format, false) do
      @resp_snapshot = Fog::Compute[:cloudsigma].create_snapshot(@snapshot_create_args).body['objects'].first
      @snapshot_uuid = @resp_snapshot['uuid']

      @resp_snapshot
    end

    @snapshot = Fog::Compute[:cloudsigma].snapshots.get(@snapshot_uuid)
    @snapshot.wait_for { available? }

    tests("#update_snapshot(#@snapshot_uuid)").formats(@snapshot_format, false) do
      @resp_snapshot['name'] = 'fogtest_renamed'
      @resp_snapshot = Fog::Compute[:cloudsigma].update_snapshot(@snapshot_uuid, @resp_snapshot).body

      @resp_snapshot
    end

    # promote snapshot to a drive
    tests("#promote_snapshot(#@snapshot_uuid)").formats(@promoted_volume_format, false) do
      @resp_promoted_volume = Fog::Compute[:cloudsigma].clone_snapshot(@snapshot_uuid).body

      @resp_promoted_volume
    end
    # cleanup
    @promoted_volume = Fog::Compute[:cloudsigma].volumes.get(@resp_promoted_volume['uuid'])
    @promoted_volume.wait_for { available? } unless Fog.mocking?
    @promoted_volume.destroy

    tests("#delete_snapshot(#@snapshot_uuid)").succeeds do
      resp = Fog::Compute[:cloudsigma].delete_snapshot(@snapshot_uuid)

      resp.body.empty? && resp.status == 204
    end

  end

  tests('failure') do
    tests("#get_snapshot(#@snapshot_uuid)|deleted|").raises(Fog::CloudSigma::Errors::NotFound) do
      Fog::Compute[:cloudsigma].get_snapshot(@snapshot_uuid).body
    end
  end

  @volume.destroy

end
