Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 6 additions & 2 deletions bot/application/student/student_service.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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()
Expand Down Expand Up @@ -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):
Expand Down
4 changes: 4 additions & 0 deletions bot/domain/discord_client/discord_client.py
Original file line number Diff line number Diff line change
Expand Up @@ -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):
Expand All @@ -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
Expand Down
8 changes: 0 additions & 8 deletions bot/domain/utility.py
Original file line number Diff line number Diff line change
@@ -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


Expand All @@ -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
3 changes: 0 additions & 3 deletions bot/resource/cog/registration/register_member.py
Original file line number Diff line number Diff line change
Expand Up @@ -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()
Expand Down
93 changes: 50 additions & 43 deletions tests/application/test_student_service.py
Original file line number Diff line number Diff line change
@@ -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,
Expand All @@ -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
Expand Down Expand Up @@ -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([])

Expand All @@ -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(
Expand All @@ -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])
Expand All @@ -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(
Expand All @@ -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(
Expand All @@ -147,20 +159,18 @@ 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
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)
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(
Expand All @@ -169,41 +179,37 @@ 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
async def test__given_no_students__when_force_register_student__then_student_not_found(
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
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)
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(
Expand All @@ -212,21 +218,19 @@ 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
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)
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)
Expand All @@ -236,21 +240,18 @@ 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
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)
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)
Expand All @@ -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)
Expand All @@ -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)

Expand All @@ -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(
Expand All @@ -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(
Expand All @@ -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(
Expand All @@ -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
)
Loading