#!/bin/bash # # This assumes all of the OS-level configuration has been completed and git repo has already been cloned # # This script should be run from the repo's deployment directory # cd deployment # ./run-unit-tests.sh # # This script runs all tests for the root CDK project, as well as any microservices, Lambda functions, or dependency # source code packages. These include unit tests, integration tests, and snapshot tests. # # This script is called by the ../initialize-repo.sh file and the buildspec.yml file. It is important that this script # be tested and validated to ensure that all available test fixtures are run. # # The if/then blocks are for error handling. They will cause the script to stop executing if an error is thrown from the # node process running the test case(s). Removing them or not using them for additional calls with result in the # script continuing to execute despite an error being thrown. [ "$DEBUG" == 'true' ] && set -x set -e # Get reference for all important folders template_dir="$PWD" source_dir="$(cd $template_dir/../source; pwd -P)" echo "Current directory: $template_dir" echo "Source directory: $source_dir" if [[ -e './solution_env.sh' ]]; then chmod +x ./solution_env.sh source ./solution_env.sh else echo "solution_env.sh is missing from the solution root." exit 1 fi if [[ -z "$SOLUTION_ID" ]]; then echo "SOLUTION_ID is missing from ../solution_env.sh" exit 1 else export SOLUTION_ID fi if [[ -z "$SOLUTION_NAME" ]]; then echo "SOLUTION_NAME is missing from ../solution_env.sh" exit 1 else export SOLUTION_NAME fi if [[ -z "$SOLUTION_TRADEMARKEDNAME" ]]; then echo "SOLUTION_TRADEMARKEDNAME is missing from ../solution_env.sh" exit 1 else export SOLUTION_TRADEMARKEDNAME fi setup_python_env() { if [ -d "./.venv-test" ]; then echo "Reusing already setup python venv in ./.venv-test. Delete ./.venv-test if you want a fresh one created." return fi echo "Setting up python venv" python3 -m venv .venv-test echo "Initiating virtual environment" source .venv-test/bin/activate echo "Installing python packages" pip3 install -U pip setuptools pip3 install -r requirements.txt --target . pip3 install -r requirements-dev.txt echo "deactivate virtual environment" deactivate } run_python_lambda_test() { lambda_name=$1 lambda_description=$2 echo "------------------------------------------------------------------------------" echo "[Test] Python Lambda: $lambda_name, $lambda_description" echo "------------------------------------------------------------------------------" cd $source_dir/lambda/$lambda_name [ "${CLEAN:-true}" = "true" ] && rm -fr .venv-test setup_python_env echo "Initiating virtual environment" source .venv-test/bin/activate # setup coverage report path mkdir -p $source_dir/test/coverage-reports coverage_report_path=$source_dir/test/coverage-reports/$lambda_name.coverage.xml echo "coverage report path set to $coverage_report_path" # Use -vv for debugging python3 -m pytest --cov --cov-report=term-missing --cov-report "xml:$coverage_report_path" if [ "$?" = "1" ]; then echo "(source/run-all-tests.sh) ERROR: there is likely output above." 1>&2 exit 1 fi sed -i -e "s,$source_dir,source,g" $coverage_report_path echo "deactivate virtual environment" deactivate if [ "${CLEAN:-true}" = "true" ]; then rm -fr .venv-test # Note: leaving $source_dir/test/coverage-reports to allow further processing of coverage reports rm -fr coverage rm .coverage fi } run_javascript_lambda_test() { lambda_name=$1 lambda_description=$2 echo "------------------------------------------------------------------------------" echo "[Test] Javascript Lambda: $lambda_name, $lambda_description" echo "------------------------------------------------------------------------------" cd $source_dir/lambda/$lambda_name [ "${CLEAN:-true}" = "true" ] && npm run clean npm install # npm ci npm test if [ "$?" = "1" ]; then echo "(source/run-all-tests.sh) ERROR: there is likely output above." 1>&2 exit 1 fi [ "${CLEAN:-true}" = "true" ] && rm -rf coverage/lcov-report mkdir -p $source_dir/test/coverage-reports/jest coverage_report_path=$source_dir/test/coverage-reports/jest/$lambda_name rm -rf $coverage_report_path mv coverage $coverage_report_path } run_cdk_project_test() { component_description=$1 component_name=cdk echo "------------------------------------------------------------------------------" echo "[Test] $component_description" echo "------------------------------------------------------------------------------" cd $source_dir [ "${CLEAN:-true}" = "true" ] && npm run clean # npm ci npm install npm run build npm run test -- -u if [ "$?" = "1" ]; then echo "(source/run-all-tests.sh) ERROR: there is likely output above." 1>&2 exit 1 fi [ "${CLEAN:-true}" = "true" ] && rm -rf coverage/lcov-report mkdir -p $source_dir/test/coverage-reports/jest coverage_report_path=$source_dir/test/coverage-reports/jest/$component_name rm -rf $coverage_report_path echo "coverage_report_path: $coverage_report_path" mv coverage $coverage_report_path } # Option to clean or not clean the unit test environment before and after running tests. # The environment variable CLEAN has default of 'true' and can be overwritten by caller # by setting it to 'false'. Particularly, # $ CLEAN=false ./run-all-tests.sh # CLEAN="${CLEAN:-true}" # CLEAN="${CLEAN:-false}" # echo "------------------------------------------------------------------------------" # echo "[Test] CDK Unit Tests" # echo "------------------------------------------------------------------------------" run_cdk_project_test "CDK - DevOps Monitoring Dashboard on AWS" # echo "------------------------------------------------------------------------------" # echo "[Test] Lambda Tests" # echo "------------------------------------------------------------------------------" run_python_lambda_test quicksight-custom-resources "Quicksight - Custom Resources" run_javascript_lambda_test event_parser "Lambda transformation of Source Data" run_javascript_lambda_test query_runner "Build Athena Queries" run_javascript_lambda_test multi_account_custom_resources "Multiple Account Custom Resources" run_javascript_lambda_test tag_query "Tag Query Lambda" # Return to the directory where we started cd $template_dir