diff --git a/bot/application/student/student_service.py b/bot/application/student/student_service.py index 181609c..713056b 100644 --- a/bot/application/student/student_service.py +++ b/bot/application/student/student_service.py @@ -16,10 +16,10 @@ ) from bot.config.logger.logger import Logger from bot.config.service_locator import ServiceLocator +from bot.domain.discord_client.discord_client import DiscordClient from bot.domain.student.attribut.firstname import Firstname from bot.domain.student.attribut.lastname import Lastname from bot.domain.student.attribut.program_code import ProgramCode -from bot.domain.utility import Utility from bot.domain.student.attribut.discord_user_id import DiscordUserId from bot.domain.student.attribut.ni import NI from bot.domain.student.factory.student_factory import StudentFactory @@ -37,6 +37,10 @@ def __init__(self, student_repository: StudentRepository): super().__init__() self.__logger: Logger = ServiceLocator.get_dependency(Logger) + self.__discord_client: DiscordClient = ServiceLocator.get_dependency( + DiscordClient + ) + self.__student_repository = student_repository self.__student_factory = StudentFactory() @@ -97,7 +101,7 @@ async def register_student(self, ni: NI, discord_id: DiscordUserId): await self.notify_on_student_registered(ni) async def force_register_student(self, ni: NI, discord_id: DiscordUserId): - if not Utility.does_user_exist_on_server(discord_id.value): + if not self.__discord_client.does_user_exists(discord_id): raise UserNotInServerException(discord_id) if not self.__does_student_exists(ni): diff --git a/bot/domain/discord_client/discord_client.py b/bot/domain/discord_client/discord_client.py index 420d414..e116322 100644 --- a/bot/domain/discord_client/discord_client.py +++ b/bot/domain/discord_client/discord_client.py @@ -6,6 +6,7 @@ from bot.config.logger.logger import Logger from bot.config.service_locator import ServiceLocator +from bot.domain.student.attribut.discord_user_id import DiscordUserId class DiscordClient(Bot): @@ -26,6 +27,9 @@ async def on_ready(self): self.__server = self.get_guild(self.__server_id) self.__logger.info("DiscordClient prêt à fonctionner.", method="on_ready") + def does_user_exists(self, discord_id: DiscordUserId) -> bool: + return self.get_user(discord_id.value) is not None + @property def ready(self) -> bool: return self.__server is not None diff --git a/bot/domain/utility.py b/bot/domain/utility.py index 32b625c..ddc7d4b 100644 --- a/bot/domain/utility.py +++ b/bot/domain/utility.py @@ -1,5 +1,3 @@ -from bot.config.service_locator import ServiceLocator -from bot.domain.discord_client.discord_client import DiscordClient from bot.resource.exception.missing_arguments_exception import MissingArgumentsException @@ -17,9 +15,3 @@ def get_content_without_command(content: str): if len(args) < 2: raise MissingArgumentsException(0) return " ".join(args[1:]) - - @staticmethod - def does_user_exist_on_server(discord_id: int) -> bool: - discord_client: DiscordClient = ServiceLocator.get_dependency(DiscordClient) - - return discord_client.get_user(discord_id) is not None diff --git a/bot/resource/cog/registration/register_member.py b/bot/resource/cog/registration/register_member.py index 15d6aed..07b74ae 100644 --- a/bot/resource/cog/registration/register_member.py +++ b/bot/resource/cog/registration/register_member.py @@ -59,9 +59,6 @@ def __init__(self): ForceUnregisterStudentRequestFactory() ) - def __does_user_exist_on_server(self, discord_id: int) -> bool: - return self.__discord_client.get_user(discord_id) is not None - @commands.Cog.listener() async def on_member_join(self, member: Member): await member.create_dm() diff --git a/tests/application/test_student_service.py b/tests/application/test_student_service.py index e18e173..6837b2f 100644 --- a/tests/application/test_student_service.py +++ b/tests/application/test_student_service.py @@ -1,6 +1,6 @@ import pytest -from unittest.mock import MagicMock, AsyncMock, patch +from unittest.mock import MagicMock, AsyncMock from bot.application.student.exceptions.student_already_exist import ( StudentAlreadyExistsException, @@ -11,6 +11,7 @@ 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.discord_client.discord_client import DiscordClient 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 @@ -67,7 +68,9 @@ async def test__given_no_students__when_add_student__then_student_is_added( setup_and_teardown_dependencies, ): logger_mock = MagicMock(spec=Logger) + discord_client_mock = MagicMock(spec=DiscordClient) ServiceLocator.register_dependency(Logger, logger_mock) + ServiceLocator.register_dependency(DiscordClient, discord_client_mock) student_repository: StudentRepository = InMemoryStudentRepository([]) @@ -83,7 +86,9 @@ async def test__given_registered_student__when_add_same_student__then_student_al setup_and_teardown_dependencies, ): logger_mock = MagicMock(spec=Logger) + discord_client_mock = MagicMock(spec=DiscordClient) ServiceLocator.register_dependency(Logger, logger_mock) + ServiceLocator.register_dependency(DiscordClient, discord_client_mock) registered_student: Student = given_registered_student(A_NI, A_DISCORD_ID) student_repository: StudentRepository = InMemoryStudentRepository( @@ -103,7 +108,9 @@ async def test__given_a_student__when_add_already_existing_student__then_student setup_and_teardown_dependencies, ): logger_mock = MagicMock(spec=Logger) + discord_client_mock = MagicMock(spec=DiscordClient) ServiceLocator.register_dependency(Logger, logger_mock) + ServiceLocator.register_dependency(DiscordClient, discord_client_mock) a_student: Student = given_unregistered_student(A_NI) student_repository: StudentRepository = InMemoryStudentRepository([a_student]) @@ -121,7 +128,9 @@ async def test__given_unregistered_student__when_register_student__then_student_ setup_and_teardown_dependencies, ): logger_mock = MagicMock(spec=Logger) + discord_client_mock = MagicMock(spec=DiscordClient) ServiceLocator.register_dependency(Logger, logger_mock) + ServiceLocator.register_dependency(DiscordClient, discord_client_mock) unregistered_student: Student = given_unregistered_student(A_NI) student_repository: StudentRepository = InMemoryStudentRepository( @@ -138,7 +147,10 @@ async def test__given_unregistered_student__when_force_register_student__then_st setup_and_teardown_dependencies, ): logger_mock = MagicMock(spec=Logger) + discord_client_mock = MagicMock(spec=DiscordClient) + discord_client_mock.does_user_exists.return_value = True ServiceLocator.register_dependency(Logger, logger_mock) + ServiceLocator.register_dependency(DiscordClient, discord_client_mock) unregistered_student: Student = given_unregistered_student(A_NI) student_repository: StudentRepository = InMemoryStudentRepository( @@ -147,12 +159,7 @@ async def test__given_unregistered_student__when_force_register_student__then_st student_service: StudentService = StudentService(student_repository) - 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(A_NI, A_DISCORD_ID) + await student_service.force_register_student(A_NI, A_DISCORD_ID) @pytest.mark.asyncio @@ -160,7 +167,10 @@ async def test__given_unregistered_student_and_discord_user_id_not_on_server__wh setup_and_teardown_dependencies, ): logger_mock = MagicMock(spec=Logger) + discord_client_mock = MagicMock(spec=DiscordClient) + discord_client_mock.does_user_exists.return_value = False ServiceLocator.register_dependency(Logger, logger_mock) + ServiceLocator.register_dependency(DiscordClient, discord_client_mock) unregistered_student: Student = given_unregistered_student(A_NI) student_repository: StudentRepository = InMemoryStudentRepository( @@ -169,13 +179,8 @@ async def test__given_unregistered_student_and_discord_user_id_not_on_server__wh student_service: StudentService = StudentService(student_repository) - 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(A_NI, ANOTHER_DISCORD_ID) + with pytest.raises(UserNotInServerException): + await student_service.force_register_student(A_NI, ANOTHER_DISCORD_ID) @pytest.mark.asyncio @@ -183,19 +188,17 @@ async def test__given_no_students__when_force_register_student__then_student_not setup_and_teardown_dependencies, ): logger_mock = MagicMock(spec=Logger) + discord_client_mock = MagicMock(spec=DiscordClient) + discord_client_mock.does_user_exists.return_value = True ServiceLocator.register_dependency(Logger, logger_mock) + ServiceLocator.register_dependency(DiscordClient, discord_client_mock) student_repository: StudentRepository = InMemoryStudentRepository([]) student_service: StudentService = StudentService(student_repository) - 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(A_NI, A_DISCORD_ID) + with pytest.raises(StudentNotFoundException): + await student_service.force_register_student(A_NI, A_DISCORD_ID) @pytest.mark.asyncio @@ -203,7 +206,10 @@ async def test__given_already_registered_student__when_force_register_student__t setup_and_teardown_dependencies, ): logger_mock = MagicMock(spec=Logger) + discord_client_mock = MagicMock(spec=DiscordClient) + discord_client_mock.does_user_exists.return_value = True ServiceLocator.register_dependency(Logger, logger_mock) + ServiceLocator.register_dependency(DiscordClient, discord_client_mock) register_student: Student = given_registered_student(A_NI, A_DISCORD_ID) student_repository: StudentRepository = InMemoryStudentRepository( @@ -212,13 +218,8 @@ async def test__given_already_registered_student__when_force_register_student__t student_service: StudentService = StudentService(student_repository) - 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(A_NI, A_DISCORD_ID) + with pytest.raises(StudentAlreadyRegisteredException): + await student_service.force_register_student(A_NI, A_DISCORD_ID) @pytest.mark.asyncio @@ -226,7 +227,10 @@ async def test__given_already_registered_student__when_force_register_with_same_ setup_and_teardown_dependencies, ): logger_mock = MagicMock(spec=Logger) + discord_client_mock = MagicMock(spec=DiscordClient) + discord_client_mock.does_user_exists.return_value = True ServiceLocator.register_dependency(Logger, logger_mock) + ServiceLocator.register_dependency(DiscordClient, discord_client_mock) register_student: Student = given_registered_student(A_NI, A_DISCORD_ID) unregistered_student: Student = given_unregistered_student(ANOTHER_NI) @@ -236,13 +240,8 @@ async def test__given_already_registered_student__when_force_register_with_same_ student_service: StudentService = StudentService(student_repository) - 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(ANOTHER_NI, A_DISCORD_ID) + with pytest.raises(StudentAlreadyRegisteredException): + await student_service.force_register_student(ANOTHER_NI, A_DISCORD_ID) @pytest.mark.asyncio @@ -250,7 +249,9 @@ async def test__given_already_registered_student__when_register_with_same_discor setup_and_teardown_dependencies, ): logger_mock = MagicMock(spec=Logger) + discord_client_mock = MagicMock(spec=DiscordClient) ServiceLocator.register_dependency(Logger, logger_mock) + ServiceLocator.register_dependency(DiscordClient, discord_client_mock) registered_student: Student = given_registered_student(A_NI, A_DISCORD_ID) unregistered_student: Student = given_unregistered_student(ANOTHER_NI) @@ -269,7 +270,9 @@ async def test__given_no_students_and_unregistered_student__when_register_studen setup_and_teardown_dependencies, ): logger_mock = MagicMock(spec=Logger) + discord_client_mock = MagicMock(spec=DiscordClient) ServiceLocator.register_dependency(Logger, logger_mock) + ServiceLocator.register_dependency(DiscordClient, discord_client_mock) student_repository: StudentRepository = InMemoryStudentRepository([]) student_service: StudentService = StudentService(student_repository) @@ -283,7 +286,9 @@ async def test__given_registered_student__when_register_student__then_raise_stud setup_and_teardown_dependencies, ): logger_mock = MagicMock(spec=Logger) + discord_client_mock = MagicMock(spec=DiscordClient) ServiceLocator.register_dependency(Logger, logger_mock) + ServiceLocator.register_dependency(DiscordClient, discord_client_mock) registered_student: Student = given_registered_student(A_NI, A_DISCORD_ID) @@ -302,7 +307,9 @@ async def test__given_registered_student__when_unregister_student__then_student_ setup_and_teardown_dependencies, ): logger_mock = MagicMock(spec=Logger) + discord_client_mock = MagicMock(spec=DiscordClient) ServiceLocator.register_dependency(Logger, logger_mock) + ServiceLocator.register_dependency(DiscordClient, discord_client_mock) registered_student: Student = given_registered_student(A_NI, A_DISCORD_ID) student_repository: StudentRepository = InMemoryStudentRepository( @@ -324,7 +331,9 @@ async def test__given_unregistered_student__when_unregister_student__then_studen setup_and_teardown_dependencies, ): logger_mock = MagicMock(spec=Logger) + discord_client_mock = MagicMock(spec=DiscordClient) ServiceLocator.register_dependency(Logger, logger_mock) + ServiceLocator.register_dependency(DiscordClient, discord_client_mock) unregistered_student: Student = given_unregistered_student(A_NI) student_repository: StudentRepository = InMemoryStudentRepository( @@ -343,7 +352,10 @@ async def test__given_registered_student__when_force_unregister_student__then_st setup_and_teardown_dependencies, ): logger_mock = MagicMock(spec=Logger) + discord_client_mock = MagicMock(spec=DiscordClient) + discord_client_mock.does_user_exists.return_value = True ServiceLocator.register_dependency(Logger, logger_mock) + ServiceLocator.register_dependency(DiscordClient, discord_client_mock) registered_student: Student = given_registered_student(A_NI, A_DISCORD_ID) student_repository: StudentRepository = InMemoryStudentRepository( @@ -355,11 +367,6 @@ async def test__given_registered_student__when_force_unregister_student__then_st await student_service.force_unregister_student(A_NI) - 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 - - student_service.notify_on_student_unregistered.assert_awaited_once_with( - A_DISCORD_ID - ) + student_service.notify_on_student_unregistered.assert_awaited_once_with( + A_DISCORD_ID + )