Shindo.tests('Fog::AWS[:dynamodb] | item requests', ['aws']) do

  @table_name = "fog_table_#{Time.now.to_f.to_s.gsub('.','')}"

  unless Fog.mocking?
    Fog::AWS[:dynamodb].create_table(
      @table_name, 
      {'HashKeyElement' => {'AttributeName' => 'key', 'AttributeType' => 'S'}}, 
      {'ReadCapacityUnits' => 5, 'WriteCapacityUnits' => 5}
    )
    Fog.wait_for { Fog::AWS[:dynamodb].describe_table(@table_name).body['Table']['TableStatus'] == 'ACTIVE' }
  end

  tests('success') do

    tests("#put_item('#{@table_name}', {'key' => {'S' => 'key'}}, {'value' => {'S' => 'value'}})").formats('ConsumedCapacityUnits' => Float) do
      pending if Fog.mocking?
      Fog::AWS[:dynamodb].put_item(@table_name, {'key' => {'S' => 'key'}}, {'value' => {'S' => 'value'}}).body
    end

    tests("#update_item('#{@table_name}', {'HashKeyElement' => {'S' => 'key'}}, {'value' => {'Value' => {'S' => 'value'}}})").formats('ConsumedCapacityUnits' => Float) do
      pending if Fog.mocking?
      Fog::AWS[:dynamodb].update_item(@table_name, {'HashKeyElement' => {'S' => 'key'}}, {'value' => {'Value' => {'S' => 'value'}}}).body
    end

    @batch_get_item_format = {
      'Responses' => {
        @table_name => {
          'ConsumedCapacityUnits' => Float,
          'Items' => [{
            'key'   => { 'S' => String },
            'value' => { 'S' => String }
          }]
        }
      },
      'UnprocessedKeys' => {}
    }

    tests("#batch_get_item({'#{@table_name}' => {'Keys' => [{'HashKeyElement' => {'S' => 'key'}}]}})").formats(@batch_get_item_format) do
      pending if Fog.mocking?
      Fog::AWS[:dynamodb].batch_get_item(
        {@table_name => {'Keys' => [{'HashKeyElement' => {'S' => 'key'}}]}}
      ).body
    end

    @batch_put_item_format = {
      'Responses'=> {
        @table_name => {
          'ConsumedCapacityUnits' => Float}
      },
      'UnprocessedItems'=> {}
    }

    tests("#batch_put_item({ '#{@table_name}' => [{ 'PutRequest' => { 'Item' =>
            { 'HashKeyElement' => { 'S' => 'key' }, 'RangeKeyElement' => { 'S' => 'key' }}}}]})"
         ).formats(@batch_put_item_format) do
            pending if Fog.mocking?
            Fog::AWS[:dynamodb].batch_put_item(
              {@table_name => [{'PutRequest'=> {'Item'=>
                {'HashKeyElement' => { 'S' => 'key' },
                 'RangeKeyElement' => { 'S' => 'key' }
                }}}]}
            ).body
         end

    @get_item_format = {
      'ConsumedCapacityUnits' => Float,
      'Item' => {
        'key'   => { 'S' => String },
        'value' => { 'S' => String }
      }
    }

    tests("#get_item('#{@table_name}', {'HashKeyElement' => {'S' => 'key'}})").formats(@get_item_format) do
      pending if Fog.mocking?
      Fog::AWS[:dynamodb].get_item(@table_name, {'HashKeyElement' => {'S' => 'key'}}).body
    end

    tests("#get_item('#{@table_name}', {'HashKeyElement' => {'S' => 'notakey'}})").formats('ConsumedCapacityUnits' => Float) do
      pending if Fog.mocking?
      Fog::AWS[:dynamodb].get_item(@table_name, {'HashKeyElement' => {'S' => 'notakey'}}).body
    end

    @query_format = {
      'ConsumedCapacityUnits' => Float,
      'Count'                 => Integer,
      'Items'                 => [{
        'key'   => { 'S' => String },
        'value' => { 'S' => String }
      }],
      'LastEvaluatedKey'      => NilClass
    }

    tests("#query('#{@table_name}', {'S' => 'key'}").formats(@query_format) do
      pending if Fog.mocking?
      pending # requires a table with range key
      Fog::AWS[:dynamodb].query(@table_name, {'S' => 'key'}).body
    end

    @scan_format = @query_format.merge('ScannedCount' => Integer)

    tests("scan('#{@table_name}')").formats(@scan_format) do
      pending if Fog.mocking?
      Fog::AWS[:dynamodb].scan(@table_name).body
    end

    tests("#delete_item('#{@table_name}', {'HashKeyElement' => {'S' => 'key'}})").formats('ConsumedCapacityUnits' => Float) do
      pending if Fog.mocking?
      Fog::AWS[:dynamodb].delete_item(@table_name, {'HashKeyElement' => {'S' => 'key'}}).body
    end

    tests("#delete_item('#{@table_name}, {'HashKeyElement' => {'S' => 'key'}})").formats('ConsumedCapacityUnits' => Float) do
      pending if Fog.mocking?
      Fog::AWS[:dynamodb].delete_item(@table_name, {'HashKeyElement' => {'S' => 'key'}}).body
    end

  end

  tests('failure') do

    tests("#put_item('notatable', {'key' => {'S' => 'key'}}, {'value' => {'S' => 'value'}})").raises(Excon::Errors::BadRequest) do
      pending if Fog.mocking?
      Fog::AWS[:dynamodb].put_item('notatable', {'key' => {'S' => 'key'}}, {'value' => {'S' => 'value'}})
    end

    tests("#update_item('notatable', {'HashKeyElement' => {'S' => 'key'}}, {'value' => {'Value' => {'S' => 'value'}}})").raises(Excon::Errors::BadRequest) do
      pending if Fog.mocking?
      Fog::AWS[:dynamodb].update_item('notatable', {'HashKeyElement' => {'S' => 'key'}}, {'value' => {'Value' => {'S' => 'value'}}})
    end

  end

  unless Fog.mocking?
    Fog::AWS[:dynamodb].delete_table(@table_name)
  end

end
