From 2947a46c4d65d9df297e1325b5cd67d493e5afcc Mon Sep 17 00:00:00 2001 From: Babouche Date: Mon, 19 May 2025 11:49:01 -0400 Subject: [PATCH 01/12] Register & unregistered --- dev-requirements.txt | 1 + tests/application/test_student_service.py | 114 ++++++++++++++++++++++ 2 files changed, 115 insertions(+) create mode 100644 tests/application/test_student_service.py diff --git a/dev-requirements.txt b/dev-requirements.txt index f10990f..a1fb408 100644 --- a/dev-requirements.txt +++ b/dev-requirements.txt @@ -3,3 +3,4 @@ black==24.4.2 ruff==0.4.10 pytest==8.3.5 +pytest-async==1.0.0a1 diff --git a/tests/application/test_student_service.py b/tests/application/test_student_service.py new file mode 100644 index 0000000..3dc58d5 --- /dev/null +++ b/tests/application/test_student_service.py @@ -0,0 +1,114 @@ +import pytest + +from unittest.mock import MagicMock, AsyncMock, patch + +from bot.application.student.student_service import StudentService +from bot.config.logger.logger import Logger +from bot.config.service_locator import ServiceLocator +from bot.domain.student.attribut.discord_user_id import DiscordUserId +from bot.domain.student.attribut.firstname import Firstname +from bot.domain.student.attribut.lastname import Lastname +from bot.domain.student.attribut.ni import NI +from bot.domain.student.attribut.program_code import ProgramCode +from bot.domain.student.student import Student +from bot.domain.student.student_repository import StudentRepository +from bot.resource.cog.registration.request.register_student_request import ( + RegisterStudentRequest, +) +from bot.resource.cog.registration.request.unregister_student_request import ( + UnregisterStudentRequest, +) + +A_STUDENT_FIRSTNAME: Firstname = Firstname(value="Jack") +A_STUDENT_LASTNAME = Lastname(value="Black") + +A_NI: str = "123456789" +A_DISCORD_ID: int = 123456789012749572 +AN_INVALID_DISCORD_ID: int = -1 + +UNREGISTERED_STUDENT: Student = Student( + NI(value=int(A_NI)), + A_STUDENT_FIRSTNAME, + A_STUDENT_LASTNAME, + ProgramCode(value="GLO"), + DiscordUserId(value=AN_INVALID_DISCORD_ID), +) + +REGISTERED_STUDENT: Student = Student( + NI(value=int(A_NI)), + A_STUDENT_FIRSTNAME, + A_STUDENT_LASTNAME, + ProgramCode(value="GLO"), + DiscordUserId(value=A_DISCORD_ID), +) + + +@pytest.fixture +def setup_and_teardown_dependencies(): + yield + + ServiceLocator.clear() + + +@pytest.mark.asyncio +async def test__given_unregistered_student__when_register_student__then_student_is_registered( + setup_and_teardown_dependencies, +): + logger_mock = MagicMock(spec=Logger) + ServiceLocator.register_dependency(Logger, logger_mock) + + student_repository = MagicMock(spec=StudentRepository) + student_repository.find_student_by_ni.return_value = UNREGISTERED_STUDENT + student_repository.find_students_by_discord_user_id.return_value = [] + student_repository.register_student = MagicMock() + + student_service: StudentService = StudentService(student_repository) + student_service.notify_on_student_registered = AsyncMock() + + register_request: RegisterStudentRequest = RegisterStudentRequest( + A_NI, A_DISCORD_ID + ) + + await student_service.register_student(register_request) + + excepted_ni: NI = NI(value=int(A_NI)) + excepted_discord_user_id: DiscordUserId = DiscordUserId(value=A_DISCORD_ID) + + student_repository.register_student.assert_called_with( + excepted_ni, excepted_discord_user_id + ) + student_service.notify_on_student_registered.assert_awaited_once_with(excepted_ni) + + +@pytest.mark.asyncio +async def test__given_registered_student__when_unregister_student__then_student_is_unregistered( + setup_and_teardown_dependencies, +): + logger_mock = MagicMock(spec=Logger) + ServiceLocator.register_dependency(Logger, logger_mock) + + student_repository = MagicMock(spec=StudentRepository) + student_repository.find_student_by_discord_user_id.return_value = REGISTERED_STUDENT + student_repository.find_students_by_discord_user_id.return_value = [ + REGISTERED_STUDENT + ] + student_repository.unregister_student = MagicMock() + + student_service: StudentService = StudentService(student_repository) + student_service.notify_on_student_unregistered = AsyncMock() + + request: UnregisterStudentRequest = UnregisterStudentRequest(A_DISCORD_ID) + + with patch( + "bot.domain.utility.Utility.does_user_exist_on_server" + ) as mock_does_user_exist_on_server: + mock_does_user_exist_on_server.return_value = True + + await student_service.unregister_student(request) + + student_repository.unregister_student.assert_called_with( + NI(value=int(A_NI)), DiscordUserId(value=AN_INVALID_DISCORD_ID) + ) + student_service.notify_on_student_unregistered.assert_awaited_once_with( + DiscordUserId(value=A_DISCORD_ID) + ) From 8e8806d72bcac75a84208508df8eddd1bcc79b4f Mon Sep 17 00:00:00 2001 From: Babouche Date: Mon, 19 May 2025 11:58:13 -0400 Subject: [PATCH 02/12] remove_member --- tests/application/test_student_service.py | 26 +++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/tests/application/test_student_service.py b/tests/application/test_student_service.py index 3dc58d5..d7af743 100644 --- a/tests/application/test_student_service.py +++ b/tests/application/test_student_service.py @@ -2,6 +2,8 @@ from unittest.mock import MagicMock, AsyncMock, patch +from discord import Member + from bot.application.student.student_service import StudentService from bot.config.logger.logger import Logger from bot.config.service_locator import ServiceLocator @@ -112,3 +114,27 @@ async def test__given_registered_student__when_unregister_student__then_student_ student_service.notify_on_student_unregistered.assert_awaited_once_with( DiscordUserId(value=A_DISCORD_ID) ) + + +@pytest.mark.asyncio +async def test__given__member__when_remove_member__then_member_is_removed( + setup_and_teardown_dependencies, +): + logger_mock = MagicMock(spec=Logger) + ServiceLocator.register_dependency(Logger, logger_mock) + + student_repository = MagicMock(spec=StudentRepository) + student_repository.unregister_student = MagicMock() + + student_service: StudentService = StudentService(student_repository) + student_service.notify_on_member_removed = AsyncMock() + + member = MagicMock(spec=Member) + member.id.return_value = A_DISCORD_ID + + await student_service.remove_member(member) + + student_repository.unregister_student( + NI(value=int(A_NI)), DiscordUserId(value=AN_INVALID_DISCORD_ID) + ) + student_service.notify_on_member_removed.assert_awaited_once_with(member) From 78b71400188d534702b48659a62068dd611bd066 Mon Sep 17 00:00:00 2001 From: Babouche Date: Mon, 19 May 2025 12:09:01 -0400 Subject: [PATCH 03/12] force_register_user --- tests/application/test_student_service.py | 37 ++++++++++++++++++++++- 1 file changed, 36 insertions(+), 1 deletion(-) diff --git a/tests/application/test_student_service.py b/tests/application/test_student_service.py index d7af743..65fd79e 100644 --- a/tests/application/test_student_service.py +++ b/tests/application/test_student_service.py @@ -14,6 +14,9 @@ from bot.domain.student.attribut.program_code import ProgramCode from bot.domain.student.student import Student from bot.domain.student.student_repository import StudentRepository +from bot.resource.cog.registration.request.force_register_student_request import ( + ForceRegisterStudentRequest, +) from bot.resource.cog.registration.request.register_student_request import ( RegisterStudentRequest, ) @@ -117,7 +120,39 @@ async def test__given_registered_student__when_unregister_student__then_student_ @pytest.mark.asyncio -async def test__given__member__when_remove_member__then_member_is_removed( +async def test__given_unregistered_student__when_force_register_student__then_student_is_registered( + setup_and_teardown_dependencies, +): + logger_mock = MagicMock(spec=Logger) + ServiceLocator.register_dependency(Logger, logger_mock) + + student_repository = MagicMock(spec=StudentRepository) + student_repository.find_student_by_ni.return_value = UNREGISTERED_STUDENT + student_repository.find_students_by_discord_user_id.return_value = [] + student_repository.register_student = MagicMock() + + student_service: StudentService = StudentService(student_repository) + student_service.notify_on_student_registered = AsyncMock() + + request: ForceRegisterStudentRequest = ForceRegisterStudentRequest( + A_NI, A_DISCORD_ID + ) + + with patch( + "bot.domain.utility.Utility.does_user_exist_on_server" + ) as mock_does_user_exist_on_server: + mock_does_user_exist_on_server.return_value = True + + await student_service.force_register_student(request) + + student_repository.register_student.assert_called_with( + NI(value=int(A_NI)), DiscordUserId(value=A_DISCORD_ID) + ) + student_service.notify_on_student_registered(NI(value=int(A_NI))) + + +@pytest.mark.asyncio +async def test__given__discord_member__when_remove_member__then_member_is_removed( setup_and_teardown_dependencies, ): logger_mock = MagicMock(spec=Logger) From 0acefbc420f9910ade7231f3fab1e88d116bba72 Mon Sep 17 00:00:00 2001 From: Babouche Date: Mon, 19 May 2025 13:51:42 -0400 Subject: [PATCH 04/12] force_unregister --- tests/application/test_student_service.py | 61 +++++++++++++++++------ 1 file changed, 47 insertions(+), 14 deletions(-) diff --git a/tests/application/test_student_service.py b/tests/application/test_student_service.py index 65fd79e..cc9630b 100644 --- a/tests/application/test_student_service.py +++ b/tests/application/test_student_service.py @@ -17,6 +17,9 @@ from bot.resource.cog.registration.request.force_register_student_request import ( ForceRegisterStudentRequest, ) +from bot.resource.cog.registration.request.force_unregister_student_request import ( + ForceUnregisterStudentRequest, +) from bot.resource.cog.registration.request.register_student_request import ( RegisterStudentRequest, ) @@ -85,6 +88,38 @@ async def test__given_unregistered_student__when_register_student__then_student_ student_service.notify_on_student_registered.assert_awaited_once_with(excepted_ni) +@pytest.mark.asyncio +async def test__given_unregistered_student__when_force_register_student__then_student_is_registered( + setup_and_teardown_dependencies, +): + logger_mock = MagicMock(spec=Logger) + ServiceLocator.register_dependency(Logger, logger_mock) + + student_repository = MagicMock(spec=StudentRepository) + student_repository.find_student_by_ni.return_value = UNREGISTERED_STUDENT + student_repository.find_students_by_discord_user_id.return_value = [] + student_repository.register_student = MagicMock() + + student_service: StudentService = StudentService(student_repository) + student_service.notify_on_student_registered = AsyncMock() + + request: ForceRegisterStudentRequest = ForceRegisterStudentRequest( + A_NI, A_DISCORD_ID + ) + + with patch( + "bot.domain.utility.Utility.does_user_exist_on_server" + ) as mock_does_user_exist_on_server: + mock_does_user_exist_on_server.return_value = True + + await student_service.force_register_student(request) + + student_repository.register_student.assert_called_with( + NI(value=int(A_NI)), DiscordUserId(value=A_DISCORD_ID) + ) + student_service.notify_on_student_registered(NI(value=int(A_NI))) + + @pytest.mark.asyncio async def test__given_registered_student__when_unregister_student__then_student_is_unregistered( setup_and_teardown_dependencies, @@ -120,35 +155,33 @@ async def test__given_registered_student__when_unregister_student__then_student_ @pytest.mark.asyncio -async def test__given_unregistered_student__when_force_register_student__then_student_is_registered( +async def test__given__registered_student__when_force_unregister_student__then_student_is_unregistered( setup_and_teardown_dependencies, ): logger_mock = MagicMock(spec=Logger) ServiceLocator.register_dependency(Logger, logger_mock) student_repository = MagicMock(spec=StudentRepository) - student_repository.find_student_by_ni.return_value = UNREGISTERED_STUDENT - student_repository.find_students_by_discord_user_id.return_value = [] - student_repository.register_student = MagicMock() + student_repository.find_student_by_ni.return_value = REGISTERED_STUDENT + student_repository.unregister_student = MagicMock() student_service: StudentService = StudentService(student_repository) - student_service.notify_on_student_registered = AsyncMock() + student_service.notify_on_student_unregistered = AsyncMock() - request: ForceRegisterStudentRequest = ForceRegisterStudentRequest( - A_NI, A_DISCORD_ID - ) + request: ForceUnregisterStudentRequest = ForceUnregisterStudentRequest(A_NI) + + await student_service.force_unregister_student(request) with patch( "bot.domain.utility.Utility.does_user_exist_on_server" ) as mock_does_user_exist_on_server: mock_does_user_exist_on_server.return_value = True - - await student_service.force_register_student(request) - - student_repository.register_student.assert_called_with( - NI(value=int(A_NI)), DiscordUserId(value=A_DISCORD_ID) + student_repository.unregister_student.assert_called_with( + NI(value=int(A_NI)), DiscordUserId(value=AN_INVALID_DISCORD_ID) + ) + student_service.notify_on_student_unregistered.assert_awaited_once_with( + DiscordUserId(value=A_DISCORD_ID) ) - student_service.notify_on_student_registered(NI(value=int(A_NI))) @pytest.mark.asyncio From 118ea0b0fa7dfd2f75d8c443bf828429e6058e4b Mon Sep 17 00:00:00 2001 From: Babouche Date: Mon, 19 May 2025 14:33:24 -0400 Subject: [PATCH 05/12] Add InMemoryStudentRepository --- .../student/in_memory_student_repository.py | 100 ++++++++++++++++++ 1 file changed, 100 insertions(+) create mode 100644 bot/infra/student/in_memory_student_repository.py diff --git a/bot/infra/student/in_memory_student_repository.py b/bot/infra/student/in_memory_student_repository.py new file mode 100644 index 0000000..e3d4578 --- /dev/null +++ b/bot/infra/student/in_memory_student_repository.py @@ -0,0 +1,100 @@ +from typing import List + +from bot.config.logger.logger import Logger +from bot.config.service_locator import ServiceLocator +from bot.domain.student.attribut.discord_user_id import DiscordUserId +from bot.domain.student.attribut.ni import NI +from bot.domain.student.student import Student +from bot.domain.student.student_repository import StudentRepository +from bot.infra.student.assembler.student_assembler import StudentAssembler +from bot.infra.student.exception.cannot_add_student_exception import ( + CannotAddStudentException, +) +from bot.infra.student.exception.cannot_unregister_student_exception import ( + CannotUnregisterStudentException, +) +from bot.infra.student.exception.cannot_update_student_exception import ( + CannotUpdateStudentException, +) +from bot.infra.student.exception.student_not_found_exception import ( + StudentNotFoundException, +) +from bot.infra.student.exception.cannot_register_student_exception import ( + CannotRegisterStudentException, +) + + +class InMemoryStudentRepository(StudentRepository): + + def __init__(self, student_collection: List[Student]): + self.__student_collection: List[Student] = student_collection + self.__student_assembler: StudentAssembler = StudentAssembler() + self.__logger: Logger = ServiceLocator.get_dependency(Logger) + + def find_student_by_discord_user_id( + self, discord_user_id: DiscordUserId + ) -> Student: + for student in self.__student_collection: + if student.discord_user_id.value == discord_user_id.value: + return student + raise StudentNotFoundException(discord_id=discord_user_id) + + def find_students_by_discord_user_id( + self, discord_user_id: DiscordUserId + ) -> List[Student]: + found_students = [ + student + for student in self.__student_collection + if student.discord_user_id.value == discord_user_id.value + ] + return found_students + + def find_student_by_ni(self, ni: NI) -> Student: + for student in self.__student_collection: + if student.ni.value == ni.value: + return student + raise StudentNotFoundException(ni=ni) + + def add_student(self, student: Student): + if any(s.ni.value == student.ni.value for s in self.__student_collection): + raise CannotAddStudentException(student) + self.__student_collection.append(student) + self.__logger.info( + f"L'étudiant {repr(student)} a bien été ajouté à la base de données.", + method="add_student", + ) + + def update_student(self, student: Student): + for idx, existing_student in enumerate(self.__student_collection): + if existing_student.ni.value == student.ni.value: + self.__student_collection[idx] = student + self.__logger.info( + f"{repr(student)} a bien été mis à jour dans la base de données.", + method="update_student", + ) + return + raise CannotUpdateStudentException(student) + + def register_student(self, ni: NI, discord_user_id: DiscordUserId): + for student in self.__student_collection: + if student.ni.value == ni.value: + student.discord_user_id = discord_user_id + self.__logger.info( + f"L'étudiant {repr(ni)} {repr(discord_user_id)} a bien été enregistré.", + method="register_student", + ) + return + raise CannotRegisterStudentException(ni) + + def unregister_student(self, ni: NI, discord_user_id: DiscordUserId): + for student in self.__student_collection: + if student.ni.value == ni.value: + student.discord_user_id = DiscordUserId( + DiscordUserId.INVALID_DISCORD_ID + ) # or None, depending on your model + self.__logger.info( + f"L'étudiant {repr(ni)} {repr(discord_user_id)} en cache a bien été désenregistré.", + method="unregister_student", + ) + return + raise CannotUnregisterStudentException(ni) From 2f977ed57c31800af441bde83defa76274c209de Mon Sep 17 00:00:00 2001 From: Babouche Date: Mon, 19 May 2025 21:29:34 -0400 Subject: [PATCH 06/12] Fix test with real repository --- bot/application/student/student_service.py | 1 + .../student/in_memory_student_repository.py | 9 +- tests/application/test_student_service.py | 154 +++++++++--------- 3 files changed, 82 insertions(+), 82 deletions(-) diff --git a/bot/application/student/student_service.py b/bot/application/student/student_service.py index 0e95973..2c35ca2 100644 --- a/bot/application/student/student_service.py +++ b/bot/application/student/student_service.py @@ -213,6 +213,7 @@ async def unregister_student( self.__student_repository.unregister_student( student.ni, DiscordUserId(DiscordUserId.INVALID_DISCORD_ID) ) + await self.notify_on_student_unregistered(student.discord_user_id) async def force_unregister_student( diff --git a/bot/infra/student/in_memory_student_repository.py b/bot/infra/student/in_memory_student_repository.py index e3d4578..ea63914 100644 --- a/bot/infra/student/in_memory_student_repository.py +++ b/bot/infra/student/in_memory_student_repository.py @@ -1,3 +1,4 @@ +import copy from typing import List from bot.config.logger.logger import Logger @@ -36,14 +37,14 @@ def find_student_by_discord_user_id( ) -> Student: for student in self.__student_collection: if student.discord_user_id.value == discord_user_id.value: - return student + return copy.deepcopy(student) raise StudentNotFoundException(discord_id=discord_user_id) def find_students_by_discord_user_id( self, discord_user_id: DiscordUserId ) -> List[Student]: found_students = [ - student + copy.deepcopy(student) for student in self.__student_collection if student.discord_user_id.value == discord_user_id.value ] @@ -52,7 +53,7 @@ def find_students_by_discord_user_id( def find_student_by_ni(self, ni: NI) -> Student: for student in self.__student_collection: if student.ni.value == ni.value: - return student + return copy.deepcopy(student) raise StudentNotFoundException(ni=ni) def add_student(self, student: Student): @@ -91,7 +92,7 @@ def unregister_student(self, ni: NI, discord_user_id: DiscordUserId): if student.ni.value == ni.value: student.discord_user_id = DiscordUserId( DiscordUserId.INVALID_DISCORD_ID - ) # or None, depending on your model + ) self.__logger.info( f"L'étudiant {repr(ni)} {repr(discord_user_id)} en cache a bien été désenregistré.", method="unregister_student", diff --git a/tests/application/test_student_service.py b/tests/application/test_student_service.py index cc9630b..c7fe7b9 100644 --- a/tests/application/test_student_service.py +++ b/tests/application/test_student_service.py @@ -2,7 +2,6 @@ from unittest.mock import MagicMock, AsyncMock, patch -from discord import Member from bot.application.student.student_service import StudentService from bot.config.logger.logger import Logger @@ -14,6 +13,8 @@ from bot.domain.student.attribut.program_code import ProgramCode from bot.domain.student.student import Student from bot.domain.student.student_repository import StudentRepository +from bot.infra.student.in_memory_student_repository import InMemoryStudentRepository +from bot.resource.cog.registration.request.add_student_request import AddStudentRequest from bot.resource.cog.registration.request.force_register_student_request import ( ForceRegisterStudentRequest, ) @@ -27,28 +28,33 @@ UnregisterStudentRequest, ) -A_STUDENT_FIRSTNAME: Firstname = Firstname(value="Jack") -A_STUDENT_LASTNAME = Lastname(value="Black") +A_BAC_NAME: str = "B-GLO" +A_STUDENT_FIRSTNAME: str = "Jack" +A_STUDENT_LASTNAME: str = "Black" A_NI: str = "123456789" A_DISCORD_ID: int = 123456789012749572 AN_INVALID_DISCORD_ID: int = -1 -UNREGISTERED_STUDENT: Student = Student( - NI(value=int(A_NI)), - A_STUDENT_FIRSTNAME, - A_STUDENT_LASTNAME, - ProgramCode(value="GLO"), - DiscordUserId(value=AN_INVALID_DISCORD_ID), -) -REGISTERED_STUDENT: Student = Student( - NI(value=int(A_NI)), - A_STUDENT_FIRSTNAME, - A_STUDENT_LASTNAME, - ProgramCode(value="GLO"), - DiscordUserId(value=A_DISCORD_ID), -) +def given_unregistered_student() -> Student: + return Student( + NI(value=int(A_NI)), + Firstname(value=A_STUDENT_FIRSTNAME), + Lastname(value=A_STUDENT_LASTNAME), + ProgramCode(value=A_BAC_NAME), + DiscordUserId(value=AN_INVALID_DISCORD_ID), + ) + + +def given_registered_student() -> Student: + return Student( + NI(value=int(A_NI)), + Firstname(value=A_STUDENT_FIRSTNAME), + Lastname(value=A_STUDENT_LASTNAME), + ProgramCode(value=A_BAC_NAME), + DiscordUserId(value=A_DISCORD_ID), + ) @pytest.fixture @@ -58,6 +64,24 @@ def setup_and_teardown_dependencies(): ServiceLocator.clear() +@pytest.mark.asyncio +async def test__when_add_student__then_student_is_added( + setup_and_teardown_dependencies, +): + logger_mock = MagicMock(spec=Logger) + ServiceLocator.register_dependency(Logger, logger_mock) + + student_repository: StudentRepository = InMemoryStudentRepository([]) + + student_service: StudentService = StudentService(student_repository) + + request: AddStudentRequest = AddStudentRequest( + A_NI, A_STUDENT_FIRSTNAME, A_STUDENT_LASTNAME, A_BAC_NAME + ) + + await student_service.add_student(request) + + @pytest.mark.asyncio async def test__given_unregistered_student__when_register_student__then_student_is_registered( setup_and_teardown_dependencies, @@ -65,13 +89,12 @@ async def test__given_unregistered_student__when_register_student__then_student_ logger_mock = MagicMock(spec=Logger) ServiceLocator.register_dependency(Logger, logger_mock) - student_repository = MagicMock(spec=StudentRepository) - student_repository.find_student_by_ni.return_value = UNREGISTERED_STUDENT - student_repository.find_students_by_discord_user_id.return_value = [] - student_repository.register_student = MagicMock() + unregistered_student: Student = given_unregistered_student() + student_repository: StudentRepository = InMemoryStudentRepository( + [unregistered_student] + ) student_service: StudentService = StudentService(student_repository) - student_service.notify_on_student_registered = AsyncMock() register_request: RegisterStudentRequest = RegisterStudentRequest( A_NI, A_DISCORD_ID @@ -79,14 +102,6 @@ async def test__given_unregistered_student__when_register_student__then_student_ await student_service.register_student(register_request) - excepted_ni: NI = NI(value=int(A_NI)) - excepted_discord_user_id: DiscordUserId = DiscordUserId(value=A_DISCORD_ID) - - student_repository.register_student.assert_called_with( - excepted_ni, excepted_discord_user_id - ) - student_service.notify_on_student_registered.assert_awaited_once_with(excepted_ni) - @pytest.mark.asyncio async def test__given_unregistered_student__when_force_register_student__then_student_is_registered( @@ -95,13 +110,12 @@ async def test__given_unregistered_student__when_force_register_student__then_st logger_mock = MagicMock(spec=Logger) ServiceLocator.register_dependency(Logger, logger_mock) - student_repository = MagicMock(spec=StudentRepository) - student_repository.find_student_by_ni.return_value = UNREGISTERED_STUDENT - student_repository.find_students_by_discord_user_id.return_value = [] - student_repository.register_student = MagicMock() + unregistered_student: Student = given_unregistered_student() + student_repository: StudentRepository = InMemoryStudentRepository( + [unregistered_student] + ) student_service: StudentService = StudentService(student_repository) - student_service.notify_on_student_registered = AsyncMock() request: ForceRegisterStudentRequest = ForceRegisterStudentRequest( A_NI, A_DISCORD_ID @@ -114,11 +128,6 @@ async def test__given_unregistered_student__when_force_register_student__then_st await student_service.force_register_student(request) - student_repository.register_student.assert_called_with( - NI(value=int(A_NI)), DiscordUserId(value=A_DISCORD_ID) - ) - student_service.notify_on_student_registered(NI(value=int(A_NI))) - @pytest.mark.asyncio async def test__given_registered_student__when_unregister_student__then_student_is_unregistered( @@ -127,12 +136,10 @@ async def test__given_registered_student__when_unregister_student__then_student_ logger_mock = MagicMock(spec=Logger) ServiceLocator.register_dependency(Logger, logger_mock) - student_repository = MagicMock(spec=StudentRepository) - student_repository.find_student_by_discord_user_id.return_value = REGISTERED_STUDENT - student_repository.find_students_by_discord_user_id.return_value = [ - REGISTERED_STUDENT - ] - student_repository.unregister_student = MagicMock() + registered_student: Student = given_registered_student() + student_repository: StudentRepository = InMemoryStudentRepository( + [registered_student] + ) student_service: StudentService = StudentService(student_repository) student_service.notify_on_student_unregistered = AsyncMock() @@ -146,24 +153,22 @@ async def test__given_registered_student__when_unregister_student__then_student_ await student_service.unregister_student(request) - student_repository.unregister_student.assert_called_with( - NI(value=int(A_NI)), DiscordUserId(value=AN_INVALID_DISCORD_ID) - ) student_service.notify_on_student_unregistered.assert_awaited_once_with( DiscordUserId(value=A_DISCORD_ID) ) @pytest.mark.asyncio -async def test__given__registered_student__when_force_unregister_student__then_student_is_unregistered( +async def test__given_registered_student__when_force_unregister_student__then_student_is_unregistered( setup_and_teardown_dependencies, ): logger_mock = MagicMock(spec=Logger) ServiceLocator.register_dependency(Logger, logger_mock) - student_repository = MagicMock(spec=StudentRepository) - student_repository.find_student_by_ni.return_value = REGISTERED_STUDENT - student_repository.unregister_student = MagicMock() + registered_student: Student = given_registered_student() + student_repository: StudentRepository = InMemoryStudentRepository( + [registered_student] + ) student_service: StudentService = StudentService(student_repository) student_service.notify_on_student_unregistered = AsyncMock() @@ -176,33 +181,26 @@ async def test__given__registered_student__when_force_unregister_student__then_s "bot.domain.utility.Utility.does_user_exist_on_server" ) as mock_does_user_exist_on_server: mock_does_user_exist_on_server.return_value = True - student_repository.unregister_student.assert_called_with( - NI(value=int(A_NI)), DiscordUserId(value=AN_INVALID_DISCORD_ID) - ) + student_service.notify_on_student_unregistered.assert_awaited_once_with( DiscordUserId(value=A_DISCORD_ID) ) -@pytest.mark.asyncio -async def test__given__discord_member__when_remove_member__then_member_is_removed( - setup_and_teardown_dependencies, -): - logger_mock = MagicMock(spec=Logger) - ServiceLocator.register_dependency(Logger, logger_mock) - - student_repository = MagicMock(spec=StudentRepository) - student_repository.unregister_student = MagicMock() - - student_service: StudentService = StudentService(student_repository) - student_service.notify_on_member_removed = AsyncMock() - - member = MagicMock(spec=Member) - member.id.return_value = A_DISCORD_ID - - await student_service.remove_member(member) - - student_repository.unregister_student( - NI(value=int(A_NI)), DiscordUserId(value=AN_INVALID_DISCORD_ID) - ) - student_service.notify_on_member_removed.assert_awaited_once_with(member) +# TODO: We will need the validation refactor... +# @pytest.mark.asyncio +# async def test__given_registered_student__when_remove_member__then_member_is_removed( +# setup_and_teardown_dependencies, +# ): +# logger_mock = MagicMock(spec=Logger) +# ServiceLocator.register_dependency(Logger, logger_mock) +# +# member = MagicMock(spec=Member) +# member.id.return_value = A_DISCORD_ID +# +# registered_student: Student = given_registered_student() +# student_repository: StudentRepository = InMemoryStudentRepository([registered_student]) +# +# student_service: StudentService = StudentService(student_repository) +# +# await student_service.remove_member(member) From cb57e3b912c63d3e38c6a78241fff0cb827589be Mon Sep 17 00:00:00 2001 From: Babouche Date: Mon, 19 May 2025 21:47:39 -0400 Subject: [PATCH 07/12] Fill register test --- tests/application/test_student_service.py | 88 ++++++++++++++++++++--- 1 file changed, 79 insertions(+), 9 deletions(-) diff --git a/tests/application/test_student_service.py b/tests/application/test_student_service.py index c7fe7b9..3e1d71f 100644 --- a/tests/application/test_student_service.py +++ b/tests/application/test_student_service.py @@ -2,7 +2,9 @@ from unittest.mock import MagicMock, AsyncMock, patch - +from bot.application.student.exceptions.student_already_registered_exception import ( + StudentAlreadyRegisteredException, +) from bot.application.student.student_service import StudentService from bot.config.logger.logger import Logger from bot.config.service_locator import ServiceLocator @@ -13,6 +15,9 @@ from bot.domain.student.attribut.program_code import ProgramCode from bot.domain.student.student import Student from bot.domain.student.student_repository import StudentRepository +from bot.infra.student.exception.student_not_found_exception import ( + StudentNotFoundException, +) from bot.infra.student.in_memory_student_repository import InMemoryStudentRepository from bot.resource.cog.registration.request.add_student_request import AddStudentRequest from bot.resource.cog.registration.request.force_register_student_request import ( @@ -33,13 +38,14 @@ A_STUDENT_LASTNAME: str = "Black" A_NI: str = "123456789" +ANOTHER_NI: str = "987654321" A_DISCORD_ID: int = 123456789012749572 AN_INVALID_DISCORD_ID: int = -1 -def given_unregistered_student() -> Student: +def given_unregistered_student(ni: str) -> Student: return Student( - NI(value=int(A_NI)), + NI(value=int(ni)), Firstname(value=A_STUDENT_FIRSTNAME), Lastname(value=A_STUDENT_LASTNAME), ProgramCode(value=A_BAC_NAME), @@ -47,9 +53,9 @@ def given_unregistered_student() -> Student: ) -def given_registered_student() -> Student: +def given_registered_student(ni: str) -> Student: return Student( - NI(value=int(A_NI)), + NI(value=int(ni)), Firstname(value=A_STUDENT_FIRSTNAME), Lastname(value=A_STUDENT_LASTNAME), ProgramCode(value=A_BAC_NAME), @@ -89,7 +95,7 @@ async def test__given_unregistered_student__when_register_student__then_student_ logger_mock = MagicMock(spec=Logger) ServiceLocator.register_dependency(Logger, logger_mock) - unregistered_student: Student = given_unregistered_student() + unregistered_student: Student = given_unregistered_student(A_NI) student_repository: StudentRepository = InMemoryStudentRepository( [unregistered_student] ) @@ -110,7 +116,7 @@ async def test__given_unregistered_student__when_force_register_student__then_st logger_mock = MagicMock(spec=Logger) ServiceLocator.register_dependency(Logger, logger_mock) - unregistered_student: Student = given_unregistered_student() + unregistered_student: Student = given_unregistered_student(A_NI) student_repository: StudentRepository = InMemoryStudentRepository( [unregistered_student] ) @@ -129,6 +135,70 @@ async def test__given_unregistered_student__when_force_register_student__then_st await student_service.force_register_student(request) +@pytest.mark.asyncio +async def test__given_already_registered_account__when_register_with_same_discord_client_id__then_student_already_registered_exception( + setup_and_teardown_dependencies, +): + logger_mock = MagicMock(spec=Logger) + ServiceLocator.register_dependency(Logger, logger_mock) + + registered_student: Student = given_registered_student(A_NI) + unregistered_student: Student = given_unregistered_student(ANOTHER_NI) + student_repository: StudentRepository = InMemoryStudentRepository( + [registered_student, unregistered_student] + ) + + student_service: StudentService = StudentService(student_repository) + + register_request: RegisterStudentRequest = RegisterStudentRequest( + ANOTHER_NI, A_DISCORD_ID + ) + + with pytest.raises(StudentAlreadyRegisteredException): + await student_service.register_student(register_request) + + +@pytest.mark.asyncio +async def test__given_no_students_and_unregistered_student__when_register_student__then_student_not_found_exception( + setup_and_teardown_dependencies, +): + logger_mock = MagicMock(spec=Logger) + ServiceLocator.register_dependency(Logger, logger_mock) + + student_repository: StudentRepository = InMemoryStudentRepository([]) + student_service: StudentService = StudentService(student_repository) + + register_request: RegisterStudentRequest = RegisterStudentRequest( + A_NI, A_DISCORD_ID + ) + + with pytest.raises(StudentNotFoundException): + await student_service.register_student(register_request) + + +@pytest.mark.asyncio +async def test__given_registered_student__when_register_student__then_raise_student_already_registered_exception( + setup_and_teardown_dependencies, +): + logger_mock = MagicMock(spec=Logger) + ServiceLocator.register_dependency(Logger, logger_mock) + + registered_student: Student = given_registered_student(A_NI) + + student_repository: StudentRepository = InMemoryStudentRepository( + [registered_student] + ) + + student_service: StudentService = StudentService(student_repository) + + register_request: RegisterStudentRequest = RegisterStudentRequest( + A_NI, A_DISCORD_ID + ) + + with pytest.raises(StudentAlreadyRegisteredException): + await student_service.register_student(register_request) + + @pytest.mark.asyncio async def test__given_registered_student__when_unregister_student__then_student_is_unregistered( setup_and_teardown_dependencies, @@ -136,7 +206,7 @@ async def test__given_registered_student__when_unregister_student__then_student_ logger_mock = MagicMock(spec=Logger) ServiceLocator.register_dependency(Logger, logger_mock) - registered_student: Student = given_registered_student() + registered_student: Student = given_registered_student(A_NI) student_repository: StudentRepository = InMemoryStudentRepository( [registered_student] ) @@ -165,7 +235,7 @@ async def test__given_registered_student__when_force_unregister_student__then_st logger_mock = MagicMock(spec=Logger) ServiceLocator.register_dependency(Logger, logger_mock) - registered_student: Student = given_registered_student() + registered_student: Student = given_registered_student(A_NI) student_repository: StudentRepository = InMemoryStudentRepository( [registered_student] ) From 56fab4c4bd490c77062d5090978e3a508959ad19 Mon Sep 17 00:00:00 2001 From: Babouche Date: Mon, 19 May 2025 22:13:17 -0400 Subject: [PATCH 08/12] Add force_register --- tests/application/test_student_service.py | 122 ++++++++++++++++++++-- 1 file changed, 115 insertions(+), 7 deletions(-) diff --git a/tests/application/test_student_service.py b/tests/application/test_student_service.py index 3e1d71f..b3a61c1 100644 --- a/tests/application/test_student_service.py +++ b/tests/application/test_student_service.py @@ -32,6 +32,7 @@ from bot.resource.cog.registration.request.unregister_student_request import ( UnregisterStudentRequest, ) +from bot.resource.exception.user_not_in_server_exception import UserNotInServerException A_BAC_NAME: str = "B-GLO" A_STUDENT_FIRSTNAME: str = "Jack" @@ -40,6 +41,7 @@ A_NI: str = "123456789" ANOTHER_NI: str = "987654321" A_DISCORD_ID: int = 123456789012749572 +ANOTHER_DISCORD_ID: int = 944456689012749572 AN_INVALID_DISCORD_ID: int = -1 @@ -53,13 +55,13 @@ def given_unregistered_student(ni: str) -> Student: ) -def given_registered_student(ni: str) -> Student: +def given_registered_student(ni: str, discord_user_id: int) -> Student: return Student( NI(value=int(ni)), Firstname(value=A_STUDENT_FIRSTNAME), Lastname(value=A_STUDENT_LASTNAME), ProgramCode(value=A_BAC_NAME), - DiscordUserId(value=A_DISCORD_ID), + DiscordUserId(value=discord_user_id), ) @@ -136,13 +138,119 @@ async def test__given_unregistered_student__when_force_register_student__then_st @pytest.mark.asyncio -async def test__given_already_registered_account__when_register_with_same_discord_client_id__then_student_already_registered_exception( +async def test__given_unregistered_student_and_discord_user_id_not_on_server__when_force_register_student__then_user_not_in_server_exception( setup_and_teardown_dependencies, ): logger_mock = MagicMock(spec=Logger) ServiceLocator.register_dependency(Logger, logger_mock) - registered_student: Student = given_registered_student(A_NI) + unregistered_student: Student = given_unregistered_student(A_NI) + student_repository: StudentRepository = InMemoryStudentRepository( + [unregistered_student] + ) + + student_service: StudentService = StudentService(student_repository) + + request: ForceRegisterStudentRequest = ForceRegisterStudentRequest( + A_NI, ANOTHER_DISCORD_ID + ) + + with patch( + "bot.domain.utility.Utility.does_user_exist_on_server" + ) as mock_does_user_exist_on_server: + mock_does_user_exist_on_server.return_value = False + + with pytest.raises(UserNotInServerException): + await student_service.force_register_student(request) + + +@pytest.mark.asyncio +async def test__given_no_students__when_force_register_student__then_student_not_found( + setup_and_teardown_dependencies, +): + logger_mock = MagicMock(spec=Logger) + ServiceLocator.register_dependency(Logger, logger_mock) + + student_repository: StudentRepository = InMemoryStudentRepository([]) + + student_service: StudentService = StudentService(student_repository) + + request: ForceRegisterStudentRequest = ForceRegisterStudentRequest( + A_NI, A_DISCORD_ID + ) + + with patch( + "bot.domain.utility.Utility.does_user_exist_on_server" + ) as mock_does_user_exist_on_server: + mock_does_user_exist_on_server.return_value = True + + with pytest.raises(StudentNotFoundException): + await student_service.force_register_student(request) + + +@pytest.mark.asyncio +async def test__given_already_registered_student__when_force_register_student__then_student_already_registered_exception( + setup_and_teardown_dependencies, +): + logger_mock = MagicMock(spec=Logger) + ServiceLocator.register_dependency(Logger, logger_mock) + + register_student: Student = given_registered_student(A_NI, A_DISCORD_ID) + student_repository: StudentRepository = InMemoryStudentRepository( + [register_student] + ) + + student_service: StudentService = StudentService(student_repository) + + request: ForceRegisterStudentRequest = ForceRegisterStudentRequest( + A_NI, A_DISCORD_ID + ) + + with patch( + "bot.domain.utility.Utility.does_user_exist_on_server" + ) as mock_does_user_exist_on_server: + mock_does_user_exist_on_server.return_value = True + + with pytest.raises(StudentAlreadyRegisteredException): + await student_service.force_register_student(request) + + +@pytest.mark.asyncio +async def test__given_already_registered_student__when_force_register_with_same_discord_client_id__then_student_already_registered_exception( + setup_and_teardown_dependencies, +): + logger_mock = MagicMock(spec=Logger) + ServiceLocator.register_dependency(Logger, logger_mock) + + register_student: Student = given_registered_student(A_NI, A_DISCORD_ID) + unregistered_student: Student = given_unregistered_student(ANOTHER_NI) + student_repository: StudentRepository = InMemoryStudentRepository( + [register_student, unregistered_student] + ) + + student_service: StudentService = StudentService(student_repository) + + request: ForceRegisterStudentRequest = ForceRegisterStudentRequest( + ANOTHER_NI, A_DISCORD_ID + ) + + with patch( + "bot.domain.utility.Utility.does_user_exist_on_server" + ) as mock_does_user_exist_on_server: + mock_does_user_exist_on_server.return_value = True + + with pytest.raises(StudentAlreadyRegisteredException): + await student_service.force_register_student(request) + + +@pytest.mark.asyncio +async def test__given_already_registered_student__when_register_with_same_discord_client_id__then_student_already_registered_exception( + setup_and_teardown_dependencies, +): + logger_mock = MagicMock(spec=Logger) + ServiceLocator.register_dependency(Logger, logger_mock) + + registered_student: Student = given_registered_student(A_NI, A_DISCORD_ID) unregistered_student: Student = given_unregistered_student(ANOTHER_NI) student_repository: StudentRepository = InMemoryStudentRepository( [registered_student, unregistered_student] @@ -183,7 +291,7 @@ async def test__given_registered_student__when_register_student__then_raise_stud logger_mock = MagicMock(spec=Logger) ServiceLocator.register_dependency(Logger, logger_mock) - registered_student: Student = given_registered_student(A_NI) + registered_student: Student = given_registered_student(A_NI, A_DISCORD_ID) student_repository: StudentRepository = InMemoryStudentRepository( [registered_student] @@ -206,7 +314,7 @@ async def test__given_registered_student__when_unregister_student__then_student_ logger_mock = MagicMock(spec=Logger) ServiceLocator.register_dependency(Logger, logger_mock) - registered_student: Student = given_registered_student(A_NI) + registered_student: Student = given_registered_student(A_NI, A_DISCORD_ID) student_repository: StudentRepository = InMemoryStudentRepository( [registered_student] ) @@ -235,7 +343,7 @@ async def test__given_registered_student__when_force_unregister_student__then_st logger_mock = MagicMock(spec=Logger) ServiceLocator.register_dependency(Logger, logger_mock) - registered_student: Student = given_registered_student(A_NI) + registered_student: Student = given_registered_student(A_NI, A_DISCORD_ID) student_repository: StudentRepository = InMemoryStudentRepository( [registered_student] ) From 9e3a457b971028b76fcbd9de9c558be447dd5297 Mon Sep 17 00:00:00 2001 From: Babouche Date: Mon, 19 May 2025 22:45:29 -0400 Subject: [PATCH 09/12] add unregister --- bot/application/student/student_service.py | 3 -- tests/application/test_student_service.py | 32 ++++++++++++++++------ 2 files changed, 24 insertions(+), 11 deletions(-) diff --git a/bot/application/student/student_service.py b/bot/application/student/student_service.py index 2c35ca2..effb098 100644 --- a/bot/application/student/student_service.py +++ b/bot/application/student/student_service.py @@ -196,9 +196,6 @@ async def unregister_student( method="unregister_student", ) - if not Utility.does_user_exist_on_server(unregister_student_request.discord_id): - raise UserNotInServerException(unregister_student_request.discord_id) - discord_user_id = DiscordUserId(unregister_student_request.discord_id) if not self.__does_discord_user_id_already_registered_an_account( diff --git a/tests/application/test_student_service.py b/tests/application/test_student_service.py index b3a61c1..1b62752 100644 --- a/tests/application/test_student_service.py +++ b/tests/application/test_student_service.py @@ -324,16 +324,32 @@ async def test__given_registered_student__when_unregister_student__then_student_ request: UnregisterStudentRequest = UnregisterStudentRequest(A_DISCORD_ID) - with patch( - "bot.domain.utility.Utility.does_user_exist_on_server" - ) as mock_does_user_exist_on_server: - mock_does_user_exist_on_server.return_value = True + await student_service.unregister_student(request) - await student_service.unregister_student(request) + student_service.notify_on_student_unregistered.assert_awaited_once_with( + DiscordUserId(value=A_DISCORD_ID) + ) - student_service.notify_on_student_unregistered.assert_awaited_once_with( - DiscordUserId(value=A_DISCORD_ID) - ) + +@pytest.mark.asyncio +async def test__given_unregistered_student__when_unregister_student__then_student_not_found_exception( + setup_and_teardown_dependencies, +): + logger_mock = MagicMock(spec=Logger) + ServiceLocator.register_dependency(Logger, logger_mock) + + unregistered_student: Student = given_unregistered_student(A_NI) + student_repository: StudentRepository = InMemoryStudentRepository( + [unregistered_student] + ) + + student_service: StudentService = StudentService(student_repository) + student_service.notify_on_student_unregistered = AsyncMock() + + request: UnregisterStudentRequest = UnregisterStudentRequest(A_DISCORD_ID) + + with pytest.raises(StudentNotFoundException): + await student_service.unregister_student(request) @pytest.mark.asyncio From 510e338a35add90311400d14aee220c13f4a7f9e Mon Sep 17 00:00:00 2001 From: Babouche Date: Mon, 19 May 2025 22:55:13 -0400 Subject: [PATCH 10/12] add_student --- bot/application/student/student_service.py | 8 +-- tests/application/test_student_service.py | 62 +++++++++++++++------- 2 files changed, 47 insertions(+), 23 deletions(-) diff --git a/bot/application/student/student_service.py b/bot/application/student/student_service.py index effb098..ba06556 100644 --- a/bot/application/student/student_service.py +++ b/bot/application/student/student_service.py @@ -121,9 +121,10 @@ async def add_student(self, add_student_request: AddStudentRequest): add_student_request.program_code, ) - if self.__does_student_exists(student.ni) or self.__does_student_registered( - student.ni - ): + if self.__does_student_registered(student.ni): + raise StudentAlreadyRegisteredException(ni=student.ni) + + if self.__does_student_exists(student.ni): raise StudentAlreadyExistsException(ni=student.ni) self.__student_repository.add_student(student) @@ -231,6 +232,7 @@ async def force_unregister_student( self.__student_repository.unregister_student( student_ni, DiscordUserId(DiscordUserId.INVALID_DISCORD_ID) ) + await self.notify_on_student_unregistered(student.discord_user_id) async def remove_member(self, member: Member): diff --git a/tests/application/test_student_service.py b/tests/application/test_student_service.py index 1b62752..504447f 100644 --- a/tests/application/test_student_service.py +++ b/tests/application/test_student_service.py @@ -2,6 +2,7 @@ from unittest.mock import MagicMock, AsyncMock, patch +from bot.application.student.exceptions.student_already_exist import StudentAlreadyExistsException from bot.application.student.exceptions.student_already_registered_exception import ( StudentAlreadyRegisteredException, ) @@ -73,7 +74,7 @@ def setup_and_teardown_dependencies(): @pytest.mark.asyncio -async def test__when_add_student__then_student_is_added( +async def test__given_no_students__when_add_student__then_student_is_added( setup_and_teardown_dependencies, ): logger_mock = MagicMock(spec=Logger) @@ -90,6 +91,46 @@ async def test__when_add_student__then_student_is_added( await student_service.add_student(request) +@pytest.mark.asyncio +async def test__given_registered_student__when_add_same_student__then_student_already_registered_exception( + setup_and_teardown_dependencies, +): + logger_mock = MagicMock(spec=Logger) + ServiceLocator.register_dependency(Logger, logger_mock) + + registered_student: Student = given_registered_student(A_NI, A_DISCORD_ID) + student_repository: StudentRepository = InMemoryStudentRepository([registered_student]) + + student_service: StudentService = StudentService(student_repository) + + request: AddStudentRequest = AddStudentRequest( + A_NI, A_STUDENT_FIRSTNAME, A_STUDENT_LASTNAME, A_BAC_NAME + ) + + with pytest.raises(StudentAlreadyRegisteredException): + await student_service.add_student(request) + + +@pytest.mark.asyncio +async def test__given_a_student__when_add_already_existing_student__then_student_already_exists_exception( + setup_and_teardown_dependencies, +): + logger_mock = MagicMock(spec=Logger) + ServiceLocator.register_dependency(Logger, logger_mock) + + a_student: Student = given_unregistered_student(A_NI) + student_repository: StudentRepository = InMemoryStudentRepository([a_student]) + + student_service: StudentService = StudentService(student_repository) + + request: AddStudentRequest = AddStudentRequest( + A_NI, A_STUDENT_FIRSTNAME, A_STUDENT_LASTNAME, A_BAC_NAME + ) + + with pytest.raises(StudentAlreadyExistsException): + await student_service.add_student(request) + + @pytest.mark.asyncio async def test__given_unregistered_student__when_register_student__then_student_is_registered( setup_and_teardown_dependencies, @@ -379,22 +420,3 @@ async def test__given_registered_student__when_force_unregister_student__then_st student_service.notify_on_student_unregistered.assert_awaited_once_with( DiscordUserId(value=A_DISCORD_ID) ) - - -# TODO: We will need the validation refactor... -# @pytest.mark.asyncio -# async def test__given_registered_student__when_remove_member__then_member_is_removed( -# setup_and_teardown_dependencies, -# ): -# logger_mock = MagicMock(spec=Logger) -# ServiceLocator.register_dependency(Logger, logger_mock) -# -# member = MagicMock(spec=Member) -# member.id.return_value = A_DISCORD_ID -# -# registered_student: Student = given_registered_student() -# student_repository: StudentRepository = InMemoryStudentRepository([registered_student]) -# -# student_service: StudentService = StudentService(student_repository) -# -# await student_service.remove_member(member) From 3837ab7301305b825304739c35b47bff6b77798c Mon Sep 17 00:00:00 2001 From: Babouche Date: Mon, 19 May 2025 22:59:36 -0400 Subject: [PATCH 11/12] Fix dev-requirements --- README.md | 1 + dev-requirements.txt | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 39f8620..763a5b0 100644 --- a/README.md +++ b/README.md @@ -2,6 +2,7 @@ Simply a customs agent ![CI](https://github.com/BaboucheOne/BuggyBot/actions/workflows/python-formatter.yml/badge.svg) +![Tests](https://github.com/BaboucheOne/BuggyBot/actions/workflows/pytest.yml/badge.svg) ![DockerBuild](https://github.com/BaboucheOne/BuggyBot/actions/workflows/docker-build.yml/badge.svg) ![DockerDeployment](https://github.com/BaboucheOne/BuggyBot/actions/workflows/build-push-docker-image.yml/badge.svg) diff --git a/dev-requirements.txt b/dev-requirements.txt index a1fb408..d516e1f 100644 --- a/dev-requirements.txt +++ b/dev-requirements.txt @@ -3,4 +3,4 @@ black==24.4.2 ruff==0.4.10 pytest==8.3.5 -pytest-async==1.0.0a1 +pytest-async==0.26.0 From 7daea018d11c7790d4a2c299e28b1c2150a9480c Mon Sep 17 00:00:00 2001 From: Babouche Date: Mon, 19 May 2025 23:05:08 -0400 Subject: [PATCH 12/12] Fix package name --- dev-requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dev-requirements.txt b/dev-requirements.txt index d516e1f..ec6f02a 100644 --- a/dev-requirements.txt +++ b/dev-requirements.txt @@ -3,4 +3,4 @@ black==24.4.2 ruff==0.4.10 pytest==8.3.5 -pytest-async==0.26.0 +pytest-asyncio==0.26.0