diff --git a/cosmosdb_emulator/time_tracker_cli/providers/common.py b/cosmosdb_emulator/time_tracker_cli/providers/common.py index c5ec3e24..c27e60b1 100644 --- a/cosmosdb_emulator/time_tracker_cli/providers/common.py +++ b/cosmosdb_emulator/time_tracker_cli/providers/common.py @@ -1,7 +1,9 @@ from faker.providers import BaseProvider +from utils.enums.status import Status + class CommonProvider(BaseProvider): def status(self) -> str: - available_status = ['active', 'inactive'] + available_status = [Status.ACTIVE.value, Status.INACTIVE.value] return self.random_element(elements=available_status) diff --git a/tests/time_tracker_api/activities/activities_model_test.py b/tests/time_tracker_api/activities/activities_model_test.py index 37c61e0f..c1a1b243 100644 --- a/tests/time_tracker_api/activities/activities_model_test.py +++ b/tests/time_tracker_api/activities/activities_model_test.py @@ -7,6 +7,7 @@ ActivityCosmosDBModel, create_dao, ) +from utils.enums.status import Status faker = Faker() @@ -59,7 +60,7 @@ def test_create_activity_should_add_active_status( activity_dao.create(activity_payload) expect_argument = copy.copy(activity_payload) - expect_argument['status'] = 'active' + expect_argument['status'] = Status.ACTIVE.value activity_repository_create_mock.assert_called_with( data=expect_argument, event_context=ANY ) diff --git a/tests/time_tracker_api/activities/activities_namespace_test.py b/tests/time_tracker_api/activities/activities_namespace_test.py index 13958d8a..a2b9ab20 100644 --- a/tests/time_tracker_api/activities/activities_namespace_test.py +++ b/tests/time_tracker_api/activities/activities_namespace_test.py @@ -6,6 +6,8 @@ from flask_restplus._http import HTTPStatus from pytest_mock import MockFixture +from utils.enums.status import Status + fake = Faker() valid_activity_data = { @@ -101,7 +103,7 @@ def test_list_all_active_activities( repository_find_all_mock.assert_called_once_with( event_context=ANY, - conditions={'status': 'active'}, + conditions={'status': Status.ACTIVE.value}, activities_id=ANY, visible_only=ANY, max_count=ANY, @@ -259,7 +261,7 @@ def test_delete_activity_should_succeed_with_valid_id( assert HTTPStatus.NO_CONTENT == response.status_code assert b'' == response.data repository_remove_mock.assert_called_once_with( - str(valid_id), {'status': 'inactive'}, ANY + str(valid_id), {'status': Status.INACTIVE.value}, ANY ) @@ -283,7 +285,7 @@ def test_delete_activity_should_return_not_found_with_invalid_id( assert HTTPStatus.NOT_FOUND == response.status_code repository_remove_mock.assert_called_once_with( - str(invalid_id), {'status': 'inactive'}, ANY + str(invalid_id), {'status': Status.INACTIVE.value}, ANY ) @@ -309,5 +311,5 @@ def test_delete_activity_should_return_422_for_invalid_id_format( assert HTTPStatus.UNPROCESSABLE_ENTITY == response.status_code repository_remove_mock.assert_called_once_with( - str(invalid_id), {'status': 'inactive'}, ANY + str(invalid_id), {'status': Status.INACTIVE.value}, ANY ) diff --git a/tests/time_tracker_api/customers/customers_namespace_test.py b/tests/time_tracker_api/customers/customers_namespace_test.py index 9c8bfa07..880e7fc2 100644 --- a/tests/time_tracker_api/customers/customers_namespace_test.py +++ b/tests/time_tracker_api/customers/customers_namespace_test.py @@ -6,6 +6,8 @@ from flask_restplus._http import HTTPStatus from pytest_mock import MockFixture +from utils.enums.status import Status + fake = Faker() valid_customer_data = { @@ -229,7 +231,7 @@ def test_delete_customer_should_succeed_with_valid_id( assert HTTPStatus.NO_CONTENT == response.status_code assert b'' == response.data repository_remove_mock.assert_called_once_with( - str(valid_id), {'status': 'inactive'}, ANY + str(valid_id), {'status': Status.INACTIVE.value}, ANY ) @@ -253,7 +255,7 @@ def test_delete_customer_should_return_not_found_with_invalid_id( assert HTTPStatus.NOT_FOUND == response.status_code repository_remove_mock.assert_called_once_with( - str(invalid_id), {'status': 'inactive'}, ANY + str(invalid_id), {'status': Status.INACTIVE.value}, ANY ) @@ -282,7 +284,7 @@ def test_delete_customer_should_return_422_for_invalid_id_format( assert HTTPStatus.UNPROCESSABLE_ENTITY == response.status_code repository_remove_mock.assert_called_once_with( - str(invalid_id), {'status': 'inactive'}, ANY + str(invalid_id), {'status': Status.INACTIVE.value}, ANY ) diff --git a/tests/time_tracker_api/projects/projects_namespace_test.py b/tests/time_tracker_api/projects/projects_namespace_test.py index e8b1d35c..f302d892 100644 --- a/tests/time_tracker_api/projects/projects_namespace_test.py +++ b/tests/time_tracker_api/projects/projects_namespace_test.py @@ -7,6 +7,7 @@ from pytest_mock import MockFixture from time_tracker_api.projects.projects_model import ProjectCosmosDBDao +from utils.enums.status import Status fake = Faker() @@ -256,7 +257,7 @@ def test_delete_project_should_succeed_with_valid_id( assert HTTPStatus.NO_CONTENT == response.status_code assert b'' == response.data repository_remove_mock.assert_called_once_with( - str(valid_id), {'status': 'inactive'}, ANY + str(valid_id), {'status': Status.INACTIVE.value}, ANY ) @@ -280,7 +281,7 @@ def test_delete_project_should_return_not_found_with_invalid_id( assert HTTPStatus.NOT_FOUND == response.status_code repository_remove_mock.assert_called_once_with( - str(invalid_id), {'status': 'inactive'}, ANY + str(invalid_id), {'status': Status.INACTIVE.value}, ANY ) @@ -306,5 +307,5 @@ def test_delete_project_should_return_unprocessable_entity_for_invalid_id_format assert HTTPStatus.UNPROCESSABLE_ENTITY == response.status_code repository_remove_mock.assert_called_once_with( - str(invalid_id), {'status': 'inactive'}, ANY + str(invalid_id), {'status': Status.INACTIVE.value}, ANY ) diff --git a/tests/utils/query_builder_test.py b/tests/utils/query_builder_test.py index dc66b4f1..55608921 100644 --- a/tests/utils/query_builder_test.py +++ b/tests/utils/query_builder_test.py @@ -1,4 +1,6 @@ from unittest.mock import patch + +from utils.enums.status import Status from utils.query_builder import CosmosDBQueryBuilder, Order from utils.repository import remove_white_spaces import pytest @@ -376,7 +378,7 @@ def test_build_with_add_sql_date_range_condition(): def test_add_sql_active_condition_should_update_where_conditions(): - status_value = 'active' + status_value = Status.ACTIVE.value expected_active_query = f""" SELECT * FROM c WHERE NOT IS_DEFINED(c.status) OR (IS_DEFINED(c.status) AND c.status = '{status_value}') @@ -399,7 +401,7 @@ def test_add_sql_active_condition_should_update_where_conditions(): def test_add_sql_inactive_condition_should_update_where_conditions(): - status_value = 'inactive' + status_value = Status.INACTIVE.value expected_inactive_query = f""" SELECT * FROM c WHERE (IS_DEFINED(c.status) AND c.status = '{status_value}') diff --git a/time_tracker_api/activities/activities_model.py b/time_tracker_api/activities/activities_model.py index 83f10fff..cbfd0d20 100644 --- a/time_tracker_api/activities/activities_model.py +++ b/time_tracker_api/activities/activities_model.py @@ -10,6 +10,7 @@ from time_tracker_api.database import CRUDDao, APICosmosDBDao from typing import List, Callable from commons.data_access_layer.database import EventContext +from utils.enums.status import Status from utils.query_builder import CosmosDBQueryBuilder @@ -148,7 +149,7 @@ def get_all( def create(self, activity_payload: dict): event_ctx = self.create_event_context('create') - activity_payload['status'] = 'active' + activity_payload['status'] = Status.ACTIVE.value return self.repository.create( data=activity_payload, event_context=event_ctx ) diff --git a/time_tracker_api/activities/activities_namespace.py b/time_tracker_api/activities/activities_namespace.py index 36973542..df3c104a 100644 --- a/time_tracker_api/activities/activities_namespace.py +++ b/time_tracker_api/activities/activities_namespace.py @@ -9,6 +9,7 @@ remove_required_constraint, NullableString, ) +from utils.enums.status import Status faker = Faker() @@ -40,8 +41,8 @@ example=Faker().words( 2, [ - 'active', - 'inactive', + Status.ACTIVE.value, + Status.INACTIVE.value, ], unique=True, ), @@ -117,5 +118,5 @@ def put(self, id): @ns.response(HTTPStatus.NO_CONTENT, 'Activity deleted successfully') def delete(self, id): """Delete an activity""" - activity_dao.update(id, {'status': 'inactive'}) + activity_dao.update(id, {'status': Status.INACTIVE.value}) return None, HTTPStatus.NO_CONTENT diff --git a/time_tracker_api/customers/customers_model.py b/time_tracker_api/customers/customers_model.py index cb245afe..a81b6d78 100644 --- a/time_tracker_api/customers/customers_model.py +++ b/time_tracker_api/customers/customers_model.py @@ -8,6 +8,7 @@ CosmosDBDao, ) from time_tracker_api.database import CRUDDao, APICosmosDBDao +from utils.enums.status import Status class CustomerDao(CRUDDao): @@ -32,7 +33,7 @@ class CustomerCosmosDBModel(CosmosDBModel): description: str deleted: str tenant_id: str - status: str = field(default='active') + status: str = field(default=Status.ACTIVE.value) def __init__(self, data): super(CustomerCosmosDBModel, self).__init__(data) # pragma: no cover diff --git a/time_tracker_api/customers/customers_namespace.py b/time_tracker_api/customers/customers_namespace.py index 584616a4..d9ebfcc3 100644 --- a/time_tracker_api/customers/customers_namespace.py +++ b/time_tracker_api/customers/customers_namespace.py @@ -9,6 +9,7 @@ NullableString, ) from time_tracker_api.customers.customers_model import create_dao +from utils.enums.status import Status faker = Faker() @@ -41,8 +42,8 @@ example=Faker().words( 2, [ - 'active', - 'inactive', + Status.ACTIVE.value, + Status.INACTIVE.value, ], unique=True, ), @@ -122,5 +123,5 @@ def put(self, id): @ns.response(HTTPStatus.NO_CONTENT, 'Customer successfully deleted') def delete(self, id): """Delete a customer""" - customer_dao.update(id, {'status': 'inactive'}) + customer_dao.update(id, {'status': Status.INACTIVE.value}) return None, HTTPStatus.NO_CONTENT diff --git a/time_tracker_api/projects/projects_namespace.py b/time_tracker_api/projects/projects_namespace.py index 7030f63e..a09455fd 100644 --- a/time_tracker_api/projects/projects_namespace.py +++ b/time_tracker_api/projects/projects_namespace.py @@ -11,6 +11,7 @@ NullableString, ) from time_tracker_api.projects.projects_model import create_dao +from utils.enums.status import Status faker = Faker() @@ -61,8 +62,8 @@ example=Faker().words( 2, [ - 'active', - 'inactive', + Status.ACTIVE.value, + Status.INACTIVE.value, ], unique=True, ), @@ -142,7 +143,7 @@ def get(self): """List all projects""" conditions = attributes_filter.parse_args() return project_dao.get_all( - conditions=conditions, customer_status='active' + conditions=conditions, customer_status=Status.ACTIVE.value ) @ns.doc('create_project') @@ -190,5 +191,5 @@ def put(self, id): @ns.response(HTTPStatus.NO_CONTENT, 'Project successfully deleted') def delete(self, id): """Delete a project""" - project_dao.update(id, {'status': 'inactive'}) + project_dao.update(id, {'status': Status.INACTIVE.value}) return None, HTTPStatus.NO_CONTENT diff --git a/utils/enums/status.py b/utils/enums/status.py new file mode 100644 index 00000000..256319fb --- /dev/null +++ b/utils/enums/status.py @@ -0,0 +1,6 @@ +from enum import Enum + + +class Status(Enum): + ACTIVE = 'active' + INACTIVE = 'inactive' diff --git a/utils/query_builder.py b/utils/query_builder.py index b66f9ec1..3d9b200a 100644 --- a/utils/query_builder.py +++ b/utils/query_builder.py @@ -1,4 +1,6 @@ from typing import List + +from utils.enums.status import Status from utils.repository import convert_list_to_tuple_string from enum import Enum @@ -38,7 +40,7 @@ def add_sql_active_condition(self, status_value: str): if status_value: not_defined_condition = '' condition_operand = '' - if status_value == 'active': + if status_value == Status.ACTIVE.value: not_defined_condition = 'NOT IS_DEFINED(c.status)' condition_operand = ' OR '