diff --git a/src/controllers/__init__.py b/src/controllers/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/src/controllers/user_creator.py b/src/controllers/user_creator.py new file mode 100644 index 0000000..d6cddeb --- /dev/null +++ b/src/controllers/user_creator.py @@ -0,0 +1,28 @@ +from src.models.repositories.interfaces.users_repository import UsersRepositoryInterface + +class UserCreator: + def __init__(self, users_repository: UsersRepositoryInterface): # Inverção da dependência - D SOLID + self.__users_repo = users_repository + + def insert_new_user(self, name: str, age: int, height: float) -> dict: + self.__check_if_user_exists(name) + self.__create_new_user(name, age, height) + return self.__format_response() + + def __check_if_user_exists(self, name: str) -> None: + select_users = self.__users_repo.select_user(name) + if (not select_users or len(select_users) == 0): + return + + raise Exception("User is not registered!") + + def __create_new_user(self, name: str, age: int, height: float) -> None: + #Others Activates necessary (optional) + self.__users_repo.insert_user(name, age, height) + + def __format_response(self) -> dict: + return { + "type": "Users", + "count": 1, + "message": "User is not registered!" + } \ No newline at end of file diff --git a/src/controllers/user_creator_test.py b/src/controllers/user_creator_test.py new file mode 100644 index 0000000..c04b6fa --- /dev/null +++ b/src/controllers/user_creator_test.py @@ -0,0 +1,49 @@ +import pytest +from src.controllers.user_creator import UserCreator + +class UserRepositoryMock: + def __init__(self): + self.select_user_att = {} + self.insert_user_att = {} + + def select_user(self, name: str) -> list: + self.select_user_att["name"] = name + return [] + + def insert_user(self, name: str, age: int, height: float) -> None: + self.insert_user_att["name"] = name + self.insert_user_att["age"] = age + self.insert_user_att["height"] = height + + +class UserRepositoryMockWithError: + def __init__(self): + self.select_user_att = {} + + def select_user(self, name: str) -> list: + self.select_user_att["name"] = name + return [1, 2, 3] + +def test_insert_new_user(): + user_repository = UserRepositoryMock() + user_creator = UserCreator(user_repository) + + name = "My name" + age = 42 + height = 1.80 + + response = user_creator.insert_new_user(name, age, height) + + assert isinstance(response, dict) + assert "type" in response + assert response["count"] == 1 + assert response["message"] == "User is not registered!" + +def test_insert_new_user_with_error(): + user_repository = UserRepositoryMockWithError() + user_creator = UserCreator(user_repository) + + with pytest.raises(Exception) as exc_info: + user_creator.insert_new_user("something", 42, 1.11) + assert str(exc_info.value) == "User is not registered!" + \ No newline at end of file diff --git a/src/controllers/user_finder.py b/src/controllers/user_finder.py new file mode 100644 index 0000000..4d0a9cd --- /dev/null +++ b/src/controllers/user_finder.py @@ -0,0 +1,32 @@ +from src.models.repositories.interfaces.users_repository import UsersRepositoryInterface + +class UserFinder: + def __init__(self, users_repository: UsersRepositoryInterface): + self.__users_repo = users_repository + + def find_by_name(self, name:str) -> dict: + select_users = self.__select_and_validate_user(name) + return self.__format_response(select_users) + def __select_and_validate_user(self, name: str) -> list: + select_users = self.__users_repo.select_user(name) + if (not select_users or len(select_users) == 0): + raise Exception("User is not registered!") + + return select_users + + def __format_response(self, select_users: list) -> dict: + formatted_users = [] + for user in select_users: + formatted_users.append({ + "id": user.id, + "name": user.name, + "age": user.age, + "height": user.height + }) + + return { + "type": "Users", + "count": len(formatted_users), + "attributes": formatted_users + } + \ No newline at end of file diff --git a/src/controllers/user_finder_test.py b/src/controllers/user_finder_test.py new file mode 100644 index 0000000..facce41 --- /dev/null +++ b/src/controllers/user_finder_test.py @@ -0,0 +1,51 @@ +import pytest +from src.models.entities.users import Users +from .user_finder import UserFinder + +class UserRepositoryMock: + def __init__(self): + self.select_user_att = {} + + def select_user(self, name: str) -> list: + self.select_user_att["name"] = name + return [ + Users( + id=123, + name="tatu", + age=42, + height=3.20 + ) + ] + +class UserRepositoryMockWithError: + def __init__(self): + self.select_user_att = {} + + def select_user(self, name: str) -> list: + self.select_user_att["name"] = name + return[] + +def test_find_by_name(): + name = "my_papa_name" + user_repo = UserRepositoryMock() + user_finder = UserFinder(user_repo) + + response = user_finder.find_by_name(name) + print(response) + print(user_repo.select_user_att) + + assert user_repo.select_user_att["name"] == name + assert isinstance(response, dict) + assert response["type"] == "Users" + assert "attributes" in response + assert isinstance(response["attributes"], list) + +def test_find_by_name_with_error(): + user_repo = UserRepositoryMockWithError() + user_finder = UserFinder(user_repo) + + with pytest.raises(Exception) as exc_info: + user_finder.find_by_name("something") + + assert str(exc_info.value) == "User is not registered!" + \ No newline at end of file diff --git a/src/models/repositories/interfaces/__init__.py b/src/models/repositories/interfaces/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/src/models/repositories/interfaces/users_repository.py b/src/models/repositories/interfaces/users_repository.py new file mode 100644 index 0000000..7ef6e84 --- /dev/null +++ b/src/models/repositories/interfaces/users_repository.py @@ -0,0 +1,12 @@ +from abc import ABC, abstractmethod +from src.models.entities.users import Users + +class UsersRepositoryInterface: + + @abstractmethod + def insert_user(self, name: str, age: int, height: float) -> None: + pass + @abstractmethod + def select_user(self, name: str) -> list[Users]: + pass + \ No newline at end of file diff --git a/src/models/repositories/users_repository.py b/src/models/repositories/users_repository.py index 1e97646..f18bcf8 100644 --- a/src/models/repositories/users_repository.py +++ b/src/models/repositories/users_repository.py @@ -1,6 +1,8 @@ from src.models.connection.db_connection_handler import DbConnectionHandler from src.models.entities.users import Users -class UsersRepository: +from .interfaces.users_repository import UsersRepositoryInterface + +class UsersRepository(UsersRepositoryInterface): def __init__(self, db_conn_handler: DbConnectionHandler): self.__db_conn_handler = db_conn_handler