Skip to content

Vasileva_Quest#11

Open
KatiaVasileva wants to merge 66 commits intodemologin:mainfrom
KatiaVasileva:vasileva
Open

Vasileva_Quest#11
KatiaVasileva wants to merge 66 commits intodemologin:mainfrom
KatiaVasileva:vasileva

Conversation

@KatiaVasileva
Copy link

No description provided.

Copy link
Owner

@demologin demologin left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Общий вывод по проекту

Представленный проект демонстрирует хороший уровень владения инструментами тестирования (JUnit 5, Mockito) и понимание веб-архитектуры на базе сервлетов. Тесты покрывают основные позитивные и негативные сценарии, включая обработку исключений и валидацию данных.

Основные области для развития:

Архитектура: Повторяющаяся проверка авторизации в каждом контроллере указывает на необходимость внедрения фильтров (Filters).

Чистый код: Рекомендуется избегать дублирования в тестах с помощью @ParameterizedTest и вынести работу с сессионными ключами в строгие константы .

Инкапсуляция: Логика определения состояния игры (победа/поражение) должна принадлежать доменным моделям, а не контроллерам или тестам.

Проект выглядит крепким, структурированным и готовым к дальнейшему расширению. Продолжайте изучать паттерны проектирования и возможности современной Java для написания еще более элегантного кода!

Итоговая оценка: A


public class EditQuestIT extends BaseIT {

private final QuestService questService = mock(QuestService.class);
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Инициализация моков вручную в полях класса снижает гибкость тестов. Рекомендуется использовать аннотацию @mock совместно с @ExtendWith(MockitoExtension.class) для автоматизации процесса. [INFO]


@Test
@DisplayName("when GET request admin authorized no questId then set edit false and default JSON")
void whenGetNoQuestId_ThenSetEditFalseAndDefaultJson() {
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Название метода теста 'whenGetNoQuestId_ThenSetEditFalseAndDefaultJson' содержит подчеркивание, что нарушает camelCase конвенцию Java. Следует придерживаться единого стиля именования без подчеркиваний. [INFO]

@Test
@DisplayName("when GET request admin authorized no questId then set edit false and default JSON")
void whenGetNoQuestId_ThenSetEditFalseAndDefaultJson() {
doNothing().when(authService).checkAdminAuthorization(req, EDIT_QUEST_AUTH_ERROR);
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Использование doNothing() для методов, которые и так ничего не возвращают (void), является избыточным в Mockito, так как это поведение по умолчанию. [INFO]

assertEquals(editQuest.getView(), resultView);
verify(req).setAttribute(eq(EDIT), eq(true));
assertNull(req.getAttribute(QUEST_JSON));
assertThrows(IOException.class, () -> questMapper.toJsonString(testQuest));
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

В одном тестовом методе проверяется и возврат представления, и выброс исключения через анонимную функцию. Тест должен проверять один конкретный сценарий (Single Responsibility Principle для тестов). [WARNING]

when(req.getParameter(QUEST_ID)).thenReturn(questIdStr);
when(questService.getValidatedQuest(questIdStr)).thenReturn(Optional.empty());

when(questService.getAll()).thenReturn(List.of());
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Вызов questService.getAll() кажется лишним для сценария 'Quest Not Found'. Следует убедиться, что тесты не перегружены лишними действиями, не относящимися к проверяемому случаю. [INFO]


assertEquals(expectedUrl, redirectUrl);
verify(req).setAttribute(GAME, testGame);
verify(req).setAttribute(USER, testUser);
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Установка атрибута USER в запрос в методе doPost выглядит странно, так как пользователь обычно уже находится в сессии. Стоит проверить необходимость этого действия. [WARNING]

verify(authService).checkAdminAuthorization(req, EDIT_QUEST_AUTH_ERROR);
verify(req).setAttribute(eq(QUESTS), anyList());
verify(req).setAttribute(eq(EDIT), eq(false));
verify(req).setAttribute(eq(QUEST_JSON), eq(JSON_SAMPLE));
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Использование магической строки JSON_SAMPLE. Если структура JSON изменится, тесты упадут. Лучше генерировать JSON из тестовых объектов динамически. [WARNING]

import static org.junit.jupiter.api.Assertions.assertThrows;
import static org.mockito.Mockito.*;

public class RegisterIT extends BaseIT {
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Класс RegisterIT наследуется от BaseIT, но не использует @ExtendWith(MockitoExtension.class), в отличие от HomeIT. Желательно привести все тестовые классы к единому стилю. [INFO]

verify(req).getSession();
verify(session).getAttribute(Key.USER);
verify(statsService).getUserStats(testUser.getId());
verify(req, never()).setAttribute(eq(Key.STATS), any());
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Проверка verify(never()) полезна для подтверждения того, что данные не передаются на фронтенд при ошибках. Это хороший подход к безопасности. [INFO]

assertEquals(login.getView(), redirect);
verify(session).setAttribute(Key.ERROR, Value.INVALID_DATA_ERROR);
verify(userService).login(testAdmin.getEmail(), invalidPassword);
verifyNoMoreInteractions(userStatsService);
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Использование verifyNoMoreInteractions помогает гарантировать отсутствие лишних вызовов к сервисам, что важно для производительности и корректности логики. [INFO]

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants