diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 667388ef..037a1b6d 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -33,13 +33,11 @@ jobs: pip install -r requirements.txt pip install -r requirements-dev.txt pip install -e . + - name: Ruff Format Check + run: ruff format --check . + - name: Ruff Check + run: ruff check --output-format=github . - name: Mypy Check run: mypy ./seedfarmer - - name: Flake8 Check - run: flake8 ./seedfarmer - - name: Black Check - run: black --check ./seedfarmer - - name: Isort Check - run: isort --check ./seedfarmer - name: PyTest run: cp test/unit-test/mock_data/seedfarmer.yaml . && pytest diff --git a/docs/source/conf.py b/docs/source/conf.py index 97c8d2a5..ab06ceaf 100644 --- a/docs/source/conf.py +++ b/docs/source/conf.py @@ -33,7 +33,13 @@ # Add any Sphinx extension module names here, as strings. They can be # extensions coming with Sphinx (named 'sphinx.ext.*') or your custom # ones. -extensions = ["sphinx.ext.autosectionlabel", "sphinx.ext.napoleon", "myst_parser", "autoapi.extension","sphinx_click.ext"] +extensions = [ + "sphinx.ext.autosectionlabel", + "sphinx.ext.napoleon", + "myst_parser", + "autoapi.extension", + "sphinx_click.ext", +] # Add any paths that contain templates here, relative to this directory. templates_path = ["_templates"] diff --git a/pyproject.toml b/pyproject.toml index 6726b2ce..73faf220 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,37 +1,34 @@ -[tool.black] +[tool.ruff] +exclude = [ + ".eggs", + ".git", + ".hg", + ".mypy_cache", + ".ruff_cache", + ".tox", + ".venv", + ".env", + "_build", + "buck-out", + "build", + "dist", + "codeseeder.out", + "seedfarmer.gitmodules" +] line-length = 120 -target-version = ["py37", "py38", "py39", "py310", "py311"] -exclude = ''' -/( - \.eggs - | \.git - | \.hg - | \.mypy_cache - | \.tox - | \.venv - | \.env - | _build - | buck-out - | build - | dist - | codeseeder.out - | seedfarmer.gitmodules -)/ -''' +target-version = "py38" + +[tool.ruff.lint] +select = ["E", "W", "F", "I"] +ignore = [] +fixable = ["ALL"] -[tool.isort] -multi_line_output = 3 -include_trailing_comma = true -force_grid_wrap = 0 -use_parentheses = true -ensure_newline_before_comments = true -line_length = 120 -src_paths = ["seedfarmer"] -py_version = 37 -skip_gitignore = false +[tool.ruff.lint.per-file-ignores] +"docs/*" = ["E402"] +"test/unit-test/mock_data/*" = ["E501"] [tool.mypy] -python_version = "3.7" +python_version = "3.8" strict = true ignore_missing_imports = true disallow_untyped_decorators = false diff --git a/requirements-dev.in b/requirements-dev.in index 02b7d116..42bee387 100644 --- a/requirements-dev.in +++ b/requirements-dev.in @@ -1,9 +1,6 @@ awscli~=1.31.13 -black~=24.3.0 certifi~=2023.7.22 check-manifest~=0.48 -flake8~=5.0.4 -isort~=5.10.1 mypy~=0.961 myst-parser~=0.18.0 pip-tools~=6.14.0 @@ -13,6 +10,7 @@ pytest~=7.2.0 pytest-cov~=4.0.0 pytest-mock~=3.10.0 pytest-ordering~=0.6 +ruff~=0.4.4 twine~=4.0.1 types-PyYAML~=6.0.8 types-setuptools~=57.4.17 diff --git a/requirements-dev.txt b/requirements-dev.txt index 4f2639e0..324f777d 100644 --- a/requirements-dev.txt +++ b/requirements-dev.txt @@ -1,8 +1,8 @@ # -# This file is autogenerated by pip-compile with Python 3.9 +# This file is autogenerated by pip-compile with Python 3.11 # by the following command: # -# pip-compile requirements-dev.in +# pip-compile --output-file=requirements-dev.txt requirements-dev.in # alabaster==0.7.13 # via sphinx @@ -14,8 +14,6 @@ awscli==1.31.13 # via -r requirements-dev.in babel==2.14.0 # via sphinx -black==24.3.0 - # via -r requirements-dev.in bleach==6.0.0 # via readme-renderer boto3==1.33.13 @@ -42,17 +40,13 @@ charset-normalizer==3.3.2 check-manifest==0.49 # via -r requirements-dev.in click==8.1.7 - # via - # black - # pip-tools + # via pip-tools colorama==0.4.4 # via awscli coverage[toml]==7.2.7 # via pytest-cov cryptography==42.0.4 - # via - # moto - # secretstorage + # via moto docutils==0.16 # via # awscli @@ -61,28 +55,16 @@ docutils==0.16 # readme-renderer # sphinx # sphinx-rtd-theme -exceptiongroup==1.2.0 - # via pytest -flake8==5.0.4 - # via -r requirements-dev.in idna==3.6 # via requests imagesize==1.4.1 # via sphinx importlib-metadata==4.2.0 - # via - # keyring - # twine + # via twine iniconfig==2.0.0 # via pytest -isort==5.10.1 - # via -r requirements-dev.in jaraco-classes==3.2.3 # via keyring -jeepney==0.8.0 - # via - # keyring - # secretstorage jinja2==3.1.3 # via # moto @@ -107,8 +89,6 @@ markupsafe==2.1.5 # jinja2 # moto # werkzeug -mccabe==0.7.0 - # via flake8 mdit-py-plugins==0.3.5 # via myst-parser mdurl==0.1.2 @@ -120,38 +100,27 @@ moto[codebuild,iam,s3,secretsmanager,ssm,sts]==4.0.13 mypy==0.991 # via -r requirements-dev.in mypy-extensions==1.0.0 - # via - # black - # mypy + # via mypy myst-parser==0.18.1 # via -r requirements-dev.in packaging==23.2 # via - # black # build # pyroma # pytest # sphinx -pathspec==0.11.2 - # via black pip-tools==6.14.0 # via -r requirements-dev.in pkginfo==1.9.6 # via twine -platformdirs==4.0.0 - # via black pluggy==1.2.0 # via pytest pyasn1==0.5.1 # via rsa -pycodestyle==2.9.1 - # via flake8 pycparser==2.21 # via cffi pydot==1.4.2 # via -r requirements-dev.in -pyflakes==2.5.0 - # via flake8 pygments==2.17.2 # via # pyroma @@ -208,12 +177,12 @@ rich==13.7.0 # via twine rsa==4.7.2 # via awscli +ruff==0.4.4 + # via -r requirements-dev.in s3transfer==0.8.2 # via # awscli # boto3 -secretstorage==3.3.3 - # via keyring six==1.16.0 # via # bleach @@ -242,16 +211,6 @@ sphinxcontrib-qthelp==1.0.3 # via sphinx sphinxcontrib-serializinghtml==1.1.5 # via sphinx -tomli==2.0.1 - # via - # black - # build - # check-manifest - # coverage - # mypy - # pip-tools - # pyproject-hooks - # pytest trove-classifiers==2024.2.22 # via pyroma twine==4.0.2 @@ -264,8 +223,6 @@ types-setuptools==57.4.18 # via -r requirements-dev.in typing-extensions==4.7.1 # via - # astroid - # black # mypy # myst-parser unidecode==1.3.8 diff --git a/seedfarmer/commands/_deployment_commands.py b/seedfarmer/commands/_deployment_commands.py index d2adca65..24cc2767 100644 --- a/seedfarmer/commands/_deployment_commands.py +++ b/seedfarmer/commands/_deployment_commands.py @@ -248,7 +248,8 @@ def _exec_deploy(mdo: ModuleDeployObject) -> ModuleDeploymentResponse: if dep_resp_object.status in ["ERROR", "error", "Error"]: _logger.error("At least one module failed to deploy...exiting deployment") print_errored_modules_build_info( - "These modules had errors deploying", deploy_response # type: ignore + "These modules had errors deploying", + deploy_response, # type: ignore ) raise seedfarmer.errors.ModuleDeploymentError( error_message="At least one module failed to deploy...exiting deployment" diff --git a/seedfarmer/models/manifests/_module_manifest.py b/seedfarmer/models/manifests/_module_manifest.py index 8804fe8b..452b12b1 100644 --- a/seedfarmer/models/manifests/_module_manifest.py +++ b/seedfarmer/models/manifests/_module_manifest.py @@ -103,7 +103,6 @@ class ModuleManifest(CamelModel): _local_path: Optional[str] = PrivateAttr(default=None) def __init__(self, **kwargs: Any) -> None: - from seedfarmer.utils import batch_replace_env kwargs = batch_replace_env(payload=kwargs) diff --git a/seedfarmer/output_utils.py b/seedfarmer/output_utils.py index aa47b112..02680d2a 100644 --- a/seedfarmer/output_utils.py +++ b/seedfarmer/output_utils.py @@ -156,7 +156,8 @@ def print_modules_build_info( console.print(f"[bold {color}]{description}", crop=False) for r_obj in modules_data: console.print( - f" [cyan]{r_obj.deployment}-{r_obj.group}-{r_obj.module} status: {r_obj.status}", crop=False # type: ignore + f" [cyan]{r_obj.deployment}-{r_obj.group}-{r_obj.module} status: {r_obj.status}", # type: ignore + crop=False, ) ( console.print(f" {r_obj.codeseeder_metadata.build_url}", crop=False) # type: ignore diff --git a/test/unit-test/_test_cli_helper_functions.py b/test/unit-test/_test_cli_helper_functions.py index e7c3a0a0..a9bc48d2 100644 --- a/test/unit-test/_test_cli_helper_functions.py +++ b/test/unit-test/_test_cli_helper_functions.py @@ -23,7 +23,7 @@ def _test_command( exit_code: int, expected_output: Optional[str] = None, return_result: Optional[bool] = False, - skip_eval:Optional[bool] = False, + skip_eval: Optional[bool] = False, ): runner = CliRunner() command_output = runner.invoke(sub_command, options) diff --git a/test/unit-test/mock_data/mock_build_info.py b/test/unit-test/mock_data/mock_build_info.py index 5d3d747e..3410cf2b 100644 --- a/test/unit-test/mock_data/mock_build_info.py +++ b/test/unit-test/mock_data/mock_build_info.py @@ -15,14 +15,14 @@ "phaseStatus": "SUCCEEDED", "startTime": "2024-03-13T20:24:02.191000-04:00", "endTime": "2024-03-13T20:24:02.360000-04:00", - "durationInSeconds": 0 + "durationInSeconds": 0, }, { "phaseType": "QUEUED", "phaseStatus": "SUCCEEDED", "startTime": "2024-03-13T20:24:02.360000-04:00", "endTime": "2024-03-13T20:24:03.331000-04:00", - "durationInSeconds": 0 + "durationInSeconds": 0, }, { "phaseType": "PROVISIONING", @@ -30,12 +30,7 @@ "startTime": "2024-03-13T20:24:03.331000-04:00", "endTime": "2024-03-13T20:24:11.188000-04:00", "durationInSeconds": 7, - "contexts": [ - { - "statusCode": "", - "message": "" - } - ] + "contexts": [{"statusCode": "", "message": ""}], }, { "phaseType": "DOWNLOAD_SOURCE", @@ -43,12 +38,7 @@ "startTime": "2024-03-13T20:24:11.188000-04:00", "endTime": "2024-03-13T20:24:17.501000-04:00", "durationInSeconds": 6, - "contexts": [ - { - "statusCode": "", - "message": "" - } - ] + "contexts": [{"statusCode": "", "message": ""}], }, { "phaseType": "INSTALL", @@ -56,12 +46,7 @@ "startTime": "2024-03-13T20:24:17.501000-04:00", "endTime": "2024-03-13T20:26:16.074000-04:00", "durationInSeconds": 118, - "contexts": [ - { - "statusCode": "", - "message": "" - } - ] + "contexts": [{"statusCode": "", "message": ""}], }, { "phaseType": "PRE_BUILD", @@ -69,12 +54,7 @@ "startTime": "2024-03-13T20:26:16.074000-04:00", "endTime": "2024-03-13T20:26:16.246000-04:00", "durationInSeconds": 0, - "contexts": [ - { - "statusCode": "", - "message": "" - } - ] + "contexts": [{"statusCode": "", "message": ""}], }, { "phaseType": "BUILD", @@ -82,12 +62,7 @@ "startTime": "2024-03-13T20:26:16.246000-04:00", "endTime": "2024-03-13T20:26:31.774000-04:00", "durationInSeconds": 15, - "contexts": [ - { - "statusCode": "", - "message": "" - } - ] + "contexts": [{"statusCode": "", "message": ""}], }, { "phaseType": "POST_BUILD", @@ -95,12 +70,7 @@ "startTime": "2024-03-13T20:26:31.774000-04:00", "endTime": "2024-03-13T20:26:32.877000-04:00", "durationInSeconds": 1, - "contexts": [ - { - "statusCode": "", - "message": "" - } - ] + "contexts": [{"statusCode": "", "message": ""}], }, { "phaseType": "UPLOAD_ARTIFACTS", @@ -108,12 +78,7 @@ "startTime": "2024-03-13T20:26:32.877000-04:00", "endTime": "2024-03-13T20:26:32.931000-04:00", "durationInSeconds": 0, - "contexts": [ - { - "statusCode": "", - "message": "" - } - ] + "contexts": [{"statusCode": "", "message": ""}], }, { "phaseType": "FINALIZING", @@ -121,17 +86,9 @@ "startTime": "2024-03-13T20:26:32.931000-04:00", "endTime": "2024-03-13T20:26:33.189000-04:00", "durationInSeconds": 0, - "contexts": [ - { - "statusCode": "", - "message": "" - } - ] + "contexts": [{"statusCode": "", "message": ""}], }, - { - "phaseType": "COMPLETED", - "startTime": "2024-03-13T20:26:33.189000-04:00" - } + {"phaseType": "COMPLETED", "startTime": "2024-03-13T20:26:33.189000-04:00"}, ], # "source": { # "type": "S3", @@ -141,90 +98,34 @@ # }, "secondarySources": [], "secondarySourceVersions": [], - "artifacts": { - "location": "" - }, - "cache": { - "type": "NO_CACHE" - }, + "artifacts": {"location": ""}, + "cache": {"type": "NO_CACHE"}, "environment": { "type": "LINUX_CONTAINER", "image": "aws/codebuild/standard:6.0", "computeType": "BUILD_GENERAL1_SMALL", "environmentVariables": [ - { - "name": "AWS_CODESEEDER_DOCKER_SECRET", - "value": "NONE", - "type": "PLAINTEXT" - }, - { - "name": "SEEDFARMER_PARAMETER_REPOSITORY_NAME", - "value": "ml-mnist-images", - "type": "PLAINTEXT" - }, - { - "name": "AWS_CODESEEDER_NAME", - "value": "idf", - "type": "PLAINTEXT" - }, - { - "name": "SEEDFARMER_MODULE_NAME", - "value": "ecr-ecr-ml-images", - "type": "PLAINTEXT" - }, - { - "name": "SEEDFARMER_VERSION", - "value": "3.3.0.dev0", - "type": "PLAINTEXT" - }, + {"name": "AWS_CODESEEDER_DOCKER_SECRET", "value": "NONE", "type": "PLAINTEXT"}, + {"name": "SEEDFARMER_PARAMETER_REPOSITORY_NAME", "value": "ml-mnist-images", "type": "PLAINTEXT"}, + {"name": "AWS_CODESEEDER_NAME", "value": "idf", "type": "PLAINTEXT"}, + {"name": "SEEDFARMER_MODULE_NAME", "value": "ecr-ecr-ml-images", "type": "PLAINTEXT"}, + {"name": "SEEDFARMER_VERSION", "value": "3.3.0.dev0", "type": "PLAINTEXT"}, { "name": "SEEDFARMER_MODULE_METADATA", - "value": "{\"AwsCodeSeederDeployed\": \"0.11.1\", \"EcrRepositoryArn\": \"arn:aws:ecr:us-east-1:123456789012:repository/ml-mnist-images\", \"EcrRepositoryName\": \"ml-mnist-images\", \"LifecycleMaxImages\": \"10\", \"SeedFarmerDeployed\": \"3.3.0.dev0\"}", - "type": "PLAINTEXT" - }, - { - "name": "SEEDFARMER_DEPLOYMENT_NAME", - "value": "dummy", - "type": "PLAINTEXT" - }, - { - "name": "AWS_PARTITION", - "value": "aws", - "type": "PLAINTEXT" - }, - { - "name": "AWS_CODESEEDER_VERSION", - "value": "0.11.1", - "type": "PLAINTEXT" - }, - { - "name": "AWS_ACCOUNT_ID", - "value": "123456789012", - "type": "PLAINTEXT" - }, - { - "name": "SEEDFARMER_PROJECT_NAME", - "value": "idf", - "type": "PLAINTEXT" - }, - { - "name": "SEEDFARMER_HASH", - "value": "074ff5b4", - "type": "PLAINTEXT" - }, - { - "name": "SEEDFARMER_PARAMETER_LIFECYCLE_MAX_IMAGE_COUNT", - "value": "10", - "type": "PLAINTEXT" + "value": '{"AwsCodeSeederDeployed": "0.11.1", "EcrRepositoryArn": "arn:aws:ecr:us-east-1:123456789012:repository/ml-mnist-images", "EcrRepositoryName": "ml-mnist-images", "LifecycleMaxImages": "10", "SeedFarmerDeployed": "3.3.0.dev0"}', + "type": "PLAINTEXT", }, - { - "name": "SEEDFARMER_PARAMETER_IMAGE_TAG_MUTABILITY", - "value": "MUTABLE", - "type": "PLAINTEXT" - } + {"name": "SEEDFARMER_DEPLOYMENT_NAME", "value": "dummy", "type": "PLAINTEXT"}, + {"name": "AWS_PARTITION", "value": "aws", "type": "PLAINTEXT"}, + {"name": "AWS_CODESEEDER_VERSION", "value": "0.11.1", "type": "PLAINTEXT"}, + {"name": "AWS_ACCOUNT_ID", "value": "123456789012", "type": "PLAINTEXT"}, + {"name": "SEEDFARMER_PROJECT_NAME", "value": "idf", "type": "PLAINTEXT"}, + {"name": "SEEDFARMER_HASH", "value": "074ff5b4", "type": "PLAINTEXT"}, + {"name": "SEEDFARMER_PARAMETER_LIFECYCLE_MAX_IMAGE_COUNT", "value": "10", "type": "PLAINTEXT"}, + {"name": "SEEDFARMER_PARAMETER_IMAGE_TAG_MUTABILITY", "value": "MUTABLE", "type": "PLAINTEXT"}, ], "privilegedMode": "true", - "imagePullCredentialsType": "CODEBUILD" + "imagePullCredentialsType": "CODEBUILD", }, "serviceRole": "arn:aws:iam::123456789012:role/idf-dummy-ecr-ecr-ml-images-074ff5b4", "logs": { @@ -235,12 +136,9 @@ "cloudWatchLogs": { "status": "ENABLED", "groupName": "/aws/codebuild/codeseeder-idf", - "streamName": "codeseeder-bzchpmli" + "streamName": "codeseeder-bzchpmli", }, - "s3Logs": { - "status": "DISABLED", - "encryptionDisabled": "false" - } + "s3Logs": {"status": "DISABLED", "encryptionDisabled": "false"}, }, "timeoutInMinutes": 120, "queuedTimeoutInMinutes": 480, @@ -249,13 +147,13 @@ "exportedEnvironmentVariables": [ { "name": "AWS_CODESEEDER_OUTPUT", - "value": "\"{\\\"aws_region\\\": \\\"us-east-1\\\", \\\"aws_account_id\\\": \\\"123456789012\\\", \\\"aws_partition\\\": \\\"aws\\\", \\\"codebuild_build_id\\\": \\\"codeseeder-idf:7f53415b-f47d-4e5e-860f-93d7f440aa30\\\", \\\"codebuild_log_path\\\": \\\"codeseeder-bzchpmli/7f53415b-f47d-4e5e-860f-93d7f440aa30\\\"}\"" + "value": '"{\\"aws_region\\": \\"us-east-1\\", \\"aws_account_id\\": \\"123456789012\\", \\"aws_partition\\": \\"aws\\", \\"codebuild_build_id\\": \\"codeseeder-idf:7f53415b-f47d-4e5e-860f-93d7f440aa30\\", \\"codebuild_log_path\\": \\"codeseeder-bzchpmli/7f53415b-f47d-4e5e-860f-93d7f440aa30\\"}"', }, { "name": "SEEDFARMER_MODULE_METADATA", - "value": "{\"AwsCodeSeederDeployed\": \"0.11.1\", \"EcrRepositoryArn\": \"arn:aws:ecr:us-east-1:123456789012:repository/ml-mnist-images\", \"EcrRepositoryName\": \"ml-mnist-images\", \"LifecycleMaxImages\": \"10\", \"SeedFarmerDeployed\": \"3.3.0.dev0\"}" - } - ] + "value": '{"AwsCodeSeederDeployed": "0.11.1", "EcrRepositoryArn": "arn:aws:ecr:us-east-1:123456789012:repository/ml-mnist-images", "EcrRepositoryName": "ml-mnist-images", "LifecycleMaxImages": "10", "SeedFarmerDeployed": "3.3.0.dev0"}', + }, + ], } ], "buildsNotFound": [], @@ -266,8 +164,8 @@ "x-amzn-requestid": "11701f62-9639-4fe3-82d9-dcbc38ac41af", "content-type": "application/x-amz-json-1.1", "content-length": "7670", - "date": "Fri, 29 Mar 2024 14:38:06 GMT" + "date": "Fri, 29 Mar 2024 14:38:06 GMT", }, - "RetryAttempts": 0 - } + "RetryAttempts": 0, + }, } diff --git a/test/unit-test/mock_data/mock_deployment_manifest_huge.py b/test/unit-test/mock_data/mock_deployment_manifest_huge.py index c4d123c9..5e92a5a3 100644 --- a/test/unit-test/mock_data/mock_deployment_manifest_huge.py +++ b/test/unit-test/mock_data/mock_deployment_manifest_huge.py @@ -295,4 +295,3 @@ } ], } - diff --git a/test/unit-test/mock_data/mock_deployspec.py b/test/unit-test/mock_data/mock_deployspec.py index 72dfaf8c..2d84ce49 100644 --- a/test/unit-test/mock_data/mock_deployspec.py +++ b/test/unit-test/mock_data/mock_deployspec.py @@ -20,6 +20,6 @@ - pip install -r requirements.txt build: commands: - - echo 'Look Ma....destroying' + - echo 'Look Ma....destroying' """ ) diff --git a/test/unit-test/test_checksum.py b/test/unit-test/test_checksum.py index c5a1e470..fd3fe0e4 100644 --- a/test/unit-test/test_checksum.py +++ b/test/unit-test/test_checksum.py @@ -37,7 +37,7 @@ def test_private_methods_checksum(): import seedfarmer.checksum as checksum file_tst = os.path.abspath(__file__) - assert False == checksum._evaluate_file(filename=file_tst, ignore_maps=None) + assert checksum._evaluate_file(filename=file_tst, ignore_maps=None) is False _check_non = checksum._generate_file_hash(filepath=f"{file_tst}_bak") assert _check_non == "d41d8cd98f00b204e9800998ecf8427e" diff --git a/test/unit-test/test_cli_arg.py b/test/unit-test/test_cli_arg.py index 70d01262..b49c5033 100644 --- a/test/unit-test/test_cli_arg.py +++ b/test/unit-test/test_cli_arg.py @@ -21,11 +21,10 @@ from moto import mock_sts from seedfarmer import config -from seedfarmer.__main__ import apply, bootstrap, destroy, init +from seedfarmer.__main__ import apply, bootstrap, destroy, init, metadata, projectpolicy, remove, store, version from seedfarmer.__main__ import list as list -from seedfarmer.__main__ import metadata, projectpolicy, remove, store, version from seedfarmer.models._deploy_spec import DeploySpec -from seedfarmer.models.manifests import DeploymentManifest, ModulesManifest +from seedfarmer.models.manifests import DeploymentManifest from seedfarmer.services._service_utils import boto3_client from seedfarmer.services.session_manager import SessionManager @@ -115,7 +114,6 @@ def session_manager(sts_client): @pytest.mark.init def test_init_create_group_module(mocker): - module_name = "test-module" group_name = "group" @@ -127,7 +125,6 @@ def test_init_create_group_module(mocker): @pytest.mark.init def test_init_create_project(mocker): - mocker.patch("seedfarmer.cli_groups._init_group.minit.create_project", return_value=None) _test_command(sub_command=init, options=["project"], exit_code=0) @@ -184,7 +181,7 @@ def test_apply_deployment(mocker): # Deploys a functioning module mocker.patch("seedfarmer.__main__.commands.apply", return_value=None) deployment_manifest = f"{_TEST_ROOT}/manifests/module-test/deployment.yaml" - command_output = _test_command(sub_command=apply, options=[deployment_manifest, "--debug"], exit_code=0) + _test_command(sub_command=apply, options=[deployment_manifest, "--debug"], exit_code=0) @pytest.mark.first @@ -227,7 +224,11 @@ def test_apply_deployment__env_variables_multiple_env_files(mocker, reverse_orde if reverse_order: env_files = env_files[::-1] - _test_command(sub_command=apply, options=[deployment_manifest, "--debug", "--env-file", env_files[0], "--env-file", env_files[1]], exit_code=0) + _test_command( + sub_command=apply, + options=[deployment_manifest, "--debug", "--env-file", env_files[0], "--env-file", env_files[1]], + exit_code=0, + ) assert os.environ == { "PRIMARY_ACCOUNT": "123456789012" if reverse_order else "000000000000", @@ -240,14 +241,14 @@ def test_apply_deployment__env_variables_multiple_env_files(mocker, reverse_orde def test_destroy_deployment_dry_run(mocker): # Destroy a functioning module mocker.patch("seedfarmer.__main__.commands.destroy", return_value=None) - command_output = _test_command(sub_command=destroy, options=["myapp", "--debug", "--dry-run"], exit_code=0) + _test_command(sub_command=destroy, options=["myapp", "--debug", "--dry-run"], exit_code=0) @pytest.mark.destroy def test_destroy_deployment(mocker): # Destroy a functioning module mocker.patch("seedfarmer.__main__.commands.destroy", return_value=None) - command_output = _test_command(sub_command=destroy, options=["myapp", "--debug"], exit_code=0) + _test_command(sub_command=destroy, options=["myapp", "--debug"], exit_code=0) @pytest.mark.destroy @@ -283,7 +284,11 @@ def test_destroy__deployment_env_variables_multiple_env_files(mocker, reverse_or if reverse_order: env_files = env_files[::-1] - _test_command(sub_command=destroy, options=["myapp", "--debug", "--env-file", env_files[0], "--env-file", env_files[1]], exit_code=0) + _test_command( + sub_command=destroy, + options=["myapp", "--debug", "--env-file", env_files[0], "--env-file", env_files[1]], + exit_code=0, + ) assert os.environ == { "PRIMARY_ACCOUNT": "123456789012" if reverse_order else "000000000000", @@ -301,7 +306,8 @@ def test_bootstrap_toolchain_only(mocker): _test_command( sub_command=bootstrap, options=["toolchain", "--trusted-principal", "arn:aws:iam::123456789012:role/AdminRole", "--debug"], - exit_code=0, skip_eval=True + exit_code=0, + skip_eval=True, ) @@ -322,7 +328,7 @@ def test_bootstrap_toolchain_only_with_qualifier(mocker): "--debug", ], exit_code=0, - skip_eval=True + skip_eval=True, ) @@ -343,7 +349,7 @@ def test_bootstrap_toolchain_only_with_policies_fail(mocker): "--debug", ], exit_code=1, - skip_eval=True + skip_eval=True, ) @@ -354,7 +360,10 @@ def test_bootstrap_target_account(mocker): mocker.patch("seedfarmer.commands._bootstrap_commands.bootstrap_toolchain_account", return_value=None) mocker.patch("seedfarmer.commands._bootstrap_commands.apply_deploy_logic", return_value=None) _test_command( - sub_command=bootstrap, options=["target", "--toolchain-account", "123456789012", "--debug"], exit_code=0, skip_eval=True + sub_command=bootstrap, + options=["target", "--toolchain-account", "123456789012", "--debug"], + exit_code=0, + skip_eval=True, ) @@ -367,7 +376,8 @@ def test_bootstrap_target_account_with_qualifier(mocker): _test_command( sub_command=bootstrap, options=["target", "--toolchain-account", "123456789012", "--qualifier", "testit", "--debug"], - exit_code=0, skip_eval=True + exit_code=0, + skip_eval=True, ) @@ -589,7 +599,6 @@ def test_list_deployments_help(): @pytest.mark.list @pytest.mark.list_deployments def test_list_deployments_extra_args(): - _test_command( sub_command=list, options=[ @@ -1214,7 +1223,6 @@ def test_store_md5_missing_type_arg(): @pytest.mark.store @pytest.mark.store_md5 def test_store_md5_deployspec(): - # Store hash to SSM of type spec _test_command( sub_command=store, @@ -1404,7 +1412,6 @@ def test_store_deployspec_missing_path(): @pytest.mark.store @pytest.mark.store_deployspec def test_store_deployspec_missing_acct(): - path = "module/test/test" _test_command( sub_command=store, options=[ @@ -1430,7 +1437,6 @@ def test_store_deployspec_missing_acct(): @pytest.mark.store_deployspec @pytest.mark.parametrize("session", [None]) def test_store_deployspec(session_manager, session): - _test_command( sub_command=store, options=[ @@ -1457,13 +1463,11 @@ def test_store_deployspec(session_manager, session): @pytest.mark.projectpolicy def test_get_projectpolicy(): - _test_command(sub_command=projectpolicy, options=["synth"], exit_code=0) @pytest.mark.projectpolicy def test_get_projectpolicy_debug(): - _test_command(sub_command=projectpolicy, options=["synth", "--debug"], exit_code=0) diff --git a/test/unit-test/test_commands_bootstrap.py b/test/unit-test/test_commands_bootstrap.py index 48dde622..af3b5ea8 100644 --- a/test/unit-test/test_commands_bootstrap.py +++ b/test/unit-test/test_commands_bootstrap.py @@ -1,15 +1,12 @@ -import logging import os import boto3 import pytest -import yaml from moto import mock_sts import seedfarmer import seedfarmer.commands._bootstrap_commands as bc import seedfarmer.errors -from seedfarmer.models.manifests import DeploymentManifest, ModuleManifest, ModulesManifest from seedfarmer.services._service_utils import boto3_client from seedfarmer.services.session_manager import SessionManager @@ -125,7 +122,6 @@ def test_apply_deploy_logic_stack_not_exists(session_manager, mocker): @pytest.mark.commands_bootstrap @pytest.mark.parametrize("session", [boto3.Session()]) def test_bootstrap_toolchain_account(mocker, session): - mocker.patch("seedfarmer.commands._bootstrap_commands.apply_deploy_logic", return_value="") mocker.patch("seedfarmer.commands._bootstrap_commands.bootstrap_target_account", return_value="") mocker.patch( @@ -146,7 +142,6 @@ def test_bootstrap_toolchain_account(mocker, session): @pytest.mark.commands_bootstrap @pytest.mark.parametrize("session", [boto3.Session()]) def test_bootstrap_toolchain_account_synth(mocker, session): - mocker.patch("seedfarmer.commands._bootstrap_commands.apply_deploy_logic", return_value="") bc.bootstrap_toolchain_account( project_name="testing", @@ -162,7 +157,6 @@ def test_bootstrap_toolchain_account_synth(mocker, session): @pytest.mark.commands_bootstrap @pytest.mark.parametrize("session", [boto3.Session()]) def test_bootstrap_toolchain_account_synth_with_qualifier(mocker, session): - mocker.patch("seedfarmer.commands._bootstrap_commands.apply_deploy_logic", return_value="") bc.bootstrap_toolchain_account( project_name="testing", @@ -197,7 +191,6 @@ def test_bootstrap_toolchain_account_synth_with_qualifier_fail(mocker, session): @pytest.mark.commands_bootstrap @pytest.mark.parametrize("session", [boto3.Session()]) def test_bootstrap_toolchain_account_with_policies(mocker, session): - mocker.patch("seedfarmer.commands._bootstrap_commands.apply_deploy_logic", return_value="") mocker.patch("seedfarmer.commands._bootstrap_commands.bootstrap_target_account", return_value="") mocker.patch( diff --git a/test/unit-test/test_commands_deployment.py b/test/unit-test/test_commands_deployment.py index 5c29db1c..682e15e6 100644 --- a/test/unit-test/test_commands_deployment.py +++ b/test/unit-test/test_commands_deployment.py @@ -1,16 +1,12 @@ import json -import logging import os -from typing import Tuple, cast -import boto3 import mock_data.mock_deployment_manifest_for_destroy as mock_deployment_manifest_for_destroy import mock_data.mock_deployment_manifest_huge as mock_deployment_manifest_huge import mock_data.mock_deployspec as mock_deployspec import mock_data.mock_manifests as mock_manifests import mock_data.mock_module_info_huge as mock_module_info_huge import pytest -import yaml from moto import mock_sts import seedfarmer.commands._deployment_commands as dc @@ -19,8 +15,6 @@ from seedfarmer.models.manifests import ( DataFile, DeploymentManifest, - ModuleManifest, - ModuleParameter, ) from seedfarmer.models.transfer import ModuleDeployObject from seedfarmer.services._service_utils import boto3_client @@ -58,7 +52,6 @@ def session_manager(sts_client): @pytest.mark.commands @pytest.mark.commands_deployment def test_apply_clean(session_manager, mocker): - mocker.patch("seedfarmer.commands._deployment_commands.write_deployment_manifest", return_value=None) mocker.patch("seedfarmer.commands._deployment_commands.prime_target_accounts", return_value=None) mocker.patch("seedfarmer.commands._deployment_commands.du.populate_module_info_index", return_value=None) @@ -73,7 +66,6 @@ def test_apply_clean(session_manager, mocker): @pytest.mark.commands @pytest.mark.commands_deployment def test_apply_violations(session_manager, mocker): - mocker.patch("seedfarmer.commands._deployment_commands.write_deployment_manifest", return_value=None) mocker.patch("seedfarmer.commands._deployment_commands.prime_target_accounts", return_value=None) mocker.patch("seedfarmer.commands._deployment_commands.du.populate_module_info_index", return_value=None) @@ -90,7 +82,6 @@ def test_apply_violations(session_manager, mocker): @pytest.mark.commands @pytest.mark.commands_deployment def test_destroy_clean(session_manager, mocker): - mocker.patch( "seedfarmer.commands._deployment_commands.du.generate_deployed_manifest", return_value=DeploymentManifest(**mock_deployment_manifest_for_destroy.destroy_manifest), @@ -103,7 +94,6 @@ def test_destroy_clean(session_manager, mocker): @pytest.mark.commands @pytest.mark.commands_deployment def test_destroy_not_found(session_manager, mocker): - mocker.patch( "seedfarmer.commands._deployment_commands.du.generate_deployed_manifest", return_value=DeploymentManifest(**mock_deployment_manifest_for_destroy.destroy_manifest), @@ -120,13 +110,13 @@ def test_destroy_not_found(session_manager, mocker): # @pytest.mark.commands # @pytest.mark.commands_deployment # def test_tear_down_target_accounts(session_manager,mocker): -# mocker.patch("seedfarmer.commands._deployment_commands.tear_down_target_accounts._teardown_accounts", return_value=None) +# mocker.patch("seedfarmer.commands._deployment_commands.tear_down_target_accounts._teardown_accounts", return_value=None) # noqa: E501 # # mocker.patch("seedfarmer.commands._deployment_commands.tear_down_target_accounts._teardown_accounts", # # return_value=None) # # with mocker.patch('seedfarmer.commands._deployment_commands.tear_down_target_accounts') as teardown: # # teardown. ### COMMENT....I cannot get the nested threads to mock -# dc.tear_down_target_accounts(deployment_manifest=DeploymentManifest(**mock_deployment_manifest_for_destroy.destroy_manifest)) +# dc.tear_down_target_accounts(deployment_manifest=DeploymentManifest(**mock_deployment_manifest_for_destroy.destroy_manifest)) # noqa: E501 @pytest.mark.commands @@ -215,9 +205,7 @@ def test_execute_destroy_invalid_spec(session_manager, mocker): return_value=("stack_name", "role_name"), ) mocker.patch("seedfarmer.commands._deployment_commands.commands.destroy_module", return_value=mod_resp) - mdo = ModuleDeployObject( - deployment_manifest=dep, group_name=dep.groups[0].name, module_name=module_manifest.name - ) + mdo = ModuleDeployObject(deployment_manifest=dep, group_name=dep.groups[0].name, module_name=module_manifest.name) with pytest.raises(seedfarmer.errors.InvalidManifestError): dc._execute_destroy(mdo) diff --git a/test/unit-test/test_commands_module.py b/test/unit-test/test_commands_module.py index 40cdee4b..fc399a2a 100644 --- a/test/unit-test/test_commands_module.py +++ b/test/unit-test/test_commands_module.py @@ -1,9 +1,6 @@ import json -import logging import os -from typing import Tuple, cast -import boto3 import pytest import yaml from moto import mock_sts @@ -11,7 +8,7 @@ import seedfarmer.commands._module_commands as mc import seedfarmer.errors from seedfarmer.models._deploy_spec import DeploySpec -from seedfarmer.models.manifests import DeploymentManifest, ModuleManifest, ModuleParameter +from seedfarmer.models.manifests import DeploymentManifest, ModuleParameter from seedfarmer.models.transfer import ModuleDeployObject from seedfarmer.services._service_utils import boto3_client from seedfarmer.services.session_manager import SessionManager @@ -134,7 +131,7 @@ def session_manager(sts_client): - pip install -r requirements.txt build: commands: - - echo 'Look Ma....destroying' + - echo 'Look Ma....destroying' """ ) @@ -161,7 +158,6 @@ def test_generate_export_raw_env_params(): @pytest.mark.commands @pytest.mark.commands_modules def test_deploy_modules(session_manager, mocker): - mocker.patch( "seedfarmer.commands._module_commands._execute_module_commands", return_value=(json.dumps(resp_dict_str), resp_dict_str), @@ -173,7 +169,7 @@ def test_deploy_modules(session_manager, mocker): module_manifest.deploy_spec = DeploySpec(**dummy_deployspec) mdo = ModuleDeployObject(deployment_manifest=dep, group_name=group_name, module_name=module_manifest.name) - + mdo.codebuild_image = "aws/codebuild/standard:7.0" mdo.parameters = [ ModuleParameter( @@ -193,7 +189,6 @@ def test_deploy_modules(session_manager, mocker): @pytest.mark.commands @pytest.mark.commands_modules def test_deploy_modules_error_deployspec(session_manager, mocker): - mocker.patch( "seedfarmer.commands._module_commands._execute_module_commands", return_value=(json.dumps(resp_dict_str), resp_dict_str), @@ -230,7 +225,6 @@ def test_deploy_modules_error_deployspec(session_manager, mocker): @pytest.mark.commands @pytest.mark.commands_modules def test_destroy_modules(session_manager, mocker): - mocker.patch( "seedfarmer.commands._module_commands._execute_module_commands", return_value=(json.dumps(resp_dict_str), resp_dict_str), @@ -262,7 +256,6 @@ def test_destroy_modules(session_manager, mocker): @pytest.mark.commands @pytest.mark.commands_modules def test_destroy_modules_error_deployspec(session_manager, mocker): - mocker.patch( "seedfarmer.commands._module_commands._execute_module_commands", return_value=(json.dumps(resp_dict_str), resp_dict_str), diff --git a/test/unit-test/test_commands_network_parameters.py b/test/unit-test/test_commands_network_parameters.py index 3a760d4e..868d6c5d 100644 --- a/test/unit-test/test_commands_network_parameters.py +++ b/test/unit-test/test_commands_network_parameters.py @@ -1,10 +1,7 @@ -import json import os from typing import Any, Dict, cast -import boto3 import pytest -import yaml from moto import mock_sts import seedfarmer.commands._network_parameter_commands as npc @@ -120,7 +117,7 @@ def test_no_values(session_manager, mocker): target_account_region = dep.target_accounts_regions[0] - networkOut = npc.load_network_values( + npc.load_network_values( cast(NetworkMapping, target_account_region["network"]), cast(Dict[str, Any], target_account_region["parameters_regional"]), target_account_region["account_id"], @@ -333,9 +330,9 @@ def test_sgs_subnets_from_regional_parameter(session_manager, mocker): @pytest.mark.commands @pytest.mark.commands_parameters def test_too_many_subgroups(session_manager, mocker): - os.environ[ - "testsgs" - ] = '["sg-049033188c114a3d2","sg-049033188c114a3d2","sg-049033188c114a3d2","sg-049033188c114a3d2","sg-049033188c114a3d2","sg-049033188c114a3d2"]' + os.environ["testsgs"] = ( + '["sg-049033188c114a3d2","sg-049033188c114a3d2","sg-049033188c114a3d2","sg-049033188c114a3d2","sg-049033188c114a3d2","sg-049033188c114a3d2"]' # noqa: E501 + ) deployment_manifest_json["target_account_mappings"][0]["region_mappings"][0]["network"] = { "vpc_id": "vpc-01e556d052f429282", diff --git a/test/unit-test/test_commands_parameters.py b/test/unit-test/test_commands_parameters.py index 24ad7349..ec0cbbd1 100644 --- a/test/unit-test/test_commands_parameters.py +++ b/test/unit-test/test_commands_parameters.py @@ -1,16 +1,12 @@ -import logging import os -from typing import cast -import boto3 +import pydantic_core import pytest -import yaml from moto import mock_sts -import pydantic_core import seedfarmer.commands._parameter_commands as pc import seedfarmer.errors -from seedfarmer.models.manifests import DeploymentManifest, ModuleManifest, ModuleParameter +from seedfarmer.models.manifests import DeploymentManifest from seedfarmer.services._service_utils import boto3_client from seedfarmer.services.session_manager import SessionManager @@ -203,11 +199,11 @@ def test_load_parameter_values(session_manager, mocker): names = [] for module_parameter in params: names.append(module_parameter.name) - assert ("removal-policy" in names) == True - assert ("vpc-id" in names) == True - assert ("test-secrets-manager" in names) == True - assert ("test-ssm-store" in names) == True - assert ("test-regional-param" in names) == True + assert ("removal-policy" in names) is True + assert ("vpc-id" in names) is True + assert ("test-secrets-manager" in names) is True + assert ("test-ssm-store" in names) is True + assert ("test-regional-param" in names) is True @pytest.mark.commands diff --git a/test/unit-test/test_commands_stack.py b/test/unit-test/test_commands_stack.py index e50d001d..4047e91c 100644 --- a/test/unit-test/test_commands_stack.py +++ b/test/unit-test/test_commands_stack.py @@ -1,13 +1,11 @@ -import logging import os -import boto3 import pytest import yaml from moto import mock_sts import seedfarmer.commands._stack_commands as sc -from seedfarmer.models.manifests import DeploymentManifest, ModuleManifest, ModulesManifest +from seedfarmer.models.manifests import DeploymentManifest from seedfarmer.services._service_utils import boto3_client from seedfarmer.services.session_manager import SessionManager @@ -59,7 +57,7 @@ def session_manager(sts_client): """ ) -manage_policy_json={ +manage_policy_json = { "Policy": { "PolicyName": "addf-managed-policy-ProjectPolicy-7PSXY0GVW23I", "PolicyId": "ANPAY667V3NQ3CYB253RG", @@ -70,7 +68,7 @@ def session_manager(sts_client): "PermissionsBoundaryUsageCount": 0, "IsAttachable": True, "Description": "Managed Policy granting access to build a project", - "Tags": [] + "Tags": [], } } diff --git a/test/unit-test/test_mgmt.py b/test/unit-test/test_mgmt.py index a2419baa..c91adcc2 100644 --- a/test/unit-test/test_mgmt.py +++ b/test/unit-test/test_mgmt.py @@ -47,18 +47,25 @@ def test_module_init(): import seedfarmer.mgmt.module_init as mi mi.create_module_dir( - module_name="mytestmodule", group_name="mygroup", module_type=None, template_url="https://github.com/awslabs/seed-farmer.git" + module_name="mytestmodule", + group_name="mygroup", + module_type=None, + template_url="https://github.com/awslabs/seed-farmer.git", ) with pytest.raises(Exception) as e: mi.create_module_dir( - module_name="mytestmodule", group_name="mygroup", module_type=None, template_url="https://github.com/awslabs/seed-farmer.git" + module_name="mytestmodule", + group_name="mygroup", + module_type=None, + template_url="https://github.com/awslabs/seed-farmer.git", ) assert "module mytestmodule already exists" in str(e) shutil.rmtree(setup_mod_dir) - + + @pytest.mark.mgmt def test_module_init_cdkv2(): setup_mod_dir = os.path.join(pathlib.Path(os.getcwd()), "modules") @@ -68,12 +75,18 @@ def test_module_init_cdkv2(): import seedfarmer.mgmt.module_init as mi mi.create_module_dir( - module_name="mytestmodule", group_name="mygroup", module_type="cdkv2", template_url="https://github.com/awslabs/seed-farmer.git" + module_name="mytestmodule", + group_name="mygroup", + module_type="cdkv2", + template_url="https://github.com/awslabs/seed-farmer.git", ) with pytest.raises(Exception) as e: mi.create_module_dir( - module_name="mytestmodule", group_name="mygroup", module_type="cdkv2", template_url="https://github.com/awslabs/seed-farmer.git" + module_name="mytestmodule", + group_name="mygroup", + module_type="cdkv2", + template_url="https://github.com/awslabs/seed-farmer.git", ) assert "module mytestmodule already exists" in str(e) diff --git a/test/unit-test/test_mgmt_build_info.py b/test/unit-test/test_mgmt_build_info.py index 898fbc84..70e8fa90 100644 --- a/test/unit-test/test_mgmt_build_info.py +++ b/test/unit-test/test_mgmt_build_info.py @@ -58,17 +58,13 @@ def session_manager(sts_client): @pytest.mark.mgmt_build_info def test_get_build_params(mocker): mocker.patch("seedfarmer.mgmt.build_info.codebuild.get_build_data", return_value=mock_build_info.codebuild_response) - build_id = 'codeseeder-idf:7f53415b-f47d-4e5e-860f-93d7f440aa30' - env_params = bi.get_build_env_params(build_ids=[build_id]) #[Dict[str, Any] + build_id = "codeseeder-idf:7f53415b-f47d-4e5e-860f-93d7f440aa30" + env_params = bi.get_build_env_params(build_ids=[build_id]) # [Dict[str, Any] assert "SEEDFARMER_HASH" in env_params.keys() assert "SEEDFARMER_PROJECT_NAME" in env_params.keys() - @pytest.mark.mgmt @pytest.mark.mgmt_build_info def test_validate_group_parameters(): bi.get_manifest_schema() - - - diff --git a/test/unit-test/test_mgmt_deploy_utils.py b/test/unit-test/test_mgmt_deploy_utils.py index 8cb86999..b6bd2308 100644 --- a/test/unit-test/test_mgmt_deploy_utils.py +++ b/test/unit-test/test_mgmt_deploy_utils.py @@ -99,7 +99,7 @@ def test_need_to_build_no(mocker, session_manager): module_manifest=module_manifest, deployment_params_cache=None, ) - assert needed == False + assert needed is False @pytest.mark.mgmt @@ -116,7 +116,7 @@ def test_need_to_build_yes(mocker, session_manager): module_manifest=module_manifest, deployment_params_cache=None, ) - assert needed == True + assert needed is True @pytest.mark.mgmt @@ -134,7 +134,7 @@ def test_need_to_build_with_force_deploy_yes(mocker, session_manager): module_manifest=module_manifest, deployment_params_cache=None, ) - assert needed == True + assert needed is True @pytest.mark.mgmt @@ -152,7 +152,7 @@ def test_need_to_build_without_force_deploy_yes(mocker, session_manager): module_manifest=module_manifest, deployment_params_cache=None, ) - assert needed == True + assert needed is True # --------------------------------- @@ -275,15 +275,11 @@ def test_update_deployspec(mocker, session): @pytest.mark.mgmt @pytest.mark.mgmt_deployment_utils def test_populate_module_info_index(session_manager, mocker): - import json - mocker.patch( "seedfarmer.mgmt.deploy_utils.mi.get_parameter_data_cache", return_value=mock_module_info_huge.module_index_info_huge, ) - module_info_index = du.populate_module_info_index( - deployment_manifest=DeploymentManifest(**mock_manifests.deployment_manifest) - ) + du.populate_module_info_index(deployment_manifest=DeploymentManifest(**mock_manifests.deployment_manifest)) # ----------------------- @@ -292,8 +288,6 @@ def test_populate_module_info_index(session_manager, mocker): @pytest.mark.mgmt @pytest.mark.mgmt_deployment_utils_filter def test_filter_destroy_deploy(session_manager, mocker): - import json - mocker.patch( "seedfarmer.mgmt.deploy_utils.mi.get_parameter_data_cache", return_value=mock_module_info_huge.module_index_info_huge, @@ -308,8 +302,6 @@ def test_filter_destroy_deploy(session_manager, mocker): @pytest.mark.mgmt @pytest.mark.mgmt_deployment_utils_filter def test_filter_destroy_deploy_with_destroy(session_manager, mocker): - import json - mocker.patch( "seedfarmer.mgmt.deploy_utils.mi.get_parameter_data_cache", return_value=mock_module_info_huge.module_index_info_huge, @@ -324,8 +316,6 @@ def test_filter_destroy_deploy_with_destroy(session_manager, mocker): @pytest.mark.mgmt @pytest.mark.mgmt_deployment_utils_filter def test_populate_groups_to_remove(session_manager, mocker): - import json - mocker.patch( "seedfarmer.mgmt.deploy_utils.mi.get_parameter_data_cache", return_value=mock_module_info_huge.module_index_info_huge, @@ -346,8 +336,8 @@ def test_populate_groups_to_remove(session_manager, mocker): found_for_delete = True if module.name in ["networking"]: false_found_for_delete = True - assert found_for_delete == True - assert false_found_for_delete == False + assert found_for_delete is True + assert false_found_for_delete is False @pytest.mark.mgmt @@ -362,6 +352,5 @@ def test_validate_module_dependencies(): @pytest.mark.mgmt @pytest.mark.mgmt_deployment_utils_filter def test_validate_datafiles(): - files = DataFile(file_path="") du.validate_data_files(data_files=[files]) diff --git a/test/unit-test/test_mgmt_git_support.py b/test/unit-test/test_mgmt_git_support.py index 4ac0ca04..eabed574 100644 --- a/test/unit-test/test_mgmt_git_support.py +++ b/test/unit-test/test_mgmt_git_support.py @@ -15,14 +15,12 @@ import logging import os - import pytest from moto import mock_sts -import seedfarmer.mgmt.build_info as bi +import seedfarmer.mgmt.git_support as sf_git from seedfarmer.services._service_utils import boto3_client from seedfarmer.services.session_manager import SessionManager -import seedfarmer.mgmt.git_support as sf_git _logger: logging.Logger = logging.getLogger(__name__) @@ -55,7 +53,6 @@ def session_manager(sts_client): ) - @pytest.mark.mgmt @pytest.mark.mgmt_git_support def test_clone_module_repo_branch(mocker): @@ -98,6 +95,3 @@ def test_clone_module_repo_main(mocker): sf_git_dir, module_path, commit_hash = sf_git.clone_module_repo(git_path=git_path_test) # Make sure the pull works on an existing repo sf_git_dir, module_path, commit_hash = sf_git.clone_module_repo(git_path=git_path_test_redo) - - - diff --git a/test/unit-test/test_mgmt_metadata_support.py b/test/unit-test/test_mgmt_metadata_support.py index 537888e6..85dfb93b 100644 --- a/test/unit-test/test_mgmt_metadata_support.py +++ b/test/unit-test/test_mgmt_metadata_support.py @@ -97,7 +97,7 @@ def test_module_parameter_generic(build_env): def test_module_parameter_generic_error(build_env): _copyfile("deployspec_generic.yaml", "deployspec.yaml") param_val = ms.get_parameter_value("DEPLOYMENT_NAME_NOT_EXISTANT") - assert param_val == None + assert param_val is None @pytest.mark.mgmt_metadata_support @@ -114,7 +114,7 @@ def test_module_add_kv_generic(build_env): _copyfile("deployspec_generic.yaml", "deployspec.yaml") ms.add_kv_output(key="TestKV", value="KVValue") output_path, does_exist = _generic_file_exists() - assert True == does_exist + assert True is does_exist metadata = _open_metadata(output_path) assert "TestKV" in metadata.keys() @@ -125,7 +125,7 @@ def test_module_add_json_generic(build_env): ms.add_kv_output(key="TestKV", value="KVValue") ms.add_json_output(json_string='{"TestJsonString":"Yo"}') output_path, does_exist = _generic_file_exists() - assert True == does_exist + assert True is does_exist metadata = _open_metadata(output_path) assert "TestJsonString" in metadata.keys() @@ -135,7 +135,7 @@ def test_module_convert_cdkexports_generic(build_env): _copyfile("deployspec_generic.yaml", "deployspec.yaml") ms.convert_cdkexports(json_file="cdk-exports.json") output_path, does_exist = _generic_file_exists() - assert True == does_exist + assert True is does_exist metadata = _open_metadata(output_path) assert "ArtifactsBucketName" in metadata.keys() @@ -147,7 +147,7 @@ def test_module_convert_cdkexports_generic_jq(build_env): json_file="cdk-exports.json", jq_path="addf-workshop-demo-integration-rosbag-ddb-to-os.metadata" ) output_path, does_exist = _generic_file_exists() - assert True == does_exist + assert True is does_exist metadata = _open_metadata(output_path) assert "ArtifactsBucketName" in metadata.keys() @@ -170,7 +170,7 @@ def test_module_parameter_project(build_env): def test_module_parameter_project_error(build_env): _copyfile("deployspec_project.yaml", "deployspec.yaml") param_val = ms.get_parameter_value("DEPLOYMENT_NAME_NOT_THERE") - assert param_val == None + assert param_val is None @pytest.mark.mgmt_metadata_support @@ -178,7 +178,7 @@ def test_module_add_kv_project(build_env): _copyfile("deployspec_project.yaml", "deployspec.yaml") ms.add_kv_output(key="TestKV", value="KVValue") output_path, does_exist = _project_file_exists() - assert True == does_exist + assert True is does_exist metadata = _open_metadata(output_path) assert "TestKV" in metadata.keys() @@ -189,7 +189,7 @@ def test_module_add_json_project(build_env): ms.add_kv_output(key="TestKV", value="KVValue") ms.add_json_output(json_string='{"TestJsonString":"Yo"}') output_path, does_exist = _project_file_exists() - assert True == does_exist + assert True is does_exist metadata = _open_metadata(output_path) assert "TestJsonString" in metadata.keys() @@ -199,7 +199,7 @@ def test_module_convert_cdkexports_project(build_env): _copyfile("deployspec_project.yaml", "deployspec.yaml") ms.convert_cdkexports(json_file="cdk-exports.json") output_path, does_exist = _generic_file_exists() - assert True == does_exist + assert True is does_exist metadata = _open_metadata(output_path) assert "ArtifactsBucketName" in metadata.keys() @@ -211,6 +211,6 @@ def test_module_convert_cdkexports_project_jq(build_env): json_file="cdk-exports.json", jq_path="addf-workshop-demo-integration-rosbag-ddb-to-os.metadata" ) output_path, does_exist = _generic_file_exists() - assert True == does_exist + assert True is does_exist metadata = _open_metadata(output_path) assert "ArtifactsBucketName" in metadata.keys() diff --git a/test/unit-test/test_mgmt_module_info.py b/test/unit-test/test_mgmt_module_info.py index 363e5491..e91fce1d 100644 --- a/test/unit-test/test_mgmt_module_info.py +++ b/test/unit-test/test_mgmt_module_info.py @@ -34,14 +34,13 @@ def aws_credentials(): @pytest.fixture(scope="function") def session(aws_credentials): - session = boto3.Session() + boto3.Session() ### Test Model Init @pytest.mark.mgmt @pytest.mark.mgmt_module_info def test_get_all_deployments(aws_credentials, session, mocker): - import seedfarmer.mgmt.module_info as mi mocker.patch("seedfarmer.mgmt.module_info.ssm.list_parameters_with_filter", return_value=["/myapp/test/hey"]) @@ -51,7 +50,6 @@ def test_get_all_deployments(aws_credentials, session, mocker): @pytest.mark.mgmt @pytest.mark.mgmt_module_info def test_get_all_deployments_with_manifest(aws_credentials, session, mocker): - import seedfarmer.mgmt.module_info as mi mocker.patch("seedfarmer.mgmt.module_info.ssm.list_parameters_with_filter", return_value=["/myapp/test/manifest"]) @@ -61,7 +59,6 @@ def test_get_all_deployments_with_manifest(aws_credentials, session, mocker): @pytest.mark.mgmt @pytest.mark.mgmt_module_info def test_get_all_deployments_with_nothing(aws_credentials, session, mocker): - import seedfarmer.mgmt.module_info as mi mocker.patch("seedfarmer.mgmt.module_info.ssm.list_parameters_with_filter", return_value=[]) @@ -71,7 +68,6 @@ def test_get_all_deployments_with_nothing(aws_credentials, session, mocker): @pytest.mark.mgmt @pytest.mark.mgmt_module_info def test_get_all_groups(aws_credentials, session, mocker): - import seedfarmer.mgmt.module_info as mi mocker.patch( @@ -84,7 +80,6 @@ def test_get_all_groups(aws_credentials, session, mocker): @pytest.mark.mgmt @pytest.mark.mgmt_module_info def test_get_deployed_modules(aws_credentials, session, mocker): - import seedfarmer.mgmt.module_info as mi mocker.patch( @@ -97,7 +92,6 @@ def test_get_deployed_modules(aws_credentials, session, mocker): @pytest.mark.mgmt @pytest.mark.mgmt_module_info def test_get_module_md5(aws_credentials, session, mocker): - import seedfarmer.mgmt.module_info as mi mocker.patch("seedfarmer.mgmt.module_info.ssm.get_parameter_if_exists", return_value={"hash": "12345678"}) @@ -118,7 +112,6 @@ def test_get_module_md5(aws_credentials, session, mocker): @pytest.mark.mgmt @pytest.mark.mgmt_module_info def test_get_module_metadata(aws_credentials, session, mocker): - import seedfarmer.mgmt.module_info as mi mocker.patch("seedfarmer.mgmt.module_info._fetch_helper", return_value={"hey": "yo"}) @@ -128,7 +121,6 @@ def test_get_module_metadata(aws_credentials, session, mocker): @pytest.mark.mgmt @pytest.mark.mgmt_module_info def test_get_module_manifest(aws_credentials, session, mocker): - import seedfarmer.mgmt.module_info as mi mocker.patch("seedfarmer.mgmt.module_info._fetch_helper", return_value={"hey": "yo"}) @@ -138,7 +130,6 @@ def test_get_module_manifest(aws_credentials, session, mocker): @pytest.mark.mgmt @pytest.mark.mgmt_module_info def test_get_deployment_manifest(aws_credentials, session, mocker): - import seedfarmer.mgmt.module_info as mi mocker.patch("seedfarmer.mgmt.module_info._fetch_helper", return_value={"hey": "yo"}) @@ -148,7 +139,6 @@ def test_get_deployment_manifest(aws_credentials, session, mocker): @pytest.mark.mgmt @pytest.mark.mgmt_module_info def test_get_deployed_deployment_manifest(aws_credentials, session, mocker): - import seedfarmer.mgmt.module_info as mi mocker.patch("seedfarmer.mgmt.module_info._fetch_helper", return_value={"hey": "yo"}) @@ -158,7 +148,6 @@ def test_get_deployed_deployment_manifest(aws_credentials, session, mocker): @pytest.mark.mgmt @pytest.mark.mgmt_module_info def test_get_deployspec(aws_credentials, session, mocker): - import seedfarmer.mgmt.module_info as mi mocker.patch("seedfarmer.mgmt.module_info._fetch_helper", return_value={"hey": "yo"}) @@ -168,7 +157,6 @@ def test_get_deployspec(aws_credentials, session, mocker): @pytest.mark.mgmt @pytest.mark.mgmt_module_info def test_get_group_manifest(aws_credentials, session, mocker): - import seedfarmer.mgmt.module_info as mi mocker.patch("seedfarmer.mgmt.module_info._fetch_helper", return_value={"hey": "yo"}) @@ -178,7 +166,6 @@ def test_get_group_manifest(aws_credentials, session, mocker): @pytest.mark.mgmt @pytest.mark.mgmt_module_info def test_does_module_exist(aws_credentials, session, mocker): - import seedfarmer.mgmt.module_info as mi mocker.patch("seedfarmer.mgmt.module_info.ssm.does_parameter_exist", return_value=True) @@ -188,7 +175,6 @@ def test_does_module_exist(aws_credentials, session, mocker): @pytest.mark.mgmt @pytest.mark.mgmt_module_info def test_does_md5_match(aws_credentials, session, mocker): - import seedfarmer.mgmt.module_info as mi mocker.patch("seedfarmer.mgmt.module_info.ssm.get_parameter_if_exists", return_value={"hash": "12345678"}) @@ -209,7 +195,6 @@ def test_does_md5_match(aws_credentials, session, mocker): @pytest.mark.mgmt @pytest.mark.mgmt_module_info def test_does_md5_match_no(aws_credentials, session, mocker): - import seedfarmer.mgmt.module_info as mi mocker.patch("seedfarmer.mgmt.module_info.ssm.get_parameter_if_exists", return_value=None) @@ -222,7 +207,6 @@ def test_does_md5_match_no(aws_credentials, session, mocker): @pytest.mark.mgmt @pytest.mark.mgmt_module_info def test_write_metadata(aws_credentials, session, mocker): - import seedfarmer.mgmt.module_info as mi mocker.patch("seedfarmer.mgmt.module_info.ssm.put_parameter", return_value=True) @@ -232,7 +216,6 @@ def test_write_metadata(aws_credentials, session, mocker): @pytest.mark.mgmt @pytest.mark.mgmt_module_info def test_write_group_manifest(aws_credentials, session, mocker): - import seedfarmer.mgmt.module_info as mi mocker.patch("seedfarmer.mgmt.module_info.ssm.put_parameter", return_value=True) @@ -242,18 +225,18 @@ def test_write_group_manifest(aws_credentials, session, mocker): @pytest.mark.mgmt @pytest.mark.mgmt_module_info def test_write_module_manifest(aws_credentials, session, mocker): - import seedfarmer.mgmt.module_info as mi mocker.patch("seedfarmer.mgmt.module_info.ssm.put_parameter", return_value=True) payload = {"Hey", "Yo"} - mi.write_module_manifest(deployment="myapp", group="test", module="mymodule", data=dict.fromkeys(payload, 0), session=session) + mi.write_module_manifest( + deployment="myapp", group="test", module="mymodule", data=dict.fromkeys(payload, 0), session=session + ) @pytest.mark.mgmt @pytest.mark.mgmt_module_info def test_write_deployspec(aws_credentials, session, mocker): - import seedfarmer.mgmt.module_info as mi mocker.patch("seedfarmer.mgmt.module_info.ssm.put_parameter", return_value=True) @@ -263,7 +246,6 @@ def test_write_deployspec(aws_credentials, session, mocker): @pytest.mark.mgmt @pytest.mark.mgmt_module_info def test_write_module_md5(aws_credentials, session, mocker): - import seedfarmer.mgmt.module_info as mi mocker.patch("seedfarmer.mgmt.module_info.ssm.put_parameter", return_value=True) @@ -275,7 +257,6 @@ def test_write_module_md5(aws_credentials, session, mocker): @pytest.mark.mgmt @pytest.mark.mgmt_module_info def test_write_deployment_manifest(aws_credentials, session, mocker): - import seedfarmer.mgmt.module_info as mi mocker.patch("seedfarmer.mgmt.module_info.ssm.put_parameter", return_value=True) @@ -285,7 +266,6 @@ def test_write_deployment_manifest(aws_credentials, session, mocker): @pytest.mark.mgmt @pytest.mark.mgmt_module_info def test_write_deployed_deployment_manifest(aws_credentials, session, mocker): - import seedfarmer.mgmt.module_info as mi mocker.patch("seedfarmer.mgmt.module_info.ssm.put_parameter", return_value=True) @@ -295,7 +275,6 @@ def test_write_deployed_deployment_manifest(aws_credentials, session, mocker): @pytest.mark.mgmt @pytest.mark.mgmt_module_info def test_remove_all_info(aws_credentials, session, mocker): - import seedfarmer.mgmt.module_info as mi mocker.patch("seedfarmer.mgmt.module_info.ssm.delete_parameters", return_value=True) @@ -338,7 +317,6 @@ def test_get_deployspec_path(): @pytest.mark.mgmt @pytest.mark.mgmt_module_info def test_fetch_helper(aws_credentials, session, mocker): - import seedfarmer.mgmt.module_info as mi mocker.patch("seedfarmer.mgmt.module_info.ssm.get_parameter_if_exists", return_value={}) diff --git a/test/unit-test/test_models.py b/test/unit-test/test_models.py index 43a6d613..545a130e 100644 --- a/test/unit-test/test_models.py +++ b/test/unit-test/test_models.py @@ -15,15 +15,15 @@ import logging import os from copy import deepcopy - from unittest import mock + import pytest import yaml import seedfarmer.errors +from seedfarmer.errors import InvalidManifestError from seedfarmer.models.deploy_responses import CodeSeederMetadata from seedfarmer.models.manifests import DeploymentManifest, ModuleManifest -from seedfarmer.errors import InvalidManifestError from seedfarmer.models.manifests._module_manifest import DeploySpec # Override _stack_commands OPS_ROOT to reflect path of resource policy needed for some testing # @@ -466,7 +466,6 @@ def test_module_manifest_with_unknown_value_config_no_fail(): manifest.validate_and_set_module_defaults() - @pytest.mark.models @pytest.mark.models_module_manifest def test_module_manifest_with_both_value_and_value_from_error(): @@ -488,6 +487,7 @@ def test_module_manifest_with_both_value_and_value_from_error(): manifest.groups[0].modules = [module] manifest.validate_and_set_module_defaults() + @pytest.mark.models @pytest.mark.models_deployspec def test_deployspec(): @@ -495,7 +495,7 @@ def test_deployspec(): updated_deployment_yaml = deepcopy(deployment_yaml) updated_deployment_yaml["targetAccountMappings"][0]["default"] = False updated_deployment_yaml["targetAccountMappings"][0]["regionMappings"][0]["default"] = False - manifest = DeploymentManifest(**updated_deployment_yaml) + DeploymentManifest(**updated_deployment_yaml) deployspec_yaml = yaml.safe_load( """ @@ -520,7 +520,7 @@ def test_deployspec(): """ ) - deploy_spec = DeploySpec(**deployspec_yaml) + DeploySpec(**deployspec_yaml) deploy_spec_default = yaml.safe_load( """ @@ -550,7 +550,7 @@ def test_deployspec(): @pytest.mark.models @pytest.mark.models_deployresponses def test_deployresponses(): - cm = CodeSeederMetadata( + CodeSeederMetadata( aws_account_id="123456789012", aws_region="us-east-1", codebuild_build_id="codebuild:12345", diff --git a/test/unit-test/test_services.py b/test/unit-test/test_services.py index 4b59ca66..d765b140 100644 --- a/test/unit-test/test_services.py +++ b/test/unit-test/test_services.py @@ -12,9 +12,8 @@ import os import boto3 -import botocore import pytest -from moto import mock_codebuild, mock_iam, mock_secretsmanager, mock_ssm, mock_sts +from moto import mock_codebuild, mock_iam, mock_ssm, mock_sts from seedfarmer.services import _service_utils from seedfarmer.services._service_utils import boto3_client @@ -36,7 +35,7 @@ def aws_credentials(): @pytest.fixture(scope="function") def session(aws_credentials): - session = boto3.Session() + boto3.Session() @pytest.fixture(scope="function") @@ -78,7 +77,6 @@ def test_utils_get_region(sts_client, session): def test_utils_get_account_id(sts_client, mocker): - mocker.patch( "seedfarmer.services._service_utils._call_sts", return_value={"Account": "123456789012", "Arn": "arn:aws:iam::"} ) diff --git a/test/unit-test/test_utils.py b/test/unit-test/test_utils.py index 53727987..90c2005c 100644 --- a/test/unit-test/test_utils.py +++ b/test/unit-test/test_utils.py @@ -13,10 +13,11 @@ # limitations under the License. import logging +import os + import mock_data.mock_deployment_manifest_huge as mock -import os import pytest -import seedfarmer.errors + import seedfarmer.utils as utils _logger: logging.Logger = logging.getLogger(__name__) @@ -53,6 +54,4 @@ def test_validate_module_dependencies(env_params): replaced = utils.batch_replace_env(mock.deployment_manifest_batch_replace) assert replaced["name"] == "testing" assert replaced["toolchain_region"] == "us-east-1" - assert replaced["target_account_mappings"][0]["account_id"] == '123456789012' - - + assert replaced["target_account_mappings"][0]["account_id"] == "123456789012"