require_relative '../../../spec_helper'
require 'json'

module Aws
  module Stubbing
    module Protocols
      describe Json do
        describe '#stub_data' do

          def normalize(json)
            JSON.pretty_generate(JSON.load(json), indent: '  ')
          end

          let(:api) { ApiHelper.sample_json::Client.api }

          let(:operation) { api.operation(:describe_table) }

          it 'returns a stubbed http response' do
            resp = Json.new.stub_data(api, operation, {})
            expect(resp).to be_kind_of(Seahorse::Client::Http::Response)
            expect(resp.status_code).to eq(200)
          end

          it 'populates the expected headers' do
            resp = Json.new.stub_data(api, operation, {})
            expect(resp.headers.to_h).to eq({
              "content-type" => "application/x-amz-json-",
              "x-amzn-requestid" => "stubbed-request-id",
            })
          end

          it 'populates the body with the stub data' do
            now = Time.now
            data = {
              table: {
                table_name: "my-table-name",
                table_size_bytes: 0,
                table_status: "ACTIVE",
                attribute_definitions: [
                  {
                    attribute_name: "Id",
                    attribute_type: "S"
                  }
                ],
                creation_date_time: now,
                item_count: 0,
                key_schema: [
                  attribute_name: "Id",
                  key_type: "HASH"
                ],
                provisioned_throughput: {
                  last_increase_date_time: now,
                  last_decrease_date_time: now,
                  number_of_decreases_today: 0,
                  read_capacity_units: 50,
                  write_capacity_units: 50,
                }
              }
            }
            resp = Json.new.stub_data(api, operation, data)
            expect(normalize(resp.body.string)).to eq(normalize(<<-JSON))
              {
                "Table": {
                  "TableName": "my-table-name",
                  "TableSizeBytes": 0,
                  "TableStatus": "ACTIVE",
                  "AttributeDefinitions": [
                    {
                      "AttributeName": "Id",
                      "AttributeType": "S"
                    }
                  ],
                  "CreationDateTime": #{now.to_i},
                  "ItemCount": 0,
                  "KeySchema": [
                    {
                      "AttributeName": "Id",
                      "KeyType": "HASH"
                    }
                  ],
                  "ProvisionedThroughput": {
                    "LastIncreaseDateTime": #{now.to_i},
                    "LastDecreaseDateTime": #{now.to_i},
                    "NumberOfDecreasesToday": 0,
                    "ReadCapacityUnits": 50,
                    "WriteCapacityUnits": 50
                  }
                }
              }
            JSON
          end

        end
      end
    end
  end
end
