From a9aa8cdc322ccfd2f7a3b6b9a098aeb5a4bae809 Mon Sep 17 00:00:00 2001 From: Tom Romano Date: Mon, 4 Dec 2023 15:01:50 -0500 Subject: [PATCH] Moving Serverless Workshop location --- .../serverless-testing-workshop/Makefile | 72 +++++ .../serverless-testing-workshop/README.md | 31 +++ .../_img/App_Architecture.png | Bin 0 -> 257508 bytes .../demo-app/_img/unicorn_art.md | 8 + .../demo-app/config-orig.json | 1 + .../demo-app/config.toml.cloud9only | 5 + .../demo-app/data/demo-data.csv | 10 + .../demo-app/requirements.txt | 4 + .../demo-app/urs-ui.py | 232 ++++++++++++++++ .../src/Checkout/app.py | 71 +++++ .../src/Checkout/requirements.txt | 3 + .../src/Checkout/schemas.py | 27 ++ .../src/CreateLocations/app.py | 48 ++++ .../src/CreateLocations/requirements.txt | 0 .../src/FileProcessor/StateMachine.asl.json | 103 +++++++ .../src/FileValidator/app.py | 30 ++ .../src/FileValidator/requirements.txt | 3 + .../src/FileValidator/schemas.py | 7 + .../src/GetInventory/app.py | 83 ++++++ .../src/GetInventory/requirements.txt | 3 + .../src/GetInventory/schemas.py | 23 ++ .../src/GetLocations/app.py | 49 ++++ .../src/GetLocations/requirements.txt | 3 + .../src/GetLocations/schemas.py | 26 ++ .../GetSignedUrlForInventoryFilePost/app.py | 86 ++++++ .../requirements.txt | 3 + .../schemas.py | 26 ++ .../serverless-testing-workshop/template.yaml | 258 ++++++++++++++++++ .../tests/events/Checkout-sample-event.json | 113 ++++++++ .../tests/events/fv_test.json | 2 + .../tests/events/sampleEvent.json | 70 +++++ .../integration/src/test_file_processor.py | 174 ++++++++++++ .../tests/integration/src/test_locations.py | 0 .../tests/requirements.txt | 13 + .../tests/unit/src/test_checkout.py | 166 +++++++++++ 35 files changed, 1753 insertions(+) create mode 100644 python-test-samples/serverless-testing-workshop/Makefile create mode 100644 python-test-samples/serverless-testing-workshop/README.md create mode 100644 python-test-samples/serverless-testing-workshop/_img/App_Architecture.png create mode 100644 python-test-samples/serverless-testing-workshop/demo-app/_img/unicorn_art.md create mode 100644 python-test-samples/serverless-testing-workshop/demo-app/config-orig.json create mode 100644 python-test-samples/serverless-testing-workshop/demo-app/config.toml.cloud9only create mode 100644 python-test-samples/serverless-testing-workshop/demo-app/data/demo-data.csv create mode 100644 python-test-samples/serverless-testing-workshop/demo-app/requirements.txt create mode 100644 python-test-samples/serverless-testing-workshop/demo-app/urs-ui.py create mode 100644 python-test-samples/serverless-testing-workshop/src/Checkout/app.py create mode 100644 python-test-samples/serverless-testing-workshop/src/Checkout/requirements.txt create mode 100644 python-test-samples/serverless-testing-workshop/src/Checkout/schemas.py create mode 100644 python-test-samples/serverless-testing-workshop/src/CreateLocations/app.py create mode 100644 python-test-samples/serverless-testing-workshop/src/CreateLocations/requirements.txt create mode 100644 python-test-samples/serverless-testing-workshop/src/FileProcessor/StateMachine.asl.json create mode 100644 python-test-samples/serverless-testing-workshop/src/FileValidator/app.py create mode 100644 python-test-samples/serverless-testing-workshop/src/FileValidator/requirements.txt create mode 100644 python-test-samples/serverless-testing-workshop/src/FileValidator/schemas.py create mode 100644 python-test-samples/serverless-testing-workshop/src/GetInventory/app.py create mode 100644 python-test-samples/serverless-testing-workshop/src/GetInventory/requirements.txt create mode 100644 python-test-samples/serverless-testing-workshop/src/GetInventory/schemas.py create mode 100644 python-test-samples/serverless-testing-workshop/src/GetLocations/app.py create mode 100644 python-test-samples/serverless-testing-workshop/src/GetLocations/requirements.txt create mode 100644 python-test-samples/serverless-testing-workshop/src/GetLocations/schemas.py create mode 100644 python-test-samples/serverless-testing-workshop/src/GetSignedUrlForInventoryFilePost/app.py create mode 100644 python-test-samples/serverless-testing-workshop/src/GetSignedUrlForInventoryFilePost/requirements.txt create mode 100644 python-test-samples/serverless-testing-workshop/src/GetSignedUrlForInventoryFilePost/schemas.py create mode 100644 python-test-samples/serverless-testing-workshop/template.yaml create mode 100644 python-test-samples/serverless-testing-workshop/tests/events/Checkout-sample-event.json create mode 100644 python-test-samples/serverless-testing-workshop/tests/events/fv_test.json create mode 100644 python-test-samples/serverless-testing-workshop/tests/events/sampleEvent.json create mode 100644 python-test-samples/serverless-testing-workshop/tests/integration/src/test_file_processor.py create mode 100644 python-test-samples/serverless-testing-workshop/tests/integration/src/test_locations.py create mode 100644 python-test-samples/serverless-testing-workshop/tests/requirements.txt create mode 100644 python-test-samples/serverless-testing-workshop/tests/unit/src/test_checkout.py diff --git a/python-test-samples/serverless-testing-workshop/Makefile b/python-test-samples/serverless-testing-workshop/Makefile new file mode 100644 index 00000000..5d131b83 --- /dev/null +++ b/python-test-samples/serverless-testing-workshop/Makefile @@ -0,0 +1,72 @@ +PIP ?= pip3 + +target: + $(info ${HELP_MESSAGE}) + @exit 0 + +clean: ##=> Deletes current build environment and latest build + $(info [*] Who needs all that anyway? Destroying environment....) + rm -rf ./.aws-sam/ ./venv/ + +checkOSDependencies: + python3 --version || grep "3.9" || (echo "Error: Requires Python 3.9" && exit 1) + +all: clean build + +install: checkOSDependencies + ${PIP} install virtualenv + python3 -m venv .venv + source ./.venv/bin/activate && ${PIP} install -r demo-app/requirements.txt + +shell: + source ./.venv/bin/activate + +deps: + source ./.venv/bin/activate && ${PIP} install -r tests/requirements.txt + +build: ##=> Same as package except that we don't create a ZIP + source ./.venv/bin/activate && sam build + +deploy: + source ./.venv/bin/activate && sam build + source ./.venv/bin/activate && sam deploy + +deploy.g: + source ./.venv/bin/activate && sam build + source ./.venv/bin/activate && sam deploy --guided + +scan: + source ./.venv/bin/activate && cfn_nag_scan --input-path template.yaml + source ./.venv/bin/activate && pylint src/sample_lambda/*.py tests/unit/src/*.py + +run-ui: + source ./.venv/bin/activate && cd ./demo-app && streamlit run urs-ui.py --server.port 8080 & + +delete: + source ./.venv/bin/activate && sam delete + +############# +# Helpers # +############# + +define HELP_MESSAGE + + Usage: make + + Commands: + + build Build Lambda function and dependencies + deploy.g Deploy guided (for initial deployment) + deploy Deploy subsequent changes + + install Install application and dev dependencies defined in requirements.txt + shell Spawn a virtual environment shell + deps Install project dependencies locally + scan Run code scanning tools + + run-ui Run the demonstration User Interface + + clean Cleans up local build artifacts and environment + delete Delete stack from AWS + +endef diff --git a/python-test-samples/serverless-testing-workshop/README.md b/python-test-samples/serverless-testing-workshop/README.md new file mode 100644 index 00000000..a047af65 --- /dev/null +++ b/python-test-samples/serverless-testing-workshop/README.md @@ -0,0 +1,31 @@ +[![python: 3.11](https://img.shields.io/badge/Python-3.11-green)](https://img.shields.io/badge/Python-3.11-green) +[![AWS: DynamoDB](https://img.shields.io/badge/AWS-DynamoDB-blueviolet)](https://img.shields.io/badge/AWS-DynamoDB-blueviolet) +[![AWS: S3](https://img.shields.io/badge/AWS-S3-green)](https://img.shields.io/badge/AWS-AWS-S3-green) +[![AWS: Step Functions](https://img.shields.io/badge/AWS%20Step%20Functions-orange)](https://img.shields.io/badge/AWS%20Step%20Functions-orange) +[![test: unit](https://img.shields.io/badge/Test-Unit-blue)](https://img.shields.io/badge/Test-Unit-blue) +[![test: integration](https://img.shields.io/badge/Test-Integration-yellow)](https://img.shields.io/badge/Test-Integration-yellow) + +# Serverless Testing Workshop + +## Introduction + +The project is a companion System Under Test for the Serverless Test Workshop. +For details and use, see the [Serverless Testing Workshop](https://catalog.us-east-1.prod.workshops.aws/workshops/0f9013f4-3960-426d-a445-dc3519b8e3d4/en-US) in Workshop Studio. + +--- + +## Architecture + +The system under test is a Unicorn Reservation System (URS) Application has a thin front-end, which makes API calls to the back-end services. + +[![Application Architecture](_img/App_Architecture.png) + +* The user interacts with a (locally) hosted UI [1]. +* An Amazon API Gateway [2] serves as the host for the back-end API calls, routing requests to multiple AWS Lambda functions based on the endpoint. +* An AWS Lambda [3] function will query the Amazon DynamoDB Table [4] that stores the Unicorn Inventory. +* An Amazon DynamoDB Table [4] stores the list of Unicorns, including the Unicorn Name, Location, Reservation Status, and for whom the unicorn is reserved. +* A Lambda function [5] returns the list of potential locations for Unicorns. +* A Lambda function [6] handles the reservation of a Unicorn +* A Lambda function [7] produces a signed URL for a user to upload a CSV file. +* A user can upload an inventory CSV file to an Amazon S3 Bucket [8]. Uploading a CSV file to the S3 Bucket triggers an EventBridge event [9]. +* The event [9] invokes an AWS Step Function [10], which reads the file and runs a validation Lambda function and a DynamoDB write for the Unicorns in the CSV file. Finally, a list of Unicorn locations is compiled. \ No newline at end of file diff --git a/python-test-samples/serverless-testing-workshop/_img/App_Architecture.png b/python-test-samples/serverless-testing-workshop/_img/App_Architecture.png new file mode 100644 index 0000000000000000000000000000000000000000..d06535ccc1ad45e8d820cf05499079b231583ebc GIT binary patch literal 257508 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

