From a831152cbc6f4d5eeecde031c6038376dcec5b79 Mon Sep 17 00:00:00 2001 From: helloangely Date: Wed, 11 Dec 2019 14:53:09 -0500 Subject: [PATCH 1/5] we added test foldrs and makefile command --- .gitignore | 2 +- Makefile | 2 +- requirements.txt | 1 + tests/__init__.py | 0 tests/unit/__init__.py | 0 5 files changed, 3 insertions(+), 2 deletions(-) create mode 100644 tests/__init__.py create mode 100644 tests/unit/__init__.py diff --git a/.gitignore b/.gitignore index 908a064..09e464e 100644 --- a/.gitignore +++ b/.gitignore @@ -23,7 +23,7 @@ var/ *.egg-info/ .installed.cfg *.egg - +.idea/* # PyInstaller # Usually these files are written by a python script from a template # before PyInstaller builds the exe, so as to inject date/other infos into it. diff --git a/Makefile b/Makefile index 94dabee..75a300f 100644 --- a/Makefile +++ b/Makefile @@ -9,7 +9,7 @@ run: test: rm -f .coverage - nosetests $(NOSE_ARGS) ./tests/ + @pytest travis: nosetests --with-coverage ./tests/ diff --git a/requirements.txt b/requirements.txt index d4b58f5..fbb9534 100644 --- a/requirements.txt +++ b/requirements.txt @@ -7,3 +7,4 @@ awslimitchecker nose Flask-Script sendgrid +pytest diff --git a/tests/__init__.py b/tests/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/tests/unit/__init__.py b/tests/unit/__init__.py new file mode 100644 index 0000000..e69de29 From 5bb60fe5e6b9d837de9b72b25004e998f004be32 Mon Sep 17 00:00:00 2001 From: helloangely Date: Wed, 11 Dec 2019 15:33:02 -0500 Subject: [PATCH 2/5] fix circular import --- Makefile | 3 +-- awslimits/support.py | 27 ++++++++++++++++++++++++++- tests/__init__.py | 0 tests/unit/__init__.py | 0 tests/unit/test_limits.py | 31 +++++++++++++++++++++++++++++++ 5 files changed, 58 insertions(+), 3 deletions(-) delete mode 100644 tests/__init__.py delete mode 100644 tests/unit/__init__.py create mode 100644 tests/unit/test_limits.py diff --git a/Makefile b/Makefile index 75a300f..6d408dc 100644 --- a/Makefile +++ b/Makefile @@ -8,8 +8,7 @@ run: @python awslimits/server.py test: - rm -f .coverage - @pytest + @py.test tests/ travis: nosetests --with-coverage ./tests/ diff --git a/awslimits/support.py b/awslimits/support.py index d12f79d..c5c61e7 100644 --- a/awslimits/support.py +++ b/awslimits/support.py @@ -6,9 +6,9 @@ import time from datetime import datetime, timedelta from decimal import Decimal +from botocore.exceptions import ClientError import settings -from dynamo_helpers import create_or_get_table TICKETS_TABLE_NAME = 'awslimits_tickets' LIMITS_TABLE_NAME = 'awslimits_limits' @@ -21,6 +21,7 @@ def dict_to_obj(dict_): struct = namedtuple('struct', dict_.keys()) return struct(**dict_) + def get_boto_resource(resource): sts = boto3.client('sts') assumed_role = sts.assume_role(RoleArn=settings.ROLE_ARN, RoleSessionName="awslimits") @@ -52,6 +53,30 @@ def get_boto_client(client, region_name=settings.REGION_NAME): ) +def create_or_get_table(table_name, attribute_definitions, key_schema): + dynamodb = get_boto_resource('dynamodb') + + try: + table = dynamodb.create_table( + AttributeDefinitions=attribute_definitions, + TableName=table_name, + KeySchema=key_schema, + ProvisionedThroughput={ + 'ReadCapacityUnits': 1, + 'WriteCapacityUnits': 1, + }, + ) + except ClientError as exc: + if exc.response['Error']['Code'] == 'ResourceInUseException': + table = dynamodb.Table(table_name) + return table + else: + raise + + table.meta.client.get_waiter('table_exists').wait(TableName=table_name) + return table + + def get_aws_limit_checker(): return AwsLimitChecker(region=settings.REGION_NAME, account_id=settings.ACCOUNT_ID, account_role=settings.ACCOUNT_ROLE) diff --git a/tests/__init__.py b/tests/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/tests/unit/__init__.py b/tests/unit/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/tests/unit/test_limits.py b/tests/unit/test_limits.py new file mode 100644 index 0000000..8415f8e --- /dev/null +++ b/tests/unit/test_limits.py @@ -0,0 +1,31 @@ +from __future__ import absolute_import + + +import moto +from unittest import TestCase +import os + + +class DynamoHelpersTestCase(TestCase): + def setUp(self): + os.environ['ROLE_ARN'] = 'arn:aws:iam::212311232123:role/test' + os.environ['SENDGRID_API_KEY'] = '1231231231231231231' + from awslimits.support import create_or_get_table + + # unset these env vars + + def test_create_or_get_existing_table(self): + pass + + + def test_create_or_get_new_table(self): + pass + + + def test_create_or_get_table_exception(self): + pass + + + def test_create_or_get_table_failed(self): + pass + From d1950d9a30d730c16ffe6a754abddd7a3296e281 Mon Sep 17 00:00:00 2001 From: helloangely Date: Wed, 11 Dec 2019 15:44:36 -0500 Subject: [PATCH 3/5] setup tests --- tests/unit/test_limits.py | 23 +++++++++-------------- 1 file changed, 9 insertions(+), 14 deletions(-) diff --git a/tests/unit/test_limits.py b/tests/unit/test_limits.py index 8415f8e..542a180 100644 --- a/tests/unit/test_limits.py +++ b/tests/unit/test_limits.py @@ -1,31 +1,26 @@ -from __future__ import absolute_import - - import moto from unittest import TestCase +from mock import patch import os +mock_env = { + 'ROLE_ARN': 'arn:aws:iam::212311232123:role/test', + 'SENDGRID_API_KEY': '1231231231231231231', +} +with patch.dict(os.environ, mock_env): + from awslimits.support import create_or_get_table -class DynamoHelpersTestCase(TestCase): - def setUp(self): - os.environ['ROLE_ARN'] = 'arn:aws:iam::212311232123:role/test' - os.environ['SENDGRID_API_KEY'] = '1231231231231231231' - from awslimits.support import create_or_get_table - - # unset these env vars +class TestDynamo(TestCase): def test_create_or_get_existing_table(self): - pass - + create_or_get_table() def test_create_or_get_new_table(self): pass - def test_create_or_get_table_exception(self): pass - def test_create_or_get_table_failed(self): pass From 86be4968e4a6335cd122d5c2537d992750637a73 Mon Sep 17 00:00:00 2001 From: helloangely Date: Wed, 11 Dec 2019 16:08:20 -0500 Subject: [PATCH 4/5] added intial test for creating new table --- tests/unit/test_limits.py | 33 ++++++++++++++++++++++++++++++--- 1 file changed, 30 insertions(+), 3 deletions(-) diff --git a/tests/unit/test_limits.py b/tests/unit/test_limits.py index 542a180..7831841 100644 --- a/tests/unit/test_limits.py +++ b/tests/unit/test_limits.py @@ -1,4 +1,5 @@ import moto +import boto3 from unittest import TestCase from mock import patch import os @@ -6,16 +7,42 @@ mock_env = { 'ROLE_ARN': 'arn:aws:iam::212311232123:role/test', 'SENDGRID_API_KEY': '1231231231231231231', + 'AWS_ACCESS_KEY_ID': 'awskey', + 'AWS_SECRET_ACCESS_KEY': 'awssecret', } with patch.dict(os.environ, mock_env): from awslimits.support import create_or_get_table +@moto.mock_dynamodb2 +@moto.mock_sts class TestDynamo(TestCase): - def test_create_or_get_existing_table(self): - create_or_get_table() - def test_create_or_get_new_table(self): + dynamodb = boto3.client('dynamodb', region_name="us-east-1") + table_name = 'awslimits_limits' + initial_table_list = dynamodb.list_tables() + assert len(initial_table_list["TableNames"]) == 0 + table = create_or_get_table( + table_name='awslimits_limits', + attribute_definitions=[ + { + 'AttributeName': 'limit_name', + 'AttributeType': 'S', + }, + ], + key_schema=[ + { + 'AttributeName': 'limit_name', + 'KeyType': 'HASH' + }, + ], + ) + assert table.name == 'awslimits_limits' + final_table_list = dynamodb.list_tables() + assert len(final_table_list["TableNames"]) == 1 + + + def test_create_or_get_exiting_table(self): pass def test_create_or_get_table_exception(self): From 795453fb5fbb0c238ed932a90c22db64c6760807 Mon Sep 17 00:00:00 2001 From: helloangely Date: Wed, 11 Dec 2019 16:16:40 -0500 Subject: [PATCH 5/5] test getting existing table --- tests/unit/test_limits.py | 41 ++++++++++++++++++++++++++++++++++++--- 1 file changed, 38 insertions(+), 3 deletions(-) diff --git a/tests/unit/test_limits.py b/tests/unit/test_limits.py index 7831841..db628f3 100644 --- a/tests/unit/test_limits.py +++ b/tests/unit/test_limits.py @@ -21,7 +21,7 @@ def test_create_or_get_new_table(self): dynamodb = boto3.client('dynamodb', region_name="us-east-1") table_name = 'awslimits_limits' initial_table_list = dynamodb.list_tables() - assert len(initial_table_list["TableNames"]) == 0 + assert table_name not in initial_table_list["TableNames"] table = create_or_get_table( table_name='awslimits_limits', attribute_definitions=[ @@ -39,11 +39,46 @@ def test_create_or_get_new_table(self): ) assert table.name == 'awslimits_limits' final_table_list = dynamodb.list_tables() - assert len(final_table_list["TableNames"]) == 1 + assert table_name in final_table_list["TableNames"] def test_create_or_get_exiting_table(self): - pass + dynamodb = boto3.client('dynamodb', region_name="us-east-1") + table_name = 'awslimits_limits1' + initial_table_list = dynamodb.list_tables() + assert table_name not in initial_table_list["TableNames"] + table = create_or_get_table( + table_name='awslimits_limits1', + attribute_definitions=[ + { + 'AttributeName': 'limit_name', + 'AttributeType': 'S', + }, + ], + key_schema=[ + { + 'AttributeName': 'limit_name', + 'KeyType': 'HASH' + }, + ], + ) + table = create_or_get_table( + table_name='awslimits_limits1', + attribute_definitions=[ + { + 'AttributeName': 'limit_name', + 'AttributeType': 'S', + }, + ], + key_schema=[ + { + 'AttributeName': 'limit_name', + 'KeyType': 'HASH' + }, + ], + ) + final_table_list = dynamodb.list_tables() + assert table_name in final_table_list["TableNames"] def test_create_or_get_table_exception(self): pass