From 8bb45c67d37bf787e80076fb6916ae241564bf4a Mon Sep 17 00:00:00 2001 From: jasquat Date: Fri, 23 Sep 2022 09:45:12 -0400 Subject: [PATCH 1/4] avoid checking for mysql specific error messages so other dbs can still work --- .../spiffworkflow_backend/integration/test_secret_service.py | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/tests/spiffworkflow_backend/integration/test_secret_service.py b/tests/spiffworkflow_backend/integration/test_secret_service.py index 36ce6c9b..18d58c69 100644 --- a/tests/spiffworkflow_backend/integration/test_secret_service.py +++ b/tests/spiffworkflow_backend/integration/test_secret_service.py @@ -94,7 +94,7 @@ class TestSecretService(SecretServiceTestHelpers): self.add_test_secret(user) with pytest.raises(ApiError) as ae: self.add_test_secret(user) - assert "Duplicate entry" in ae.value.message + assert "IntegrityError" in ae.value.message def test_get_secret(self, app: Flask, with_db_and_bpmn_file_cleanup: None) -> None: """Test_get_secret.""" @@ -245,7 +245,6 @@ class TestSecretService(SecretServiceTestHelpers): ) assert "Resource already exists" in ae.value.message assert "IntegrityError" in ae.value.message - assert "Duplicate entry" in ae.value.message def test_secret_add_allowed_process_bad_user_fails( self, app: Flask, client: FlaskClient, with_db_and_bpmn_file_cleanup: None @@ -286,7 +285,6 @@ class TestSecretService(SecretServiceTestHelpers): allowed_relative_path=process_model_relative_path, ) assert "Resource does not exist" in ae.value.message - print("test_secret_add_allowed_process_bad_secret") def test_secret_delete_allowed_process( self, app: Flask, client: FlaskClient, with_db_and_bpmn_file_cleanup: None @@ -438,7 +436,6 @@ class TestSecretServiceApi(SecretServiceTestHelpers): headers=self.logged_in_headers(user), ) assert secret_response.status_code == 404 - print("test_delete_secret_bad_key") def test_add_secret_allowed_process( self, app: Flask, client: FlaskClient, with_db_and_bpmn_file_cleanup: None From bc9d820e1d4fb2e114a90997570e31b44bebf3de Mon Sep 17 00:00:00 2001 From: jasquat Date: Fri, 23 Sep 2022 10:01:22 -0400 Subject: [PATCH 2/4] python 3.9 does not like the pipe style optional arg types --- src/spiffworkflow_backend/routes/process_api_blueprint.py | 2 +- src/spiffworkflow_backend/services/secret_service.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/spiffworkflow_backend/routes/process_api_blueprint.py b/src/spiffworkflow_backend/routes/process_api_blueprint.py index 65816cd5..ae0c31aa 100644 --- a/src/spiffworkflow_backend/routes/process_api_blueprint.py +++ b/src/spiffworkflow_backend/routes/process_api_blueprint.py @@ -1088,7 +1088,7 @@ def get_spiff_task_from_process_instance( # # Methods for secrets CRUD - maybe move somewhere else: # -def get_secret(key: str) -> str | None: +def get_secret(key: str) -> Optional[str]: """Get_secret.""" return SecretService.get_secret(key) diff --git a/src/spiffworkflow_backend/services/secret_service.py b/src/spiffworkflow_backend/services/secret_service.py index 9321ea52..de215a1c 100644 --- a/src/spiffworkflow_backend/services/secret_service.py +++ b/src/spiffworkflow_backend/services/secret_service.py @@ -54,7 +54,7 @@ class SecretService: return secret_model @staticmethod - def get_secret(key: str) -> str | None: + def get_secret(key: str) -> Optional[str]: """Get_secret.""" secret: SecretModel = ( db.session.query(SecretModel).filter(SecretModel.key == key).first() From 115e126873dc4de7b20698dd6bab596d77ea8df8 Mon Sep 17 00:00:00 2001 From: jasquat Date: Fri, 23 Sep 2022 10:33:12 -0400 Subject: [PATCH 3/4] log db validation error to see what postgres is doing --- src/spiffworkflow_backend/services/logging_service.py | 6 +++++- src/spiffworkflow_backend/services/secret_service.py | 8 ++++++-- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/src/spiffworkflow_backend/services/logging_service.py b/src/spiffworkflow_backend/services/logging_service.py index 94a14da3..9d98119e 100644 --- a/src/spiffworkflow_backend/services/logging_service.py +++ b/src/spiffworkflow_backend/services/logging_service.py @@ -1,6 +1,7 @@ """Logging_service.""" import json import logging +import re from typing import Any from typing import Optional @@ -113,6 +114,8 @@ def setup_logger(app: Flask) -> None: "%(asctime)s - %(name)s - %(levelname)s - %(message)s" ) + app.logger.debug("Printing log to create app logger") + # the json formatter is nice for real environments but makes # debugging locally a little more difficult if app.env != "development": @@ -140,7 +143,8 @@ def setup_logger(app: Flask) -> None: # make all loggers act the same for name in logging.root.manager.loggerDict: - if "spiff" not in name: + # use a regex so spiffworkflow_backend isn't filtered out + if not re.match(r"^spiff\b", name): the_logger = logging.getLogger(name) the_logger.setLevel(log_level) if spiff_logger_filehandler: diff --git a/src/spiffworkflow_backend/services/secret_service.py b/src/spiffworkflow_backend/services/secret_service.py index de215a1c..06fedaa3 100644 --- a/src/spiffworkflow_backend/services/secret_service.py +++ b/src/spiffworkflow_backend/services/secret_service.py @@ -1,6 +1,7 @@ """Secret_service.""" from typing import Optional +from flask import current_app from flask_bpmn.api.api_error import ApiError from flask_bpmn.models.db import db from sqlalchemy.exc import IntegrityError @@ -46,11 +47,14 @@ class SecretService: try: db.session.commit() except Exception as e: - raise ApiError( + ae = ApiError( code="create_secret_error", message=f"There was an error creating a secret with key: {key} and value ending with: {value[:-4]}. " f"Original error is {e}", - ) from e + ) + # log the error so we can see what postgres is doing + current_app.logger.error(ae) + raise ae from e return secret_model @staticmethod From da4c20524a91a461ace12ddcedf3bac9568e2be5 Mon Sep 17 00:00:00 2001 From: jasquat Date: Fri, 23 Sep 2022 10:46:03 -0400 Subject: [PATCH 4/4] code for api error codes instead of db errors since each db raises different errors for the samething --- src/spiffworkflow_backend/services/secret_service.py | 8 ++------ .../integration/test_secret_service.py | 4 ++-- 2 files changed, 4 insertions(+), 8 deletions(-) diff --git a/src/spiffworkflow_backend/services/secret_service.py b/src/spiffworkflow_backend/services/secret_service.py index 06fedaa3..de215a1c 100644 --- a/src/spiffworkflow_backend/services/secret_service.py +++ b/src/spiffworkflow_backend/services/secret_service.py @@ -1,7 +1,6 @@ """Secret_service.""" from typing import Optional -from flask import current_app from flask_bpmn.api.api_error import ApiError from flask_bpmn.models.db import db from sqlalchemy.exc import IntegrityError @@ -47,14 +46,11 @@ class SecretService: try: db.session.commit() except Exception as e: - ae = ApiError( + raise ApiError( code="create_secret_error", message=f"There was an error creating a secret with key: {key} and value ending with: {value[:-4]}. " f"Original error is {e}", - ) - # log the error so we can see what postgres is doing - current_app.logger.error(ae) - raise ae from e + ) from e return secret_model @staticmethod diff --git a/tests/spiffworkflow_backend/integration/test_secret_service.py b/tests/spiffworkflow_backend/integration/test_secret_service.py index 18d58c69..abc38a52 100644 --- a/tests/spiffworkflow_backend/integration/test_secret_service.py +++ b/tests/spiffworkflow_backend/integration/test_secret_service.py @@ -94,7 +94,7 @@ class TestSecretService(SecretServiceTestHelpers): self.add_test_secret(user) with pytest.raises(ApiError) as ae: self.add_test_secret(user) - assert "IntegrityError" in ae.value.message + assert ae.value.code == "create_secret_error" def test_get_secret(self, app: Flask, with_db_and_bpmn_file_cleanup: None) -> None: """Test_get_secret.""" @@ -151,6 +151,7 @@ class TestSecretService(SecretServiceTestHelpers): with pytest.raises(ApiError) as ae: SecretService.update_secret(secret.key + "x", "some_new_value", user.id) assert "Resource does not exist" in ae.value.message + assert ae.value.code == "update_secret_error" def test_delete_secret( self, app: Flask, client: FlaskClient, with_db_and_bpmn_file_cleanup: None @@ -244,7 +245,6 @@ class TestSecretService(SecretServiceTestHelpers): allowed_relative_path=process_model_relative_path, ) assert "Resource already exists" in ae.value.message - assert "IntegrityError" in ae.value.message def test_secret_add_allowed_process_bad_user_fails( self, app: Flask, client: FlaskClient, with_db_and_bpmn_file_cleanup: None