From 6bce1cdc0a87f4e58ed87c56547a68e3c101c7ad Mon Sep 17 00:00:00 2001 From: pmoharana-cmd Date: Fri, 19 Apr 2024 23:28:08 -0400 Subject: [PATCH] Fix bugs regarding enums and update field names --- backend/entities/__init__.py | 7 ++-- backend/entities/program_enum.py | 13 +++---- backend/entities/resource_entity.py | 6 ++-- backend/entities/resource_tag_entity.py | 2 +- backend/entities/sample_entity.py | 12 ------- backend/entities/service_entity.py | 12 ++----- backend/entities/service_tag_entity.py | 2 +- backend/entities/user_entity.py | 47 ++++++++++++------------- backend/entities/user_enum.py | 13 +++---- backend/models/enum_for_models.py | 16 ++++----- backend/models/user_model.py | 4 +-- backend/script/create_database.py | 6 ++-- backend/script/delete_database.py | 6 ++-- backend/services/user.py | 21 ++++------- backend/test/conftest.py | 4 ++- backend/test/services/user_test.py | 17 +++++---- backend/test/services/user_test_data.py | 22 +++++++----- 17 files changed, 85 insertions(+), 125 deletions(-) delete mode 100644 backend/entities/sample_entity.py diff --git a/backend/entities/__init__.py b/backend/entities/__init__.py index 5bb11e6..546a7b5 100644 --- a/backend/entities/__init__.py +++ b/backend/entities/__init__.py @@ -1,10 +1,9 @@ from .entity_base import EntityBase -from .sample_entity import SampleEntity from .tag_entity import TagEntity -#from .user_entity import UserEntity +from .user_entity import UserEntity from .resource_entity import ResourceEntity from .resource_tag_entity import ResourceTagEntity from .service_entity import ServiceEntity from .service_tag_entity import ServiceTagEntity -from .program_enum import ProgramEnum -from .user_enum import RoleEnum +from .program_enum import Program_Enum +from .user_enum import Role_Enum diff --git a/backend/entities/program_enum.py b/backend/entities/program_enum.py index a869116..c2823c2 100644 --- a/backend/entities/program_enum.py +++ b/backend/entities/program_enum.py @@ -1,10 +1,7 @@ -from sqlalchemy import Enum +from enum import Enum -class ProgramEnum(Enum): - ECONOMIC = 'ECONOMIC' - DOMESTIC = 'DOMESTIC' - COMMUNITY = 'COMMUNITY' - - def __init__(self): - super().__init__(name="program_enum") +class Program_Enum(Enum): + ECONOMIC = "ECONOMIC" + DOMESTIC = "DOMESTIC" + COMMUNITY = "COMMUNITY" diff --git a/backend/entities/resource_entity.py b/backend/entities/resource_entity.py index 2cfb1ff..cbe5d7c 100644 --- a/backend/entities/resource_entity.py +++ b/backend/entities/resource_entity.py @@ -1,7 +1,7 @@ """ Defines the table for storing resources """ # Import our mapped SQL types from SQLAlchemy -from sqlalchemy import Integer, String, DateTime, ARRAY +from sqlalchemy import Integer, String, DateTime, Enum # Import mapping capabilities from the SQLAlchemy ORM from sqlalchemy.orm import Mapped, mapped_column, relationship @@ -14,7 +14,7 @@ from datetime import datetime # Import self for to model from typing import Self -from backend.entities.program_enum import ProgramEnum +from backend.entities.program_enum import Program_Enum class ResourceEntity(EntityBase): @@ -28,7 +28,7 @@ class ResourceEntity(EntityBase): name: Mapped[str] = mapped_column(String(32), nullable=False) summary: Mapped[str] = mapped_column(String(100), nullable=False) link: Mapped[str] = mapped_column(String, nullable=False) - program: Mapped[list[ProgramEnum]] = mapped_column(ARRAY(ProgramEnum), nullable=False) + program: Mapped[Program_Enum] = mapped_column(Enum(Program_Enum), nullable=False) # relationships resourceTags: Mapped[list["ResourceTagEntity"]] = relationship( back_populates="resource", cascade="all,delete" diff --git a/backend/entities/resource_tag_entity.py b/backend/entities/resource_tag_entity.py index f1de522..e6d863b 100644 --- a/backend/entities/resource_tag_entity.py +++ b/backend/entities/resource_tag_entity.py @@ -19,7 +19,7 @@ from typing import Self class ResourceTagEntity(EntityBase): # set table name to user in the database - __tablename__ = "resourceTag" + __tablename__ = "resource_tag" # set fields or 'columns' for the user table id: Mapped[int] = mapped_column(Integer, primary_key=True, autoincrement=True) diff --git a/backend/entities/sample_entity.py b/backend/entities/sample_entity.py deleted file mode 100644 index 5372899..0000000 --- a/backend/entities/sample_entity.py +++ /dev/null @@ -1,12 +0,0 @@ -from sqlalchemy import create_engine, Column, Integer, String -from sqlalchemy.orm import Mapped, mapped_column, relationship -from .entity_base import EntityBase - - -class SampleEntity(EntityBase): - __tablename__ = "persons" - - id: Mapped[int] = mapped_column(Integer, primary_key=True, autoincrement=True) - name: Mapped[str] = mapped_column(String, nullable=False) - age: Mapped[int] = mapped_column(Integer) - email: Mapped[str] = mapped_column(String, unique=True, nullable=False) diff --git a/backend/entities/service_entity.py b/backend/entities/service_entity.py index e927be7..b6f999a 100644 --- a/backend/entities/service_entity.py +++ b/backend/entities/service_entity.py @@ -13,18 +13,10 @@ from .entity_base import EntityBase from datetime import datetime # Import enums for Program -import enum +from .program_enum import Program_Enum from sqlalchemy import Enum -class ProgramEnum(enum.Enum): - """Determine program for Service""" - - DOMESTIC = "DOMESTIC" - ECONOMIC = "ECONOMIC" - COMMUNITY = "COMMUNITY" - - class ServiceEntity(EntityBase): # set table name @@ -36,7 +28,7 @@ class ServiceEntity(EntityBase): name: Mapped[str] = mapped_column(String(32), nullable=False) summary: Mapped[str] = mapped_column(String(100), nullable=False) requirements: Mapped[list[str]] = mapped_column(ARRAY(String)) - program: Mapped[ProgramEnum] = mapped_column(Enum(ProgramEnum), nullable=False) + program: Mapped[Program_Enum] = mapped_column(Enum(Program_Enum), nullable=False) # relationships serviceTags: Mapped[list["ServiceTagEntity"]] = relationship( diff --git a/backend/entities/service_tag_entity.py b/backend/entities/service_tag_entity.py index b04d2d4..0f05738 100644 --- a/backend/entities/service_tag_entity.py +++ b/backend/entities/service_tag_entity.py @@ -13,7 +13,7 @@ from .entity_base import EntityBase class ServiceTagEntity(EntityBase): # set table name to user in the database - __tablename__ = "serviceTag" + __tablename__ = "service_tag" # set fields or 'columns' for the user table id: Mapped[int] = mapped_column(Integer, primary_key=True, autoincrement=True) diff --git a/backend/entities/user_entity.py b/backend/entities/user_entity.py index 435023c..ebc7a87 100644 --- a/backend/entities/user_entity.py +++ b/backend/entities/user_entity.py @@ -1,26 +1,22 @@ """ Defines the table for storing users """ # Import our mapped SQL types from SQLAlchemy -from sqlalchemy import Integer, String, DateTime, ARRAY - +from sqlalchemy import Integer, String, DateTime, ARRAY, Enum # Import mapping capabilities from the SQLAlchemy ORM from sqlalchemy.orm import Mapped, mapped_column - # Import the EntityBase that we are extending from .entity_base import EntityBase - # Import datetime for created_at type from datetime import datetime - # Import enums for Role and Program -from .program_enum import ProgramEnum -from .user_enum import RoleEnum +from .program_enum import Program_Enum +from .user_enum import Role_Enum -#Import models for User methods +# Import models for User methods from ..models.user_model import User from typing import Self @@ -35,14 +31,17 @@ class UserEntity(EntityBase): # set fields or 'columns' for the user table id: Mapped[int] = mapped_column(Integer, primary_key=True, autoincrement=True) created_at: Mapped[datetime] = mapped_column(DateTime, default=datetime.now) - username: Mapped[str] = mapped_column(String(32), nullable=False, default="", unique=True ) - role: Mapped[RoleEnum] = mapped_column(String, nullable=False) + username: Mapped[str] = mapped_column( + String(32), nullable=False, default="", unique=True + ) + role: Mapped[Role_Enum] = mapped_column(Enum(Role_Enum), nullable=False) email: Mapped[str] = mapped_column(String(50), nullable=False, unique=True) - program: Mapped[list[str]] = mapped_column(ARRAY(String), nullable=False) + program: Mapped[list[Program_Enum]] = mapped_column( + ARRAY(Enum(Program_Enum)), nullable=False + ) experience: Mapped[int] = mapped_column(Integer, nullable=False) group: Mapped[str] = mapped_column(String(50)) - @classmethod def from_model(cls, model: User) -> Self: """ @@ -58,32 +57,30 @@ class UserEntity(EntityBase): id=model.id, created_at=model.created_at, username=model.username, - role=model.usertype, + role=model.role, email=model.email, - program=model.programtype, + program=model.program, experience=model.experience, - group=model.group, + group=model.group, ) def to_model(self) -> User: """ - + Create a user model from entity Returns: User: A User model for API usage - """ - + """ return User( id=self.id, username=self.username, - email= self.email , - experience= self.experience, - group= self.group, - programtype= self.program, - usertype= self.role, - created_at= self.created_at, + email=self.email, + experience=self.experience, + group=self.group, + program=self.program, + role=self.role, + created_at=self.created_at, ) - diff --git a/backend/entities/user_enum.py b/backend/entities/user_enum.py index 18f034f..af5aba6 100644 --- a/backend/entities/user_enum.py +++ b/backend/entities/user_enum.py @@ -1,12 +1,9 @@ -from sqlalchemy import Enum +from enum import Enum -class RoleEnum(Enum): +class Role_Enum(Enum): """Determine role for User""" - ADMIN = 'ADMIN' - EMPLOYEE = 'EMPLOYEE' - VOLUNTEER = 'VOLUNTEER' - - def __init__(self): - super().__init__(name="role_enum") + ADMIN = "ADMIN" + EMPLOYEE = "EMPLOYEE" + VOLUNTEER = "VOLUNTEER" diff --git a/backend/models/enum_for_models.py b/backend/models/enum_for_models.py index 409e37d..ce2eb30 100644 --- a/backend/models/enum_for_models.py +++ b/backend/models/enum_for_models.py @@ -1,17 +1,13 @@ -from pydantic import BaseModel, Field from enum import Enum -from typing import List -from datetime import datetime -from typing import Optional class ProgramTypeEnum(str, Enum): - DOMESTIC = 'DOMESTIC' - ECONOMIC = 'ECONOMIC' - COMMUNITY = 'COMMUNITY' + DOMESTIC = "DOMESTIC" + ECONOMIC = "ECONOMIC" + COMMUNITY = "COMMUNITY" class UserTypeEnum(str, Enum): - ADMIN = 'ADMIN' - EMPLOYEE = 'EMPLOYEE' - VOLUNTEER = 'VOLUNTEER' + ADMIN = "ADMIN" + EMPLOYEE = "EMPLOYEE" + VOLUNTEER = "VOLUNTEER" diff --git a/backend/models/user_model.py b/backend/models/user_model.py index 2f227c2..1ba4e18 100644 --- a/backend/models/user_model.py +++ b/backend/models/user_model.py @@ -12,6 +12,6 @@ class User(BaseModel): email: str = Field(..., description="The e-mail of the user") experience: int = Field(..., description="Years of Experience of the User") group: str - programtype: List[str] - usertype: str + program: List[ProgramTypeEnum] + role: UserTypeEnum created_at: Optional[datetime] diff --git a/backend/script/create_database.py b/backend/script/create_database.py index f969f0b..54babaf 100644 --- a/backend/script/create_database.py +++ b/backend/script/create_database.py @@ -6,9 +6,7 @@ engine = create_engine(_engine_str(database=""), echo=True) """Application-level SQLAlchemy database engine.""" with engine.connect() as connection: - connection.execute( - text("COMMIT") - ) + connection.execute(text("COMMIT")) database = getenv("POSTGRES_DATABASE") stmt = text(f"CREATE DATABASE {database}") - connection.execute(stmt) \ No newline at end of file + connection.execute(stmt) diff --git a/backend/script/delete_database.py b/backend/script/delete_database.py index 513aec4..707c63a 100644 --- a/backend/script/delete_database.py +++ b/backend/script/delete_database.py @@ -6,9 +6,7 @@ engine = create_engine(_engine_str(database=""), echo=True) """Application-level SQLAlchemy database engine.""" with engine.connect() as connection: - connection.execute( - text("COMMIT") - ) + connection.execute(text("COMMIT")) database = getenv("POSTGRES_DATABASE") stmt = text(f"DROP DATABASE IF EXISTS {database}") - connection.execute(stmt) \ No newline at end of file + connection.execute(stmt) diff --git a/backend/services/user.py b/backend/services/user.py index 87baab5..8e0b541 100644 --- a/backend/services/user.py +++ b/backend/services/user.py @@ -11,8 +11,7 @@ class UserService: def __init__(self, session: Session = Depends(db_session)): self._session = session - - def get_user_by_id(self, id: int) -> User: + def get_user_by_id(self, id: int) -> User: """ Gets a user by id from the database @@ -23,36 +22,31 @@ class UserService: user_entity: UserEntity | None = self._session.scalar(query) if user_entity is None: - raise Exception( - f"No user found with matching id: {id}" - ) + raise Exception(f"No user found with matching id: {id}") return user_entity.to_model() - def all(self) -> list[User]: """ Returns a list of all Users """ - query = select(UserEntity) + query = select(UserEntity) entities = self._session.scalars(query).all() return [entity.to_model() for entity in entities] - - def create(self, user: User) -> User: - + def create(self, user: User) -> User: """ Creates a new User Entity and adds to database Args: User model Returns: User model - + """ try: - user_entity = self.get_user_by_id(user.id) + user = self.get_user_by_id(user.id) except: # if does not exist, create new object user_entity = UserEntity.from_model(user) @@ -62,5 +56,4 @@ class UserService: self._session.commit() finally: # return added object - return user_entity.to_model() - + return user diff --git a/backend/test/conftest.py b/backend/test/conftest.py index 679a00b..777b219 100644 --- a/backend/test/conftest.py +++ b/backend/test/conftest.py @@ -13,6 +13,7 @@ from .. import entities POSTGRES_DATABASE = f'{getenv("POSTGRES_DATABASE")}_test' POSTGRES_USER = getenv("POSTGRES_USER") + def reset_database(): engine = create_engine(_engine_str(database="")) with engine.connect() as connection: @@ -50,9 +51,10 @@ def session(test_engine: Engine): finally: session.close() + @pytest.fixture(autouse=True) def setup_insert_data_fixture(session: Session): user_test_data.insert_fake_data(session) tag_test_data.insert_fake_data(session) session.commit() - yield + yield diff --git a/backend/test/services/user_test.py b/backend/test/services/user_test.py index 337ee5f..34795a5 100644 --- a/backend/test/services/user_test.py +++ b/backend/test/services/user_test.py @@ -13,13 +13,16 @@ from . import user_test_data def test_create(user_svc: UserService): """Test creating a user""" - user1 = user_svc.create(newUser) + user1 = user_svc.create(admin) + + print(user1) assert user1 is not None assert user1.id is not None -def test_create_id_exists(user_svc: UserService): + +def test_create_id_exists(user_svc: UserService): """Test creating a user with id conflict""" - user1 = user_svc.create(volunteer) + user1 = user_svc.create(volunteer) assert user1 is not None assert user1.id is not None @@ -29,19 +32,15 @@ def test_get_all(user_svc: UserService): users = user_svc.all() assert len(users) == 3 + def test_get_user_by_id(user_svc: UserService): """Test getting a user by an id""" user = user_svc.get_user_by_id(volunteer.id) assert user is not None assert user.id is not None + def test_get_user_by_id_nonexistent(user_svc: UserService): """Test getting a user by id that does not exist""" with pytest.raises(Exception): user_svc.get_by_id(5) - - - - - - \ No newline at end of file diff --git a/backend/test/services/user_test_data.py b/backend/test/services/user_test_data.py index 119375e..e050bda 100644 --- a/backend/test/services/user_test_data.py +++ b/backend/test/services/user_test_data.py @@ -17,9 +17,9 @@ volunteer = User( email="volunteer@compass.com", experience=1, group="volunteers", - programtype=[programs.COMMUNITY.value], + program=[programs.COMMUNITY], created_at=datetime.now(), - usertype=UserTypeEnum.VOLUNTEER.value + role=UserTypeEnum.VOLUNTEER, ) employee = User( @@ -28,9 +28,9 @@ employee = User( email="employee@compass.com", experience=5, group="employees", - programtype=[programs.DOMESTIC.value, programs.ECONOMIC.value], + program=[programs.DOMESTIC, programs.ECONOMIC], created_at=datetime.now(), - usertype=roles.EMPLOYEE.value, + role=roles.EMPLOYEE, ) admin = User( @@ -39,9 +39,13 @@ admin = User( email="admin@compass.com", experience=10, group="admin", - programtype=[programs.ECONOMIC.value, programs.DOMESTIC.value, programs.COMMUNITY.value], + program=[ + programs.ECONOMIC, + programs.DOMESTIC, + programs.COMMUNITY, + ], created_at=datetime.now(), - usertype=roles.ADMIN.value, + role=roles.ADMIN, ) newUser = User( @@ -50,9 +54,9 @@ newUser = User( email="new@compass.com", experience=1, group="volunteer", - programtype=[programs.ECONOMIC.value], + program=[programs.ECONOMIC], created_at=datetime.now(), - usertype=roles.VOLUNTEER.value + role=roles.VOLUNTEER, ) users = [volunteer, employee, admin] @@ -109,6 +113,6 @@ def fake_data_fixture(session: Session): Note: This function runs automatically due to the fixture property `autouse=True`. """ - insert_fake_data(session) + # insert_fake_data(session) session.commit() yield