def test_non_limit_param_will_return_100pets():

    for i in range(101):
        pets_table.put_item(Item={
            'id': i + 1,
            'name': f'pet{i + 1}',
        })

    event = {
        'queryStringParameters': None,
        'headers': {
            'Host': '1234567890.execute-api.us-east-1.amazonaws.com',
            'X-Forwarded-Proto': 'https'
        },
        'requestContext': {
            'path': '/prod/pets'
        }
    }

    res = handler(event, {})
    assert res['statusCode'] == HTTPStatus.OK
    pets = JsonUtil.loads(res['body'])
    assert len(pets) == 100
    x_next = res['headers']['x-next']
    assert x_next == '<https://1234567890.execute-api.us-east-1.amazonaws.com/prod/pets?' \
                     'last_evaluated_key=100>; rel="next"'
def test_last_evaluated_key(last_evaluated_key, expect_pets_len):

    for i in range(100):
        pets_table.put_item(Item={
            'id': i + 1,
            'name': f'pet{i + 1}',
        })

    event = {
        'queryStringParameters': {
            'last_evaluated_key': last_evaluated_key
        },
        'headers': {
            'Host': '1234567890.execute-api.us-east-1.amazonaws.com',
            'X-Forwarded-Proto': 'https'
        },
        'requestContext': {
            'path': '/prod/pets'
        }
    }

    res = handler(event, {})
    assert res['statusCode'] == HTTPStatus.OK
    pets = JsonUtil.loads(res['body'])
    assert len(pets) == expect_pets_len
def test_invalid_qs_will_return_bad_request(query_string_param, expect_msg):

    event = {
        'queryStringParameters': query_string_param,
        'headers': {
            'Host': '1234567890.execute-api.us-east-1.amazonaws.com',
            'X-Forwarded-Proto': 'https'
        },
        'requestContext': {
            'path': '/prod/pets'
        }
    }

    res = handler(event, {})
    assert res['statusCode'] == HTTPStatus.BAD_REQUEST
    body = JsonUtil.loads(res['body'])
    assert body['message'] == expect_msg
def test_no_pets_will_return_empty_pet_list():

    event = {
        'queryStringParameters': None,
        'headers': {
            'Host': '1234567890.execute-api.us-east-1.amazonaws.com',
            'X-Forwarded-Proto': 'https'
        },
        'requestContext': {
            'path': '/prod/pets'
        }
    }

    res = handler(event, {})
    assert res['statusCode'] == HTTPStatus.OK
    pets = JsonUtil.loads(res['body'])
    assert pets == []
def test_return_pets_list():

    pets_table.put_item(Item={
        'id': 1,
        'name': 'dog',
    })

    pets_table.put_item(Item={
        'id': 2,
        'name': 'cat',
        'tags': [{
            'id': 1,
            'name': 'some tag'
        }]
    })

    event = {
        'queryStringParameters': None,
        'headers': {
            'Host': '1234567890.execute-api.us-east-1.amazonaws.com',
            'X-Forwarded-Proto': 'https'
        },
        'requestContext': {
            'path': '/prod/pets'
        }
    }

    res = handler(event, {})
    assert res['statusCode'] == HTTPStatus.OK
    pets = JsonUtil.loads(res['body'])
    assert len(pets) == 2

    assert pets[0]['id'] == 1
    assert pets[0]['name'] == 'dog'

    assert pets[1]['id'] == 2
    assert pets[1]['name'] == 'cat'
    assert pets[1]['tags'][0]['id'] == 1
    assert pets[1]['tags'][0]['name'] == 'some tag'