jeLqH|LD=1C`dB! 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 z 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 z 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 ND}C{F>Z$9l{|6D8(W(Fd literal 0 HcmV?d00001 diff --git a/python-test-samples/serverless-testing-workshop/demo-app/_img/unicorn_art.md b/python-test-samples/serverless-testing-workshop/demo-app/_img/unicorn_art.md new file mode 100644 index 00000000..6f5b42bd --- /dev/null +++ b/python-test-samples/serverless-testing-workshop/demo-app/_img/unicorn_art.md @@ -0,0 +1,8 @@ +``` +. /((((((\\\\ +=====(((<(((((((\ + (( \ + ( (@ _/ + \ / \ + | | | + o_) / ``` \ No newline at end of file diff --git a/python-test-samples/serverless-testing-workshop/demo-app/config-orig.json b/python-test-samples/serverless-testing-workshop/demo-app/config-orig.json new file mode 100644 index 00000000..611a6fbe --- /dev/null +++ b/python-test-samples/serverless-testing-workshop/demo-app/config-orig.json @@ -0,0 +1 @@ +{"api_endpoint": "https://y08ok3a5yl.execute-api.us-east-1.amazonaws.com/Prod/"} \ No newline at end of file diff --git a/python-test-samples/serverless-testing-workshop/demo-app/config.toml.cloud9only b/python-test-samples/serverless-testing-workshop/demo-app/config.toml.cloud9only new file mode 100644 index 00000000..ede07596 --- /dev/null +++ b/python-test-samples/serverless-testing-workshop/demo-app/config.toml.cloud9only @@ -0,0 +1,5 @@ +[server] +headless = true +port = 8080 +enableXsrfProtection=false +enableCORS = false \ No newline at end of file diff --git a/python-test-samples/serverless-testing-workshop/demo-app/data/demo-data.csv b/python-test-samples/serverless-testing-workshop/demo-app/data/demo-data.csv new file mode 100644 index 00000000..8855a873 --- /dev/null +++ b/python-test-samples/serverless-testing-workshop/demo-app/data/demo-data.csv @@ -0,0 +1,10 @@ +Unicorn Name,Unicorn Location +Sparkles,Unicornland +Sprinkles,Unicornland +Rainbow,Unicornland +Glitter,Unicornland +Stardust,Mythville +Shimmer,Mythville +Andromeda,Mythville +Aurora,Mythville +Ned,Unicornland \ No newline at end of file diff --git a/python-test-samples/serverless-testing-workshop/demo-app/requirements.txt b/python-test-samples/serverless-testing-workshop/demo-app/requirements.txt new file mode 100644 index 00000000..f5f9af16 --- /dev/null +++ b/python-test-samples/serverless-testing-workshop/demo-app/requirements.txt @@ -0,0 +1,4 @@ +requests +boto3 +streamlit +streamlit_js_eval \ No newline at end of file diff --git a/python-test-samples/serverless-testing-workshop/demo-app/urs-ui.py b/python-test-samples/serverless-testing-workshop/demo-app/urs-ui.py new file mode 100644 index 00000000..98bd26cb --- /dev/null +++ b/python-test-samples/serverless-testing-workshop/demo-app/urs-ui.py @@ -0,0 +1,232 @@ +""" +# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +# SPDX-License-Identifier: MIT-0 +# This is a demo Unicorn Reservation System front-end web application. +# To run: +# 1. Install the dependencies: pip3 install -r requirements.txt +# 2. Run the command: streamlit run urs-ui.py --server.port 8080 +# 3. The UI will be available in the browser +""" +import json +import os +import uuid +import time +import requests +import streamlit as st +from streamlit_js_eval import streamlit_js_eval + +# Initialize Contexts +if 'api_endpoint_url' not in st.session_state: + if os.path.isfile("config.json"): + with open("config.json","r",encoding="utf-8") as f: + app_config = json.load(f) + st.session_state['api_endpoint_url'] = app_config["api_endpoint"].strip() + else: + st.session_state['api_endpoint_url'] = "https://{APIGATEWAYID}.execute-api.{REGION}.amazonaws.com/Prod/" + +if 'unicorn_art' not in st.session_state: + with open("_img/unicorn_art.md","r",encoding="utf-8") as f: + st.session_state['unicorn_art'] = f.read() + +def update_api_endpoint(): + """ + Endpoint has changes, save it for next run + """ + if len(st.session_state['api_endpoint_url']) > 10: + with st.spinner("Saving New API Endpoint..."): + endpoint_json = {"api_endpoint": st.session_state['api_endpoint_url'].strip()} + with open("config.json","w",encoding="utf-8") as out_file: + json.dump(endpoint_json, out_file) + st.write("API Endpoint saved, refreshing browser to take effect.") + time.sleep(1) + streamlit_js_eval(js_expressions="parent.window.location.reload()") + + +def upload_file_to_s3(api_endpoint_url: str, file_to_upload: str) -> str: + """ + Upload a data file to S3 + :param: api_endpoint_url - the endpoint of the API Gateway + :param: file_to_upload - Path to the file to upload to S3 + :return: Status of the write + """ + get_presigned_url = f"{api_endpoint_url}/geturl" + response = requests.get(get_presigned_url,timeout=120) + with open(file_to_upload, 'rb') as upload_file_ptr: + files = {'file': (file_to_upload, upload_file_ptr)} + http_response = requests.post(response.json()['url'], + data=response.json()['fields'], + files=files) + if http_response.ok: + return "Data file written to S3. Waiting 20 seconds for processing and will then refresh browser." + else: + return "ERROR: Data file not written to S3." + +def get_inventory(api_endpoint_url: str, fetch_loc: str, available_only = False) -> list: + """ + Get Unicorn Inventory + :param: api_endpoint_url - the endpoint of the API Gateway + :param: fetch_loc - Filtering location + :param: available_only - boolean, if true, returns only available unicorns + :return: List of unicorn (dictionaries) + """ + try: + inventory_url = f"{api_endpoint_url}/list/{fetch_loc}" + if available_only: + inventory_url = inventory_url + "?available=True" + + # TODO: Pagination + response = requests.get(inventory_url, timeout=120) + return response.json()["unicorn_list"] + except Exception as err: + if "{APIGATEWAYID}" in st.session_state['api_endpoint_url'] or len(st.session_state['api_endpoint_url']) < 2: + print("Get Inventory: API URL not set.") + else: + print(err) + return [] + +def reserve_unicorn(api_endpoint_url: str, unicorn_name: str, unicorn_reserve_for : str) -> bool: + """ + Reserve a Unicorn + :param: api_endpoint_url - the endpoint of the API Gateway + :param: unicorn_name - Unicorn to reserve + :param: unicorn_reserve_for - Name of the person to reserve the unicorn for + :return: True on success + """ + post_payload = {"unicorn": unicorn_name, "reserved_for": unicorn_reserve_for } + inventory_url = f"{api_endpoint_url}/checkout" + response = requests.post(inventory_url, timeout=120, data=post_payload) + return response.ok + +def get_locations(api_endpoint_url: str) -> list: + """ + Get the list of unicorn locations + :param: api_endpoint_url - the endpoint of the API Gateway + :return: Array of locations + """ + try: + location_list_url = f"{api_endpoint_url}/locations" + response = requests.get(location_list_url, timeout=120) + return response.json()["locations"] + except Exception as err: + if "{APIGATEWAYID}" in st.session_state['api_endpoint_url'] or len(st.session_state['api_endpoint_url']) < 2: + print("Get Locations: API URL not set.") + else: + print(err) + return [] + + +# Initialize Inventory Tab Pick Lists and Displays +if 'inventory_locations' not in st.session_state: + st.session_state['inventory_locations'] = get_locations(st.session_state['api_endpoint_url']) + if len(st.session_state['inventory_locations']) > 0: + location_inv = st.session_state['inventory_locations'][0] + st.session_state['inventory_picked_location'] = location_inv + st.session_state['inventory_unicorns'] = get_inventory(st.session_state['api_endpoint_url'], location_inv ) + else: + st.session_state['inventory_picked_location'] = "" + st.session_state['inventory_unicorns'] = [] + +# Initialize Reservation Tab Pick Lists and Displays +if 'reservation_locations' not in st.session_state: + st.session_state['reservation_locations'] = get_locations(st.session_state['api_endpoint_url']) + if len(st.session_state['reservation_locations']) > 0: + location_res = st.session_state['reservation_locations'][0] + st.session_state['reservation_picked_location'] = location_res + u_list = [ u["Name"] for u in get_inventory(st.session_state['api_endpoint_url'], location_res, True ) ] + st.session_state['reservation_unicorns'] = u_list + else: + st.session_state['reservation_picked_location'] = "" + st.session_state['reservation_unicorns'] = [] + +def update_unicorn_inventory_list(): + """ + Update the sessions state for the list of unicorns for the current inventory location + """ + location_inv = st.session_state['inventory_picked_location'] + if location_inv != "": + u_list = get_inventory(st.session_state['api_endpoint_url'], location_inv ) + else: + u_list = [] + st.session_state['inventory_unicorns'] = u_list + +def update_unicorn_reserve_list(): + """ + Update the sessions state for the reservable unicorns for the current reserve location + """ + location_res = st.session_state['reservation_picked_location'] + if location_res != "": + u_list = [ u["Name"] for u in get_inventory(st.session_state['api_endpoint_url'], location_res, True ) ] + else: + u_list = [] + st.session_state['reservation_unicorns'] = u_list + + +# Generate the Application Title +col1, col2 = st.columns([1, 4]) +col1.markdown(st.session_state['unicorn_art']) +col2.header('Unicorn Reservation System (URS)', divider='rainbow') +col2.write("""*Reserving Happy Unicorns Around the World!*""") + +# The rest of the Application is on 3 tabs +listing_tab, reserve_tab, admin_tab = st.tabs(["Listing", "Reserve", "Administration"]) + +# Listing Tab +with listing_tab: + st.radio("Pick a location for the Unicorn listing:", + options=st.session_state['inventory_locations'], + key="inventory_picked_location", + on_change=update_unicorn_inventory_list) + st.table(st.session_state['inventory_unicorns']) + +# Reserve Tab +with reserve_tab: + st.radio("Pick a location for Unicorn reservations:", + options = st.session_state['reservation_locations'], + key="reservation_picked_location", + on_change=update_unicorn_reserve_list) + + if len(st.session_state['reservation_unicorns']) > 0: + + redraw_handle = st.empty() + redraw_handle.selectbox(label='Which Unicorn would you like to reserve?', + options=st.session_state['reservation_unicorns'], + key="reservation_unicorn_name") + reserve_for = st.text_input("Reserve Unicorn for:") + if st.button(f"Reserve Unicorn"): + unicorn_to_reserve = st.session_state['reservation_unicorn_name'] + with st.spinner("Reserving Unicorn..."): + reserve_status = reserve_unicorn(st.session_state['api_endpoint_url'], + st.session_state['reservation_unicorn_name'], + reserve_for) + if reserve_status: + st.write(f"Unicorn Reserved: {unicorn_to_reserve}") + time.sleep(1) + streamlit_js_eval(js_expressions="parent.window.location.reload()") + else: + st.write(f"Error reserving Unicorn {unicorn_to_reserve}!") + else: + st.write("No unicorns available at this location.") + +# Administration Tab +with admin_tab: + # Api Gateway Setup + new_api_endpoint = st.text_input("API Endpoint (Hit Return to Apply):", + max_chars=2048, + key="api_endpoint_url", + on_change=update_api_endpoint + ) + + # File picker for uploading to the unicorn inventory + uploaded_file = st.file_uploader("Choose a CSV file for the Unicorn Inventory.", type=["csv"]) + if uploaded_file is not None: + with st.spinner("Uploading file to S3..."): + TEMP_FILE_NAME = str(uuid.uuid4()) + ".csv" + string_data = uploaded_file.getvalue().decode("utf-8") + with open(TEMP_FILE_NAME,"w",encoding="utf-8") as out_file: + out_file.write(string_data) + out_message = upload_file_to_s3(st.session_state['api_endpoint_url'], TEMP_FILE_NAME) + os.remove(TEMP_FILE_NAME) + with st.spinner(out_message): + time.sleep(20) + streamlit_js_eval(js_expressions="parent.window.location.reload()") + diff --git a/python-test-samples/serverless-testing-workshop/src/Checkout/app.py b/python-test-samples/serverless-testing-workshop/src/Checkout/app.py new file mode 100644 index 00000000..750183e4 --- /dev/null +++ b/python-test-samples/serverless-testing-workshop/src/Checkout/app.py @@ -0,0 +1,71 @@ +""" +# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +# SPDX-License-Identifier: MIT-0 +# +# Lambda Function to reserve a Unicorn +# The DynamoDB Table used is passed as an environment variable "DYNAMODB_TABLE_NAME" +# Logic: +# Given unicorn (Unicorn Name) and (reserved_for) in the body payload +# Verify the Unicorn is available, if not return error status +# Update status to RESERVED +""" + +from os import environ +import urllib +import boto3 + + +from aws_xray_sdk.core import patch_all + +from aws_lambda_powertools.utilities.data_classes import APIGatewayProxyEvent +from aws_lambda_powertools.utilities.typing import LambdaContext +from aws_lambda_powertools.utilities.validation import validator + +from schemas import OUTPUT_SCHEMA +patch_all() + +@validator(outbound_schema=OUTPUT_SCHEMA) +def lambda_handler(event: APIGatewayProxyEvent, context: LambdaContext) -> dict: + """ + In this Lambda Function, all of the logic is in the handler. + It returns 400 if the unicorn is not found or is not available. + Otherwise, it will reserve the unicorn for the name indicated. + """ + + # Retrieve the table name from the environment, and create a boto3 Table object + dynamodb_table_name = environ["DYNAMODB_TABLE_NAME"] + dynamodb_resource = boto3.resource("dynamodb") + dynamodb_table = dynamodb_resource.Table(dynamodb_table_name) + + post_payload = {} + for item in event["body"].split("&"): + post_payload[item.split("=")[0]] = urllib.parse.unquote_plus(item.split("=")[1]) + + unicorn_to_checkout = post_payload["unicorn"] + checkout_to_name = post_payload["reserved_for"] + + # Creating the DynamoDB Table Resource + response = dynamodb_table.get_item( Key={"PK": unicorn_to_checkout}) + if "Item" not in response or response["Item"]["STATUS"] != "AVAILABLE": + status_code = 400 + body_payload = f"{unicorn_to_checkout} Not Available" + else: + response = dynamodb_table.update_item( + Key={"PK": unicorn_to_checkout}, + UpdateExpression="SET #s = :val1, #r = :val2", + ExpressionAttributeValues={ + ":val1": "RESERVED", + ":val2": checkout_to_name + }, + ExpressionAttributeNames={ + "#s":"STATUS", + "#r":"RES_BY" + } + ) + status_code = 200 + body_payload = "OK" + + return { + "statusCode": status_code, + "body": body_payload + } \ No newline at end of file diff --git a/python-test-samples/serverless-testing-workshop/src/Checkout/requirements.txt b/python-test-samples/serverless-testing-workshop/src/Checkout/requirements.txt new file mode 100644 index 00000000..2287254f --- /dev/null +++ b/python-test-samples/serverless-testing-workshop/src/Checkout/requirements.txt @@ -0,0 +1,3 @@ +aws-xray-sdk +aws_lambda_powertools +fastjsonschema \ No newline at end of file diff --git a/python-test-samples/serverless-testing-workshop/src/Checkout/schemas.py b/python-test-samples/serverless-testing-workshop/src/Checkout/schemas.py new file mode 100644 index 00000000..900bc691 --- /dev/null +++ b/python-test-samples/serverless-testing-workshop/src/Checkout/schemas.py @@ -0,0 +1,27 @@ +# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +# SPDX-License-Identifier: MIT-0 + +OUTPUT_SCHEMA = { + "$schema": "http://json-schema.org/draft-07/schema", + "$id": "http://example.com/example.json", + "type": "object", + "title": "Sample Output schema", + "description": "The root schema comprises the entire JSON document of the Return Schema.", + "examples": [{"statusCode": 200, "body": "OK"}], + "required": ["statusCode", "body"], + "properties": { + "statusCode": { + "$id": "#/properties/statusCode", + "type": "integer", + "title": "HTTP Status Code", + "examples": [200,401,500] + }, + "body": { + "$id": "#/properties/body", + "type": "string", + "title": "The response message", + "examples": ["OK","Error"], + "maxLength": 256, + } + }, +} \ No newline at end of file diff --git a/python-test-samples/serverless-testing-workshop/src/CreateLocations/app.py b/python-test-samples/serverless-testing-workshop/src/CreateLocations/app.py new file mode 100644 index 00000000..43ee3879 --- /dev/null +++ b/python-test-samples/serverless-testing-workshop/src/CreateLocations/app.py @@ -0,0 +1,48 @@ +""" +# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +# SPDX-License-Identifier: MIT-0 + +Compile a unique list of sorted Unicorn Locations. +""" +import os +import boto3 + + +def lambda_handler(event, _): + """ + Given a list of Unicorns Processed, put the unique locations in a quick lookup record + """ + + dynamodb = boto3.resource('dynamodb') + dynamodb_table_name = os.environ["DYNAMODB_TABLE_NAME"] + table = dynamodb.Table(dynamodb_table_name) + + locations = [x["LOCATION"] for x in event] + + # Append the Current List + response = table.get_item( + Key={ + 'PK': "LOCATION#LIST" + } + ) + + location_set = set() + for l in locations: + location_set.add(l) + if "Item" in response: + for l in response["Item"]["LOCATIONS"]: + location_set.add(l) + location_list_sorted = [x for x in sorted(location_set)] + + response = table.put_item( + Item={ + 'PK': "LOCATION#LIST", + 'LOCATIONS': location_list_sorted + } + ) + status_code = response['ResponseMetadata']['HTTPStatusCode'] + + return { + 'statusCode': status_code, + 'body': "Put {} locations".format(len(location_list_sorted)) + } diff --git a/python-test-samples/serverless-testing-workshop/src/CreateLocations/requirements.txt b/python-test-samples/serverless-testing-workshop/src/CreateLocations/requirements.txt new file mode 100644 index 00000000..e69de29b diff --git a/python-test-samples/serverless-testing-workshop/src/FileProcessor/StateMachine.asl.json b/python-test-samples/serverless-testing-workshop/src/FileProcessor/StateMachine.asl.json new file mode 100644 index 00000000..754a99e6 --- /dev/null +++ b/python-test-samples/serverless-testing-workshop/src/FileProcessor/StateMachine.asl.json @@ -0,0 +1,103 @@ +{ + "Comment": "A description of my state machine", + "StartAt": "File Analysis", + "States": { + "File Analysis": { + "Type": "Map", + "ItemProcessor": { + "ProcessorConfig": { + "Mode": "DISTRIBUTED", + "ExecutionType": "STANDARD" + }, + "StartAt": "Simulate a Longer Running Workflow", + "States": { + "Simulate a Longer Running Workflow": { + "Type": "Wait", + "Seconds": 5, + "Next": "Validate Unicorn File" + }, + "Validate Unicorn File": { + "Type": "Task", + "Resource": "arn:aws:states:::lambda:invoke", + "OutputPath": "$.Payload", + "Parameters": { + "Payload.$": "$", + "FunctionName": "${ValidateCSVFile}" + }, + "Retry": [ + { + "ErrorEquals": [ + "Lambda.ServiceException", + "Lambda.AWSLambdaException", + "Lambda.SdkClientException", + "Lambda.TooManyRequestsException" + ], + "IntervalSeconds": 1, + "MaxAttempts": 3, + "BackoffRate": 2 + } + ], + "Next": "DynamoDB PutItem" + }, + "DynamoDB PutItem": { + "Type": "Task", + "Resource": "arn:aws:states:::aws-sdk:dynamodb:putItem", + "Parameters": { + "TableName":"${UnicornTable}", + "Item": { + "PK": { + "S.$": "$.PK" + }, + "LOCATION": { + "S.$": "$.LOCATION" + }, + "STATUS": { + "S.$": "$.STATUS" + } + } + }, + "End": true, + "ResultPath": null + } + } + }, + "ItemReader": { + "Resource": "arn:aws:states:::s3:getObject", + "ReaderConfig": { + "InputType": "CSV", + "CSVHeaderLocation": "FIRST_ROW" + }, + "Parameters": { + "Bucket.$": "$.detail.bucket.name", + "Key.$": "$.detail.object.key" + } + }, + "MaxConcurrency": 10, + "Label": "FileAnalysis", + "Next": "CreateUnicornLocations" + }, + "CreateUnicornLocations": { + "Type": "Task", + "Resource": "arn:aws:states:::lambda:invoke", + "OutputPath": "$.Payload", + "Parameters": { + "Payload.$": "$", + "FunctionName": "${CreateLocations}" + }, + "Retry": [ + { + "ErrorEquals": [ + "Lambda.ServiceException", + "Lambda.AWSLambdaException", + "Lambda.SdkClientException", + "Lambda.TooManyRequestsException" + ], + "IntervalSeconds": 1, + "MaxAttempts": 3, + "BackoffRate": 2 + } + ], + "End": true + } + } +} \ No newline at end of file diff --git a/python-test-samples/serverless-testing-workshop/src/FileValidator/app.py b/python-test-samples/serverless-testing-workshop/src/FileValidator/app.py new file mode 100644 index 00000000..9dcccead --- /dev/null +++ b/python-test-samples/serverless-testing-workshop/src/FileValidator/app.py @@ -0,0 +1,30 @@ +""" +# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +# SPDX-License-Identifier: MIT-0 + +Validate a Unicorn name, assign an initial status, and convert data format +""" +import random +from aws_xray_sdk.core import patch_all +from aws_lambda_powertools.utilities.validation import validator +#from schemas import INPUT_SCHEMA, OUTPUT_SCHEMA +patch_all() + +# @validator(inbound_schema=INPUT_SCHEMA, outbound_schema=OUTPUT_SCHEMA) +def lambda_handler(event, _): + """ + Reformat the record and add a random initial status. + Validate the Unicorn Name and location + """ + + if event.get("Unicorn Name", None) is None: + raise Exception("Unicorn Name not provided") + + if event.get("Unicorn Location", None) is None: + raise Exception("Unicorn Location not provided") + + initial_status = "AVAILABLE" + + return {"PK":event["Unicorn Name"], + "LOCATION":event["Unicorn Location"], + "STATUS" : initial_status} diff --git a/python-test-samples/serverless-testing-workshop/src/FileValidator/requirements.txt b/python-test-samples/serverless-testing-workshop/src/FileValidator/requirements.txt new file mode 100644 index 00000000..2287254f --- /dev/null +++ b/python-test-samples/serverless-testing-workshop/src/FileValidator/requirements.txt @@ -0,0 +1,3 @@ +aws-xray-sdk +aws_lambda_powertools +fastjsonschema \ No newline at end of file diff --git a/python-test-samples/serverless-testing-workshop/src/FileValidator/schemas.py b/python-test-samples/serverless-testing-workshop/src/FileValidator/schemas.py new file mode 100644 index 00000000..64641096 --- /dev/null +++ b/python-test-samples/serverless-testing-workshop/src/FileValidator/schemas.py @@ -0,0 +1,7 @@ +""" +# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +# SPDX-License-Identifier: MIT-0 +""" + + + diff --git a/python-test-samples/serverless-testing-workshop/src/GetInventory/app.py b/python-test-samples/serverless-testing-workshop/src/GetInventory/app.py new file mode 100644 index 00000000..57f4ff2d --- /dev/null +++ b/python-test-samples/serverless-testing-workshop/src/GetInventory/app.py @@ -0,0 +1,83 @@ +""" +# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +# SPDX-License-Identifier: MIT-0 + +# Lambda Function to retrieve a Unicorn Inventory +# Requires pathParameters.location to specify LOCATION +# Optionally, if queryStringParameters.available is True, it will filter to only available +# unicorns. +# +# The DynamoDB Table used is passed as an environment variable "DYNAMODB_TABLE_NAME" +# The DynamoDB Index used is passed as an environment variable "DYNAMODB_INDEX_NAME" +""" + +from os import environ +import json +import boto3 +from boto3.dynamodb.conditions import Key +from aws_xray_sdk.core import patch_all + +from aws_lambda_powertools.utilities.data_classes import APIGatewayProxyEvent +from aws_lambda_powertools.utilities.typing import LambdaContext +from aws_lambda_powertools.utilities.validation import validator + +from schemas import OUTPUT_SCHEMA +patch_all() + +# Logic to implement: +# Return a list of Unicorns +# Use the GSI_LOCATION if a location is specified as a query parameter +# Support page_token pagination as a query parameter + + +@validator(outbound_schema=OUTPUT_SCHEMA) +def lambda_handler(event: APIGatewayProxyEvent, context: LambdaContext) -> dict: + """ + Lambda Handler for an API Gateway Event + """ + + # Retrieve the table name from the environment, and create a boto3 Table object + dynamodb_table_name = environ["DYNAMODB_TABLE_NAME"] + dynamodb_index_name = environ["DYNAMODB_INDEX_NAME"] + dynamodb_table = boto3.resource('dynamodb').Table(dynamodb_table_name) + + # Location is required + location = event["pathParameters"]["location"] + + # Optional filter to available + if event.get("queryStringParameters") is not None and \ + ( event["queryStringParameters"].get("available", "False").lower() == "true" ): + key_expression = Key("LOCATION").eq(location) & Key("STATUS").eq("AVAILABLE") + else: + key_expression = Key("LOCATION").eq(location) + + # Optional pagination token + if event.get("queryStringParameters") is not None: + page_token = event["queryStringParameters"].get("page_token") + else: + page_token = None + + # Query + if page_token is None: + response = dynamodb_table.query(IndexName=dynamodb_index_name, + KeyConditionExpression=key_expression) + else: + response = dynamodb_table.query(IndexName=dynamodb_index_name, + KeyConditionExpression=key_expression, + ExclusiveStartKey=json.loads(page_token)) + + items_list = [ {"Name": item["PK"],"Location":item["LOCATION"], + "Status":item["STATUS"], + "Reserved By":item.get("RES_BY","- available -")} + for item in response["Items"]] + + last_key = response.get("LastEvaluatedKey","END") + + status_code = 200 + body_payload = { "unicorn_list" : items_list, + "page_token" : last_key } + + return { + "statusCode": status_code, + "body": json.dumps(body_payload) + } diff --git a/python-test-samples/serverless-testing-workshop/src/GetInventory/requirements.txt b/python-test-samples/serverless-testing-workshop/src/GetInventory/requirements.txt new file mode 100644 index 00000000..b34d8824 --- /dev/null +++ b/python-test-samples/serverless-testing-workshop/src/GetInventory/requirements.txt @@ -0,0 +1,3 @@ +aws_xray_sdk +aws_lambda_powertools +fastjsonschema \ No newline at end of file diff --git a/python-test-samples/serverless-testing-workshop/src/GetInventory/schemas.py b/python-test-samples/serverless-testing-workshop/src/GetInventory/schemas.py new file mode 100644 index 00000000..d206b240 --- /dev/null +++ b/python-test-samples/serverless-testing-workshop/src/GetInventory/schemas.py @@ -0,0 +1,23 @@ +# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +# SPDX-License-Identifier: MIT-0 + +OUTPUT_SCHEMA = { + "$schema": "http://json-schema.org/draft-07/schema", + "type": "object", + "title": "Sample Output schema", + "description": "The root schema comprises the entire JSON document of the Return Schema.", + "examples": [{"statusCode": 200, "body": "OK", "unicorn_list":[] }], + "required": ["statusCode", "body"], + "properties": { + "statusCode": { + "type": "integer", + "title": "HTTP Status Code", + "examples": [200,401,500] + }, + "body": { + "type": "string", + "title": "The return message", + "examples": ["OK","Error"] + } + } +} \ No newline at end of file diff --git a/python-test-samples/serverless-testing-workshop/src/GetLocations/app.py b/python-test-samples/serverless-testing-workshop/src/GetLocations/app.py new file mode 100644 index 00000000..2846b5e3 --- /dev/null +++ b/python-test-samples/serverless-testing-workshop/src/GetLocations/app.py @@ -0,0 +1,49 @@ +""" +# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +# SPDX-License-Identifier: MIT-0 +# +# Lambda Function to retrieve the list of Locations +# The DynamoDB Table used is passed as an environment variable "DYNAMODB_TABLE_NAME" +# Logic: +# Retrieve and return the DynamoDB element "LOCATION#LIST" +""" + +from os import environ +import json +import boto3 + +from aws_xray_sdk.core import patch_all + +from aws_lambda_powertools.utilities.data_classes import APIGatewayProxyEvent +from aws_lambda_powertools.utilities.typing import LambdaContext +from aws_lambda_powertools.utilities.validation import validator + +from schemas import OUTPUT_SCHEMA +patch_all() + +@validator(outbound_schema=OUTPUT_SCHEMA) +def lambda_handler(event: APIGatewayProxyEvent, context: LambdaContext) -> dict: + """ + In this Lambda Function, all of the logic is in the handler. + It returns 400 if the unicorn is not found or is not available. + Otherwise, it will reserve the unicorn for the name indicated. + """ + + # Retrieve the table name from the environment, and create a boto3 Table object + dynamodb_table_name = environ["DYNAMODB_TABLE_NAME"] + dynamodb_resource = boto3.resource("dynamodb") + dynamodb_table = dynamodb_resource.Table(dynamodb_table_name) + + # Creating the DynamoDB Table Resource + response = dynamodb_table.get_item( Key={"PK": "LOCATION#LIST"}) + if "Item" not in response: + status_code = 400 + body_payload = {"locations":[]} + else: + status_code = 200 + body_payload = {"locations": response["Item"]["LOCATIONS"]} + + return { + "statusCode": status_code, + "body": json.dumps(body_payload) + } \ No newline at end of file diff --git a/python-test-samples/serverless-testing-workshop/src/GetLocations/requirements.txt b/python-test-samples/serverless-testing-workshop/src/GetLocations/requirements.txt new file mode 100644 index 00000000..2287254f --- /dev/null +++ b/python-test-samples/serverless-testing-workshop/src/GetLocations/requirements.txt @@ -0,0 +1,3 @@ +aws-xray-sdk +aws_lambda_powertools +fastjsonschema \ No newline at end of file diff --git a/python-test-samples/serverless-testing-workshop/src/GetLocations/schemas.py b/python-test-samples/serverless-testing-workshop/src/GetLocations/schemas.py new file mode 100644 index 00000000..8018f3e2 --- /dev/null +++ b/python-test-samples/serverless-testing-workshop/src/GetLocations/schemas.py @@ -0,0 +1,26 @@ +# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +# SPDX-License-Identifier: MIT-0 + +OUTPUT_SCHEMA = { + "$schema": "http://json-schema.org/draft-07/schema", + "$id": "http://example.com/example.json", + "type": "object", + "title": "Sample Output schema", + "description": "The root schema comprises the entire JSON document of the Return Schema.", + "examples": [{"statusCode": 200, "body": "OK"}], + "required": ["statusCode", "body"], + "properties": { + "statusCode": { + "$id": "#/properties/statusCode", + "type": "integer", + "title": "HTTP Status Code", + "examples": [200,401,500] + }, + "body": { + "$id": "#/properties/body", + "type": "string", + "title": "The response message", + "examples": ["OK","Error"] + } + }, +} \ No newline at end of file diff --git a/python-test-samples/serverless-testing-workshop/src/GetSignedUrlForInventoryFilePost/app.py b/python-test-samples/serverless-testing-workshop/src/GetSignedUrlForInventoryFilePost/app.py new file mode 100644 index 00000000..c6196313 --- /dev/null +++ b/python-test-samples/serverless-testing-workshop/src/GetSignedUrlForInventoryFilePost/app.py @@ -0,0 +1,86 @@ +""" +# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +# SPDX-License-Identifier: MIT-0 + +# Placeholder Lambda Handler for the Python apigw-lambda-dynamodb example +# The S3 Bucket used is passed as an environment variable "S3_BUCKET_NAME" + +# Logic to implement: +# Create a path/key with a datetime stamp in it +# Generate and return a signed URL for the bucket/key +""" + +from os import environ +import json +import logging +import uuid +from datetime import datetime +import boto3 +from botocore.exceptions import ClientError +from aws_xray_sdk.core import patch_all + +from aws_lambda_powertools.utilities.data_classes import APIGatewayProxyEvent +from aws_lambda_powertools.utilities.typing import LambdaContext +from aws_lambda_powertools.utilities.validation import validator + +from schemas import OUTPUT_SCHEMA +patch_all() + + +def create_presigned_post(bucket_name, object_name, + fields=None, conditions=None, expiration=3600): + """Generate a presigned URL S3 POST request to upload a file + Source: https://boto3.amazonaws.com/v1/documentation/api/latest/guide/s3-presigned-urls.html + :param bucket_name: string + :param object_name: string + :param fields: Dictionary of prefilled form fields + :param conditions: List of conditions to include in the policy + :param expiration: Time in seconds for the presigned URL to remain valid + :return: Dictionary with the following keys: + url: URL to post to + fields: Dictionary of form fields and values to submit with the POST + :return: None if error. + """ + + # Generate a presigned S3 POST URL + s3_client = boto3.client('s3') + try: + response = s3_client.generate_presigned_post(bucket_name, + object_name, + Fields=fields, + Conditions=conditions, + ExpiresIn=expiration) + except ClientError as err_client: + logging.error(err_client) + raise err_client + + # The response contains the presigned URL and required fields + return response + + +@validator(outbound_schema=OUTPUT_SCHEMA) +def lambda_handler(event: APIGatewayProxyEvent, context: LambdaContext) -> dict: + """ + API Gateway Event Handler + """ + + # Retrieve the bucket name from the environment, and create a boto3 s3 resource + s3_bucket_name = environ["S3_BUCKET_NAME"] + + # Business Logic that should be tested: Compute an upload file name + # Create a prefix for year/month/day, and name the file unicorn_load_DATETIME_UUID.csv + datetime_stamp = datetime.now().strftime('%Y%m%dT%H%M%S') + file_prefix = datetime.now().strftime('%Y/%m/%d') + unique_id = str(uuid.uuid4()) + file_key = f"{file_prefix}/unicorn_load_{datetime_stamp}_{unique_id}.csv" + + + # Retrieve Pre-Signed URL for a POST operation + pre_signed_url = create_presigned_post(s3_bucket_name, file_key) + + status_code = 200 + + return { + "statusCode": status_code, + "body": json.dumps(pre_signed_url) + } diff --git a/python-test-samples/serverless-testing-workshop/src/GetSignedUrlForInventoryFilePost/requirements.txt b/python-test-samples/serverless-testing-workshop/src/GetSignedUrlForInventoryFilePost/requirements.txt new file mode 100644 index 00000000..2287254f --- /dev/null +++ b/python-test-samples/serverless-testing-workshop/src/GetSignedUrlForInventoryFilePost/requirements.txt @@ -0,0 +1,3 @@ +aws-xray-sdk +aws_lambda_powertools +fastjsonschema \ No newline at end of file diff --git a/python-test-samples/serverless-testing-workshop/src/GetSignedUrlForInventoryFilePost/schemas.py b/python-test-samples/serverless-testing-workshop/src/GetSignedUrlForInventoryFilePost/schemas.py new file mode 100644 index 00000000..0ccc37ed --- /dev/null +++ b/python-test-samples/serverless-testing-workshop/src/GetSignedUrlForInventoryFilePost/schemas.py @@ -0,0 +1,26 @@ +# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +# SPDX-License-Identifier: MIT-0 + +OUTPUT_SCHEMA = { + "$schema": "http://json-schema.org/draft-07/schema", + "$id": "http://example.com/example.json", + "type": "object", + "title": "Sample Output schema", + "description": "The root schema comprises the entire JSON document of the Return Schema.", + "examples": [{"statusCode": 200, "body": "Hello Tom Smith!"}], + "required": ["statusCode", "body"], + "properties": { + "statusCode": { + "$id": "#/properties/statusCode", + "type": "integer", + "title": "HTTP Status Code", + "examples": [200,401,500] + }, + "body": { + "$id": "#/properties/body", + "type": "string", + "title": "The status message", + "examples": ["OK","Error","Error"] + } + }, +} \ No newline at end of file diff --git a/python-test-samples/serverless-testing-workshop/template.yaml b/python-test-samples/serverless-testing-workshop/template.yaml new file mode 100644 index 00000000..e6b1f745 --- /dev/null +++ b/python-test-samples/serverless-testing-workshop/template.yaml @@ -0,0 +1,258 @@ +# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +# SPDX-License-Identifier: MIT-0 + +AWSTemplateFormatVersion: "2010-09-09" +Transform: AWS::Serverless-2016-10-31 +Description: SAM Template for serverless-test-workshop + +# More info about Globals: https://github.com/awslabs/serverless-application-model/blob/master/docs/globals.rst +Globals: + Function: + Timeout: 30 + +Resources: + # DynamoDB Resource https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-dynamodb-table.html + + # This single-table DynamoDB design has a generic Partition Key (PK) and Sort Key (RK), and the item fields + # are dependent on the item type: + # "Unicorn Items" : PK = {id}, SK = "LOCATION", STATUS = "AVAILABLE|RESERVED|RETIRED" + # "Summary Items" : PK = {statistic}, SK = "STAT", data = {value} + + UnicornInventoryTable: + Type: AWS::DynamoDB::Table + UpdateReplacePolicy: Delete + Properties: + AttributeDefinitions: + - AttributeName: PK + AttributeType: S + - AttributeName: LOCATION + AttributeType: S + - AttributeName: STATUS + AttributeType: S + KeySchema: + - AttributeName: PK + KeyType: HASH + GlobalSecondaryIndexes: + - IndexName: "GSI_LOCATION" + KeySchema: + - AttributeName: "LOCATION" + KeyType: "HASH" + - AttributeName: "STATUS" + KeyType: "RANGE" + Projection: + ProjectionType: "ALL" + BillingMode: PAY_PER_REQUEST + SSESpecification: + SSEEnabled: true + Metadata: + SamResourceId: UnicornInventoryTable + + # More info about Function Resource: https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#awsserverlessfunction + + UnicornInventoryBucket: + Type: AWS::S3::Bucket + UpdateReplacePolicy: Delete + Properties: + BucketName: !Sub "unicorn-inv-${AWS::StackName}-${AWS::AccountId}" + BucketEncryption: + ServerSideEncryptionConfiguration: + - ServerSideEncryptionByDefault: + SSEAlgorithm: AES256 + PublicAccessBlockConfiguration: + BlockPublicAcls: true + BlockPublicPolicy: true + IgnorePublicAcls: true + RestrictPublicBuckets: true + VersioningConfiguration: + Status: Enabled + NotificationConfiguration: + EventBridgeConfiguration: + EventBridgeEnabled: True + Metadata: + SamResourceId: SampleBucket + + # More info about Function Resource: https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#awsserverlessfunction + # The Lambda function supports the /request-url-for-inventory endpoint + # The function returns a signed url for uploading a Unicorn inventory to S3 + + CheckoutFunction: + Type: AWS::Serverless::Function + Properties: + Tracing: Active + Policies: + - AWSXrayWriteOnlyAccess + - DynamoDBCrudPolicy: + TableName: !Ref UnicornInventoryTable + CodeUri: src/Checkout/ + Handler: app.lambda_handler + Runtime: python3.11 + Environment: + Variables: + DYNAMODB_TABLE_NAME: + Ref: UnicornInventoryTable + Events: + Checkout: + Type: Api + Properties: + Path: /checkout + Method: post + + GetInventoryFunction: + Type: AWS::Serverless::Function + Properties: + Tracing: Active + Policies: + - AWSXrayWriteOnlyAccess + - DynamoDBReadPolicy: + TableName: !Ref UnicornInventoryTable + CodeUri: src/GetInventory/ + Handler: app.lambda_handler + Runtime: python3.11 + Environment: + Variables: + DYNAMODB_TABLE_NAME: + Ref: UnicornInventoryTable + DYNAMODB_INDEX_NAME: "GSI_LOCATION" + Events: + Checkout: + Type: Api + Properties: + Path: /list/{location} + Method: get + RequestParameters: + - method.request.header.Authorization + - method.request.querystring.page_token: + Required: false + Caching: false + - method.request.querystring.available: + Required: false + Caching: false + + GetLocations: + Type: AWS::Serverless::Function + Properties: + Tracing: Active + Policies: + - AWSXrayWriteOnlyAccess + - DynamoDBReadPolicy: + TableName: !Ref UnicornInventoryTable + CodeUri: src/GetLocations/ + Handler: app.lambda_handler + Runtime: python3.11 + Environment: + Variables: + DYNAMODB_TABLE_NAME: + Ref: UnicornInventoryTable + Events: + Checkout: + Type: Api + Properties: + Path: /locations + Method: get + RequestParameters: + - method.request.header.Authorization + + GetSignedUrlForInventoryFilePost: + Type: AWS::Serverless::Function + Properties: + Tracing: Active + Policies: + - AWSXrayWriteOnlyAccess + - S3WritePolicy: + BucketName: !Sub "unicorn-inv-${AWS::StackName}-${AWS::AccountId}" + CodeUri: src/GetSignedUrlForInventoryFilePost/ + Handler: app.lambda_handler + Runtime: python3.11 + Environment: + Variables: + S3_BUCKET_NAME: !Sub "unicorn-inv-${AWS::StackName}-${AWS::AccountId}" + Events: + Checkout: + Type: Api + Properties: + Path: /geturl + Method: get + + FileValidator: + Type: AWS::Serverless::Function + Properties: + Tracing: Active + CodeUri: src/FileValidator/ + Handler: app.lambda_handler + Runtime: python3.11 + Policies: + - AWSXrayWriteOnlyAccess + - S3ReadPolicy: + BucketName: !Sub "unicorn-inv-${AWS::StackName}-${AWS::AccountId}" + + CreateLocations: + Type: AWS::Serverless::Function + Properties: + Tracing: Active + CodeUri: src/CreateLocations/ + Handler: app.lambda_handler + Runtime: python3.11 + Environment: + Variables: + DYNAMODB_TABLE_NAME: + Ref: UnicornInventoryTable + Policies: + - DynamoDBCrudPolicy: + TableName: !Ref UnicornInventoryTable + + # More info about State Machine Resource: https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/sam-resource-statemachine.html + SFProcessFile: + Type: AWS::Serverless::StateMachine + Properties: + Name: !Sub "${AWS::StackName}-SFProcessFile-${AWS::AccountId}" + DefinitionUri: src/FileProcessor/StateMachine.asl.json + DefinitionSubstitutions: + ValidateCSVFile: !GetAtt FileValidator.Arn + UnicornTable: !Ref UnicornInventoryTable + CreateLocations: !GetAtt CreateLocations.Arn + Policies: + - LambdaInvokePolicy: + FunctionName: !Ref CreateLocations + - LambdaInvokePolicy: + FunctionName: !Ref FileValidator + - DynamoDBCrudPolicy: + TableName: !Ref UnicornInventoryTable + - S3ReadPolicy: + BucketName: !Sub "unicorn-inv-${AWS::StackName}-${AWS::AccountId}" + - StepFunctionsExecutionPolicy: + StateMachineName: !Sub "${AWS::StackName}-SFProcessFile-${AWS::AccountId}" + Events: + NewInventoryFileInS3: + Type: EventBridgeRule + Properties: + EventBusName: default + Pattern: + source: + - aws.s3 + detail-type: + - Object Created + detail: + bucket: + name: + - !Ref UnicornInventoryBucket + + +Outputs: + # ServerlessRestApi is an implicit API created out of Events key under Serverless::Function + # Find out more about other implicit resources you can reference within SAM + # https://github.com/awslabs/serverless-application-model/blob/master/docs/internals/generated_resources.rst#api + ApiEndpoint: + Description: "API Gateway endpoint URL, set this in the Demo UI: Administration tab, API Endpoint" + Value: !Sub "https://${ServerlessRestApi}.execute-api.${AWS::Region}.amazonaws.com/Prod/" + DynamoDBTableName: + Description: "Unicorn Inventory DynamoDB table name" + Value: !Ref UnicornInventoryTable + UnicornInventoryBucket: + Description: "Unicorn Inventory Bucket Name" + Value: !Ref UnicornInventoryBucket + GetInventoryFunction: + Description: "Name of the Lambda function required in the 'Invoke a Lambda function in the cloud' section." + Value: !Ref GetInventoryFunction + GetFileValidatorARN: + Description: "ARN of the Lambda function required in the 'OPTIONAL: Invoke a Lambda function in the cloud' section." + Value: !GetAtt FileValidator.Arn \ No newline at end of file diff --git a/python-test-samples/serverless-testing-workshop/tests/events/Checkout-sample-event.json b/python-test-samples/serverless-testing-workshop/tests/events/Checkout-sample-event.json new file mode 100644 index 00000000..eaeddc3b --- /dev/null +++ b/python-test-samples/serverless-testing-workshop/tests/events/Checkout-sample-event.json @@ -0,0 +1,113 @@ +{ + "body": "\"unicorn\"=\"testunicorn\"&\"reserved_for\"=\"testuser\"", + "resource": "/checkout", + "path": "/checkout", + "httpMethod": "POST", + "isBase64Encoded": true, + "queryStringParameters": {}, + "multiValueQueryStringParameters": {}, + "pathParameters": {}, + "stageVariables": {}, + "headers": { + "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8", + "Accept-Encoding": "gzip, deflate, sdch", + "Accept-Language": "en-US,en;q=0.8", + "Cache-Control": "max-age=0", + "CloudFront-Forwarded-Proto": "https", + "CloudFront-Is-Desktop-Viewer": "true", + "CloudFront-Is-Mobile-Viewer": "false", + "CloudFront-Is-SmartTV-Viewer": "false", + "CloudFront-Is-Tablet-Viewer": "false", + "CloudFront-Viewer-Country": "US", + "Host": "1234567890.execute-api.us-east-1.amazonaws.com", + "Upgrade-Insecure-Requests": "1", + "User-Agent": "Custom User Agent String", + "Via": "1.1 08f323deadbeefa7af34d5feb414ce27.cloudfront.net (CloudFront)", + "X-Amz-Cf-Id": "cDehVQoZnx43VYQb9j2-nvCh-9z396Uhbp027Y2JvkCPNLmGJHqlaA==", + "X-Forwarded-For": "127.0.0.1, 127.0.0.2", + "X-Forwarded-Port": "443", + "X-Forwarded-Proto": "https" + }, + "multiValueHeaders": { + "Accept": [ + "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8" + ], + "Accept-Encoding": [ + "gzip, deflate, sdch" + ], + "Accept-Language": [ + "en-US,en;q=0.8" + ], + "Cache-Control": [ + "max-age=0" + ], + "CloudFront-Forwarded-Proto": [ + "https" + ], + "CloudFront-Is-Desktop-Viewer": [ + "true" + ], + "CloudFront-Is-Mobile-Viewer": [ + "false" + ], + "CloudFront-Is-SmartTV-Viewer": [ + "false" + ], + "CloudFront-Is-Tablet-Viewer": [ + "false" + ], + "CloudFront-Viewer-Country": [ + "US" + ], + "Host": [ + "0123456789.execute-api.us-east-1.amazonaws.com" + ], + "Upgrade-Insecure-Requests": [ + "1" + ], + "User-Agent": [ + "Custom User Agent String" + ], + "Via": [ + "1.1 08f323deadbeefa7af34d5feb414ce27.cloudfront.net (CloudFront)" + ], + "X-Amz-Cf-Id": [ + "cDehVQoZnx43VYQb9j2-nvCh-9z396Uhbp027Y2JvkCPNLmGJHqlaA==" + ], + "X-Forwarded-For": [ + "127.0.0.1, 127.0.0.2" + ], + "X-Forwarded-Port": [ + "443" + ], + "X-Forwarded-Proto": [ + "https" + ] + }, + "requestContext": { + "accountId": "123456789012", + "resourceId": "123456", + "stage": "prod", + "requestId": "c6af9ac6-7b61-11e6-9a41-93e8deadbeef", + "requestTime": "09/Apr/2015:12:34:56 +0000", + "requestTimeEpoch": 1428582896000, + "identity": { + "cognitoIdentityPoolId": null, + "accountId": null, + "cognitoIdentityId": null, + "caller": null, + "accessKey": null, + "sourceIp": "127.0.0.1", + "cognitoAuthenticationType": null, + "cognitoAuthenticationProvider": null, + "userArn": null, + "userAgent": "Custom User Agent String", + "user": null + }, + "path": "/Prod/checkout", + "resourcePath": "/checkout", + "httpMethod": "POST", + "apiId": "1234567890", + "protocol": "HTTP/1.1" + } +} diff --git a/python-test-samples/serverless-testing-workshop/tests/events/fv_test.json b/python-test-samples/serverless-testing-workshop/tests/events/fv_test.json new file mode 100644 index 00000000..87158523 --- /dev/null +++ b/python-test-samples/serverless-testing-workshop/tests/events/fv_test.json @@ -0,0 +1,2 @@ +{"Unicorn Name" : "Hello Unicorn", +"Unicorn Location" : "Hello Location"} \ No newline at end of file diff --git a/python-test-samples/serverless-testing-workshop/tests/events/sampleEvent.json b/python-test-samples/serverless-testing-workshop/tests/events/sampleEvent.json new file mode 100644 index 00000000..c840cc6f --- /dev/null +++ b/python-test-samples/serverless-testing-workshop/tests/events/sampleEvent.json @@ -0,0 +1,70 @@ +{ + "version": "2.0", + "routeKey": "$default", + "rawPath": "/path/to/resource", + "rawQueryString": "parameter1=value1¶meter1=value2¶meter2=value", + "cookies": [ + "cookie1", + "cookie2" + ], + "headers": { + "Header1": "value1", + "Header2": "value1,value2" + }, + "queryStringParameters": { + "parameter1": "value1,value2", + "parameter2": "value" + }, + "requestContext": { + "accountId": "123456789012", + "apiId": "api-id", + "authentication": { + "clientCert": { + "clientCertPem": "CERT_CONTENT", + "subjectDN": "www.example.com", + "issuerDN": "Example issuer", + "serialNumber": "a1:a1:a1:a1:a1:a1:a1:a1:a1:a1:a1:a1:a1:a1:a1:a1", + "validity": { + "notBefore": "May 28 12:30:02 2019 GMT", + "notAfter": "Aug 5 09:36:04 2021 GMT" + } + } + }, + "authorizer": { + "jwt": { + "claims": { + "claim1": "value1", + "claim2": "value2" + }, + "scopes": [ + "scope1", + "scope2" + ] + } + }, + "domainName": "id.execute-api.us-east-1.amazonaws.com", + "domainPrefix": "id", + "http": { + "method": "POST", + "path": "/path/to/resource", + "protocol": "HTTP/1.1", + "sourceIp": "192.168.0.1/32", + "userAgent": "agent" + }, + "requestId": "id", + "routeKey": "$default", + "stage": "$default", + "time": "12/Mar/2020:19:03:58 +0000", + "timeEpoch": 1583348638390 + }, + "body": "unicorn=TESTUNICORN&reserved_for=TESTUSER", + "pathParameters": { + "id": "TEST001" + }, + "isBase64Encoded": true, + "stageVariables": { + "stageVariable1": "value1", + "stageVariable2": "value2" + } + } + \ No newline at end of file diff --git a/python-test-samples/serverless-testing-workshop/tests/integration/src/test_file_processor.py b/python-test-samples/serverless-testing-workshop/tests/integration/src/test_file_processor.py new file mode 100644 index 00000000..aff957e4 --- /dev/null +++ b/python-test-samples/serverless-testing-workshop/tests/integration/src/test_file_processor.py @@ -0,0 +1,174 @@ +""" +# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +# SPDX-License-Identifier: MIT-0 +""" + +import os +from time import sleep +from unittest import TestCase +from uuid import uuid4 +import boto3 +from boto3.dynamodb.conditions import Key + +class TestFileProcessingWorkflow(TestCase): + """ + Test case for the file processing workflow + + Set the environment variable AWS_SAM_STACK_NAME + to match the name of the stack you will test + + AWS_SAM_STACK_NAME= python -m pytest -s tests/integration -v + """ + aws_region = os.environ.get("AWS_DEFAULT_REGION") or "us-east-1" + + @classmethod + def get_stack_name(cls) -> str: + """ + Retrieve the SUT stack name from an environment variable AWS_SAM_STACK_NAME + Fail test if not found + """ + stack_name = os.environ.get("AWS_SAM_STACK_NAME") + if not stack_name: + raise Exception( + "Cannot find env var AWS_SAM_STACK_NAME. \n" + "Setup this environment variable with the stack name for integration tests. \n" + "AWS_SAM_STACK_NAME= python -m pytest -s tests/integration -v" + ) + + return stack_name + + def setUp(self) -> None: + """ + Based on the provided env variable AWS_SAM_STACK_NAME, + We use the cloudformation API to retrieve the GetInventory URL and the DynamoDB Table Name + We also seed the DynamoDB Table for the test + """ + stack_name = TestFileProcessingWorkflow.get_stack_name() + + client = boto3.client("cloudformation") + + try: + response = client.describe_stacks(StackName=stack_name) + except Exception as e: + raise Exception( + f"Cannot find stack {stack_name}. \n" + \ + f'Please make sure stack with the name "{stack_name}" exists.' + ) from e + + stack_outputs = response["Stacks"][0]["Outputs"] + + # DynamoDBTableName + dynamodb_outputs = [output for output in stack_outputs + if output["OutputKey"] == "DynamoDBTableName"] + self.assertTrue(dynamodb_outputs, f"Cannot find DynamoDBTableName in {stack_name}") + self.dynamodb_table_name = dynamodb_outputs[0]["OutputValue"] + + # UnicornInventoryBucket + inv_bucket_outputs = [output for output in stack_outputs + if output["OutputKey"] == "UnicornInventoryBucket"] + self.assertTrue(inv_bucket_outputs, f"Cannot find UnicornInventoryBucket in {stack_name}") + self.inv_bucket_name = inv_bucket_outputs[0]["OutputValue"] + + # Create a random postfix for the id's to prevent data collisions between tests + # Using unique id's per unit test will isolate test data + # Use this id in all test data values or artifacts + + self.id_postfix = "_" + str(uuid4()) + self.test_unicorn = f"TEST_UNI{self.id_postfix}" + self.test_location = f"TEST_LOC{self.id_postfix}" + + def tearDown(self) -> None: + """ + # For tear-down, remove any data injected for the tests + # Take particular care to ensure these values are unique and identifiable as TEST data. + """ + dynamodb_resource = boto3.resource("dynamodb", region_name = self.aws_region) + dynamodb_table = dynamodb_resource.Table(name=self.dynamodb_table_name) + + id_items = dynamodb_table.query( + KeyConditionExpression=Key('PK').eq(self.test_unicorn) + ) + if "Items" in id_items: + dynamodb_table.delete_item(Key={"PK":self.test_unicorn}) + + # And remove the test data from the locations + location_list_q = dynamodb_table.get_item( + Key={ + 'PK': "LOCATION#LIST" + } + ) + if "Item" in location_list_q: + locations = [ x for x in location_list_q["Item"]["LOCATIONS"] + if x != self.test_location ] + _ = dynamodb_table.put_item( + Item={ + 'PK': "LOCATION#LIST", + 'LOCATIONS': locations + } + ) + + def test_file_processor_happy_path(self): + """ + Test that given an S3 file, the Unicorn is created in DynamoDB + In a real-world scenario, we would test variations and failure modes as well + """ + + print(f"\nTest Data: {self.test_unicorn}\n") + + dynamodb_resource = boto3.resource("dynamodb", region_name = self.aws_region) + dynamodb_table = dynamodb_resource.Table(name=self.dynamodb_table_name) + + # Verify the data is not there, which would invalidate the test + item_should_not_be_found = dynamodb_table.query( + KeyConditionExpression=Key('PK').eq(self.test_unicorn) + ) + self.assertEqual(item_should_not_be_found["Count"], 0, + "Data exists before test, invalid starting state") + + # Seed the S3 Bucket with Test Data + # Note the uniqueness of the test data and S3 key to prevent collisions with actual data: + # both the postfix and the exact test name are part of the filename. + test_data_csv = f'"Unicorn Name","Unicorn Location"\n"' + test_data_csv += f'{self.test_unicorn}","{self.test_location}"\n' + + test_data_key = f"INTEGRATION_TEST/TEST{self.id_postfix}.test_file_processor_happy_path.csv" + s3_client = boto3.client('s3') + s3_client.put_object(Body=test_data_csv, + Bucket=self.inv_bucket_name, + Key=test_data_key) + + # Poll for processing completion + poll_max_seconds = 30 + poll_complete_seconds = 0 + + while poll_complete_seconds < poll_max_seconds: + # Check that data is present + item_should_be_found = dynamodb_table.query( + KeyConditionExpression=Key('PK').eq(self.test_unicorn) + ) + if item_should_be_found["Count"] == 0: + sleep(1) + poll_complete_seconds +=1 + else: + break + + # Happy Path Checks: 1 item found within a good timeframe, data is as expected. + self.assertGreater(item_should_be_found["Count"], 0, + "Item not found after time allowed for processing.") + + self.assertLessEqual(poll_complete_seconds, 2, + f"Unicorns should be fast! Took too long: {poll_complete_seconds} sec") + + self.assertEqual(item_should_be_found["Count"], 1, + "More than one item found after insert of data") + + self.assertEqual(item_should_be_found["Items"][0]["PK"], self.test_unicorn, + "Table PK is not set to the Unicorn Name: " + \ + item_should_be_found["Items"][0]["PK"] + " expected " + self.test_unicorn) + + self.assertEqual(item_should_be_found["Items"][0]["LOCATION"], self.test_location, + "Table LOCATION is not set to the Unicorn Location: " + \ + item_should_be_found["Items"][0]["LOCATION"] + " expected " + self.test_location) + + self.assertIn(item_should_be_found["Items"][0]["STATUS"],["IN_TRAINING","AVAILABLE"], + "Table STATUS is not valid") diff --git a/python-test-samples/serverless-testing-workshop/tests/integration/src/test_locations.py b/python-test-samples/serverless-testing-workshop/tests/integration/src/test_locations.py new file mode 100644 index 00000000..e69de29b diff --git a/python-test-samples/serverless-testing-workshop/tests/requirements.txt b/python-test-samples/serverless-testing-workshop/tests/requirements.txt new file mode 100644 index 00000000..4d661446 --- /dev/null +++ b/python-test-samples/serverless-testing-workshop/tests/requirements.txt @@ -0,0 +1,13 @@ +moto>=3.0.7 +pytest +pytest-socket +coverage +validators +boto3 +aws_lambda_powertools +fastjsonschema +pylint +bandit +aws-xray-sdk +aws_lambda_powertools +fastjsonschema \ No newline at end of file diff --git a/python-test-samples/serverless-testing-workshop/tests/unit/src/test_checkout.py b/python-test-samples/serverless-testing-workshop/tests/unit/src/test_checkout.py new file mode 100644 index 00000000..f57369e5 --- /dev/null +++ b/python-test-samples/serverless-testing-workshop/tests/unit/src/test_checkout.py @@ -0,0 +1,166 @@ +""" +# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +# SPDX-License-Identifier: MIT-0 + +# Start of unit test code for /src/Checkout/app.py +""" + +import sys +from os import environ +import json +from datetime import datetime +from unittest import TestCase +from typing import Any, Dict +from uuid import uuid4 +import yaml +import boto3 +from boto3.dynamodb.conditions import Key +import moto +from aws_xray_sdk.core import xray_recorder +xray_recorder.begin_segment("Mock Segment") + +sys.path.insert(0,'./src/Checkout') +print(sys.path) + +from schemas import OUTPUT_SCHEMA # pylint: disable=wrong-import-position + +# Import the handler under test +import app + +# Mock the DynamoDB Service during the test +@moto.mock_dynamodb + + +class TestSampleLambdaWithDynamoDB(TestCase): + + def setUp(self) -> None: + """ + Test Set up: + 1. Create the lambda environment variale DYNAMODB_TABLE_NAME + 2. Build a DynamoDB Table according to the SAM template + 3. Populate DynamoDB Data into the Table for test + """ + + # + self.LAMBDA_TASK_ROOT = "LAMBDA_TASK_ROOT" + environ["LAMBDA_TASK_ROOT_KEY"] = self.LAMBDA_TASK_ROOT + + self._X_AMZN_TRACE_ID = "_X_AMZN_TRACE_ID" + environ["LAMBDA_TRACE_HEADER_KEY"] = self._X_AMZN_TRACE_ID + + # Create a name for a test table, and set the environment + self.test_ddb_table_name = "unit_test_ddb_table_name" + environ["DYNAMODB_TABLE_NAME"] = self.test_ddb_table_name + + # Create a mock table using the definition from the SAM YAML template + # This simple technique works if there are no intrinsics (like !If or !Ref) in the + # resource properties for KeySchema, AttributeDefinitions, & BillingMode. + sam_template_table_properties = self.read_sam_template()["Resources"]["UnicornInventoryTable"]["Properties"] + + print(f"Creating mock DynamoDB Table: {self.test_ddb_table_name}") + + self.mock_dynamodb = boto3.resource("dynamodb") + self.mock_dynamodb_table = self.mock_dynamodb.create_table( + TableName = self.test_ddb_table_name, + KeySchema=[{"AttributeName": "PK", "KeyType": "HASH"}], + AttributeDefinitions=[{"AttributeName": "PK", "AttributeType": "S"}], + # KeySchema = sam_template_table_properties["KeySchema"], + # AttributeDefinitions = sam_template_table_properties["AttributeDefinitions"], + # BillingMode = sam_template_table_properties["BillingMode"] + BillingMode = "PAY_PER_REQUEST" + ) + + print(f"Created mock DynamoDB Table: {self.test_ddb_table_name}") + + # Populate doctype and customername data for the tests + self.mock_dynamodb_table.put_item(Item={"PK": "TESTUNICORN", + "LOCATION": "US", + "STATUS": "AVAILABLE", + }) + self.mock_dynamodb_table.put_item(Item={"PK": "TESTUNICORN2", + "LOCATION": "US", + "STATUS": "AVAILABLE", + }) + + def read_sam_template(self, sam_template_fn : str = "template.yaml" ) -> dict: + """ + Utility Function to read the SAM template for the current project + """ + with open(sam_template_fn, "r") as fp: + template =fp.read().replace("!","") # Ignoring intrinsic tags + return yaml.safe_load(template) + + def load_test_event(self, test_event_file_name: str) -> Dict[str, Any]: + """ + Load a sample event from a file + Add the test isolation postfix to the path parameter {id} + """ + with open(f"tests/events/{test_event_file_name}.json","r") as f: + event = json.load(f) + # event["pathParameters"]["id"] = event["pathParameters"]["id"] + self.id_postfix + return event + + def test_lambda_handler_happy_path(self): + """ + Happy path test where the id name record exists in the DynamoDB Table + + Since the environment variable DYNAMODB_TABLE_NAME is set + and DynamoDB is mocked for the entire class, this test will + implicitly use the mocked DynamoDB table we created in setUp. + """ + print("test happy path-----------") + + test_event = self.load_test_event("sampleEvent") + print(f"TEST EVENT: {test_event}") + + test_return = app.lambda_handler(event=test_event,context=None) + print(f"TEST RETURN: {test_return}") + + self.assertEqual(test_return["statusCode"] , 200) + self.assertEqual(test_return["body"] , "OK") + + # Verify the log entries + id_items = self.mock_dynamodb_table.query( + KeyConditionExpression=Key('PK').eq('TESTUNICORN') + ) + + # Check the log entry item + for item in id_items["Items"]: + self.assertEqual( item["PK"] , "TESTUNICORN") + self.assertEqual( item["STATUS"], "RESERVED") + + def test_lambda_handler_not_that_happy_path(self): + + """ + This is not the happy path + + Since the environment variable DYNAMODB_TABLE_NAME is set + and DynamoDB is mocked for the entire class, this test will + implicitly use the mocked DynamoDB table we created in setUp. + Check the test_lambda_handler_happy_path, what is the difference with this assertion? + """ + test_event = self.load_test_event("sampleEvent") + print(f"TEST EVENT: {test_event}") + + test_return = app.lambda_handler(event=test_event,context=None) + print(f"TEST RETURN: {test_return}") + + self.assertEqual(test_return["statusCode"] , 200) + self.assertEqual(test_return["body"] , "OK") + + # Verify the log entries + id_items = self.mock_dynamodb_table.query( + KeyConditionExpression=Key('PK').eq('TESTUNICORN2') + ) + # TIP! We didn't reserve this unicorn.... + # Check the log entry item + for item in id_items["Items"]: + self.assertEqual( item["PK"] , "TESTUNICORN2") + self.assertEqual( item["STATUS"], "RESERVED") + + def tearDown(self) -> None: + """ + For teardown, remove the mocked table & environment variable + """ + self.mock_dynamodb_table.delete() + del environ['DYNAMODB_TABLE_NAME'] \ No newline at end of file