From ec8b65d0d6d1a5e9d352531226fd0319b7c56c99 Mon Sep 17 00:00:00 2001 From: lucaspaiva-lp Date: Sat, 31 Jan 2026 08:33:20 -0300 Subject: [PATCH 1/3] feat: Implementing Users Interfaces with D-SOLID --- src/controllers/__init__.py | 0 src/controllers/user_creator.py | 5 +++++ src/models/repositories/interfaces/__init__.py | 0 .../repositories/interfaces/users_repository.py | 12 ++++++++++++ src/models/repositories/users_repository.py | 4 +++- 5 files changed, 20 insertions(+), 1 deletion(-) create mode 100644 src/controllers/__init__.py create mode 100644 src/controllers/user_creator.py create mode 100644 src/models/repositories/interfaces/__init__.py create mode 100644 src/models/repositories/interfaces/users_repository.py 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..2c7387a --- /dev/null +++ b/src/controllers/user_creator.py @@ -0,0 +1,5 @@ +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 \ 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 From a30c0b4f894ee1dd380becb972d1882129ac6a0a Mon Sep 17 00:00:00 2001 From: lucaspaiva-lp Date: Sat, 31 Jan 2026 09:11:06 -0300 Subject: [PATCH 2/3] feat: implementing user creator with test (incomplete) --- src/controllers/user_creator.py | 25 ++++++++++++++++++++- src/controllers/user_creator_test.py | 33 ++++++++++++++++++++++++++++ 2 files changed, 57 insertions(+), 1 deletion(-) create mode 100644 src/controllers/user_creator_test.py diff --git a/src/controllers/user_creator.py b/src/controllers/user_creator.py index 2c7387a..51bf41d 100644 --- a/src/controllers/user_creator.py +++ b/src/controllers/user_creator.py @@ -2,4 +2,27 @@ class UserCreator: def __init__(self, users_repository: UsersRepositoryInterface): # Inverção da dependência - D SOLID - self._users_repo = users_repository \ No newline at end of file + 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("Signed User!") + + 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": "Signed user!" + } \ 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..1810ec1 --- /dev/null +++ b/src/controllers/user_creator_test.py @@ -0,0 +1,33 @@ +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: + return [self.insert_user_att] if self.insert_user_att else [] + + 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 + return + +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) + + users = user_repository.select_user(name) + assert users[0]["name"] == name + + assert isinstance(response, dict) + assert "type" in response + assert response["count"] == 1 + assert response["message"] == "Signed user!" From 985e77e968d081654c75b79c4a68058f45ac371e Mon Sep 17 00:00:00 2001 From: lucaspaiva-lp Date: Sat, 31 Jan 2026 10:08:31 -0300 Subject: [PATCH 3/3] feat: implemeting user finder tests --- src/controllers/user_creator.py | 4 +-- src/controllers/user_creator_test.py | 28 +++++++++++---- src/controllers/user_finder.py | 32 +++++++++++++++++ src/controllers/user_finder_test.py | 51 ++++++++++++++++++++++++++++ 4 files changed, 107 insertions(+), 8 deletions(-) create mode 100644 src/controllers/user_finder.py create mode 100644 src/controllers/user_finder_test.py diff --git a/src/controllers/user_creator.py b/src/controllers/user_creator.py index 51bf41d..d6cddeb 100644 --- a/src/controllers/user_creator.py +++ b/src/controllers/user_creator.py @@ -14,7 +14,7 @@ def __check_if_user_exists(self, name: str) -> None: if (not select_users or len(select_users) == 0): return - raise Exception("Signed User!") + raise Exception("User is not registered!") def __create_new_user(self, name: str, age: int, height: float) -> None: #Others Activates necessary (optional) @@ -24,5 +24,5 @@ def __format_response(self) -> dict: return { "type": "Users", "count": 1, - "message": "Signed user!" + "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 index 1810ec1..c04b6fa 100644 --- a/src/controllers/user_creator_test.py +++ b/src/controllers/user_creator_test.py @@ -1,3 +1,4 @@ +import pytest from src.controllers.user_creator import UserCreator class UserRepositoryMock: @@ -6,14 +7,23 @@ def __init__(self): self.insert_user_att = {} def select_user(self, name: str) -> list: - return [self.insert_user_att] if self.insert_user_att else [] + 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 - return + +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) @@ -24,10 +34,16 @@ def test_insert_new_user(): response = user_creator.insert_new_user(name, age, height) - users = user_repository.select_user(name) - assert users[0]["name"] == name - assert isinstance(response, dict) assert "type" in response assert response["count"] == 1 - assert response["message"] == "Signed user!" + 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