diff --git a/src/main/java/com/jobtracker/repository/InterviewEventRepository.java b/src/main/java/com/jobtracker/repository/InterviewEventRepository.java index ced8c6db..13eaa6fc 100644 --- a/src/main/java/com/jobtracker/repository/InterviewEventRepository.java +++ b/src/main/java/com/jobtracker/repository/InterviewEventRepository.java @@ -10,4 +10,6 @@ public interface InterviewEventRepository extends JpaRepository { long countByUser_Id(UUID userId); + + void deleteByApplication_Id(UUID applicationId); } diff --git a/src/main/java/com/jobtracker/service/ApplicationService.java b/src/main/java/com/jobtracker/service/ApplicationService.java index c7f349b8..25af245a 100644 --- a/src/main/java/com/jobtracker/service/ApplicationService.java +++ b/src/main/java/com/jobtracker/service/ApplicationService.java @@ -7,6 +7,7 @@ import com.jobtracker.exception.ResourceNotFoundException; import com.jobtracker.mapper.ApplicationMapper; import com.jobtracker.repository.ApplicationRepository; +import com.jobtracker.repository.InterviewEventRepository; import com.jobtracker.util.SecurityUtils; import io.micrometer.tracing.Span; import io.micrometer.tracing.Tracer; @@ -38,6 +39,7 @@ public class ApplicationService { ); private final ApplicationRepository applicationRepository; + private final InterviewEventRepository interviewEventRepository; private final ApplicationMapper applicationMapper; private final GamificationService gamificationService; private final InterviewMetricsService interviewMetricsService; @@ -45,12 +47,14 @@ public class ApplicationService { private final Tracer tracer; public ApplicationService(ApplicationRepository applicationRepository, + InterviewEventRepository interviewEventRepository, ApplicationMapper applicationMapper, GamificationService gamificationService, InterviewMetricsService interviewMetricsService, SecurityUtils securityUtils, Tracer tracer) { this.applicationRepository = applicationRepository; + this.interviewEventRepository = interviewEventRepository; this.applicationMapper = applicationMapper; this.gamificationService = gamificationService; this.interviewMetricsService = interviewMetricsService; @@ -141,6 +145,7 @@ public void delete(UUID id) { UUID userId = securityUtils.getCurrentUserId(); JobApplication app = applicationRepository.findByIdAndUserId(id, userId) .orElseThrow(() -> new ResourceNotFoundException("Application not found with id: " + id)); + interviewEventRepository.deleteByApplication_Id(app.getId()); applicationRepository.delete(app); } diff --git a/src/test/java/com/jobtracker/e2e/ApplicationE2ETest.java b/src/test/java/com/jobtracker/e2e/ApplicationE2ETest.java index 045a7a37..81c7a17e 100644 --- a/src/test/java/com/jobtracker/e2e/ApplicationE2ETest.java +++ b/src/test/java/com/jobtracker/e2e/ApplicationE2ETest.java @@ -1,9 +1,11 @@ package com.jobtracker.e2e; import com.jobtracker.repository.ApplicationRepository; +import com.jobtracker.repository.InterviewEventRepository; import com.jobtracker.repository.RefreshTokenRepository; import com.jobtracker.repository.UserAchievementRepository; import com.jobtracker.repository.UserGamificationRepository; +import com.jobtracker.repository.UserInterviewMetricsRepository; import com.jobtracker.repository.UserRepository; import io.restassured.response.Response; import org.junit.jupiter.api.BeforeEach; @@ -21,8 +23,10 @@ class ApplicationE2ETest extends AbstractE2ETest { @Autowired private UserRepository userRepository; @Autowired private RefreshTokenRepository refreshTokenRepository; @Autowired private ApplicationRepository applicationRepository; + @Autowired private InterviewEventRepository interviewEventRepository; @Autowired private UserGamificationRepository userGamificationRepository; @Autowired private UserAchievementRepository userAchievementRepository; + @Autowired private UserInterviewMetricsRepository userInterviewMetricsRepository; private String accessToken; @@ -30,8 +34,10 @@ class ApplicationE2ETest extends AbstractE2ETest { void setUp() { userAchievementRepository.deleteAll(); userGamificationRepository.deleteAll(); + interviewEventRepository.deleteAll(); applicationRepository.deleteAll(); refreshTokenRepository.deleteAll(); + userInterviewMetricsRepository.deleteAll(); userRepository.deleteAll(); Response register = given() diff --git a/src/test/java/com/jobtracker/e2e/AuthE2ETest.java b/src/test/java/com/jobtracker/e2e/AuthE2ETest.java index b72a1e4f..96efad5f 100644 --- a/src/test/java/com/jobtracker/e2e/AuthE2ETest.java +++ b/src/test/java/com/jobtracker/e2e/AuthE2ETest.java @@ -1,10 +1,12 @@ package com.jobtracker.e2e; import com.jobtracker.repository.ApplicationRepository; +import com.jobtracker.repository.InterviewEventRepository; import com.jobtracker.repository.PasswordResetTokenRepository; import com.jobtracker.repository.RefreshTokenRepository; import com.jobtracker.repository.UserAchievementRepository; import com.jobtracker.repository.UserGamificationRepository; +import com.jobtracker.repository.UserInterviewMetricsRepository; import com.jobtracker.repository.UserRepository; import io.restassured.http.Cookie; import io.restassured.response.Response; @@ -24,16 +26,20 @@ class AuthE2ETest extends AbstractE2ETest { @Autowired private RefreshTokenRepository refreshTokenRepository; @Autowired private PasswordResetTokenRepository passwordResetTokenRepository; @Autowired private ApplicationRepository applicationRepository; + @Autowired private InterviewEventRepository interviewEventRepository; @Autowired private UserGamificationRepository userGamificationRepository; @Autowired private UserAchievementRepository userAchievementRepository; + @Autowired private UserInterviewMetricsRepository userInterviewMetricsRepository; @BeforeEach void cleanDb() { userAchievementRepository.deleteAll(); userGamificationRepository.deleteAll(); + interviewEventRepository.deleteAll(); applicationRepository.deleteAll(); passwordResetTokenRepository.deleteAll(); refreshTokenRepository.deleteAll(); + userInterviewMetricsRepository.deleteAll(); userRepository.deleteAll(); } diff --git a/src/test/java/com/jobtracker/integration/AuthControllerIT.java b/src/test/java/com/jobtracker/integration/AuthControllerIT.java index 74b75a6f..c87cb66f 100644 --- a/src/test/java/com/jobtracker/integration/AuthControllerIT.java +++ b/src/test/java/com/jobtracker/integration/AuthControllerIT.java @@ -7,10 +7,12 @@ import com.jobtracker.dto.auth.RegisterRequest; import com.jobtracker.repository.ApplicationRepository; import com.jobtracker.repository.GoogleDriveConnectionRepository; +import com.jobtracker.repository.InterviewEventRepository; import com.jobtracker.repository.PasswordResetTokenRepository; import com.jobtracker.repository.RefreshTokenRepository; import com.jobtracker.repository.UserAchievementRepository; import com.jobtracker.repository.UserGamificationRepository; +import com.jobtracker.repository.UserInterviewMetricsRepository; import com.jobtracker.repository.UserRepository; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -40,17 +42,21 @@ class AuthControllerIT extends AbstractIntegrationTest { @Autowired private RefreshTokenRepository refreshTokenRepository; @Autowired private PasswordResetTokenRepository passwordResetTokenRepository; @Autowired private ApplicationRepository applicationRepository; + @Autowired private InterviewEventRepository interviewEventRepository; @Autowired private UserGamificationRepository userGamificationRepository; @Autowired private UserAchievementRepository userAchievementRepository; + @Autowired private UserInterviewMetricsRepository userInterviewMetricsRepository; @BeforeEach void cleanDb() { googleDriveConnectionRepository.deleteAll(); userAchievementRepository.deleteAll(); userGamificationRepository.deleteAll(); + interviewEventRepository.deleteAll(); applicationRepository.deleteAll(); passwordResetTokenRepository.deleteAll(); refreshTokenRepository.deleteAll(); + userInterviewMetricsRepository.deleteAll(); userRepository.deleteAll(); } diff --git a/src/test/java/com/jobtracker/integration/GamificationControllerIT.java b/src/test/java/com/jobtracker/integration/GamificationControllerIT.java index 8e68103c..4a279a03 100644 --- a/src/test/java/com/jobtracker/integration/GamificationControllerIT.java +++ b/src/test/java/com/jobtracker/integration/GamificationControllerIT.java @@ -6,10 +6,12 @@ import com.jobtracker.dto.gamification.GamificationEventRequest; import com.jobtracker.entity.enums.GamificationEventType; import com.jobtracker.repository.ApplicationRepository; +import com.jobtracker.repository.InterviewEventRepository; import com.jobtracker.repository.PasswordResetTokenRepository; import com.jobtracker.repository.RefreshTokenRepository; import com.jobtracker.repository.UserAchievementRepository; import com.jobtracker.repository.UserGamificationRepository; +import com.jobtracker.repository.UserInterviewMetricsRepository; import com.jobtracker.repository.UserRepository; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -43,19 +45,27 @@ class GamificationControllerIT extends AbstractIntegrationTest { @Autowired private ApplicationRepository applicationRepository; + @Autowired + private InterviewEventRepository interviewEventRepository; + @Autowired private UserGamificationRepository userGamificationRepository; @Autowired private UserAchievementRepository userAchievementRepository; + @Autowired + private UserInterviewMetricsRepository userInterviewMetricsRepository; + @BeforeEach void cleanDb() { userAchievementRepository.deleteAll(); userGamificationRepository.deleteAll(); + interviewEventRepository.deleteAll(); applicationRepository.deleteAll(); passwordResetTokenRepository.deleteAll(); refreshTokenRepository.deleteAll(); + userInterviewMetricsRepository.deleteAll(); userRepository.deleteAll(); } diff --git a/src/test/java/com/jobtracker/integration/GoogleDriveControllerIT.java b/src/test/java/com/jobtracker/integration/GoogleDriveControllerIT.java index ea289180..0f04d943 100644 --- a/src/test/java/com/jobtracker/integration/GoogleDriveControllerIT.java +++ b/src/test/java/com/jobtracker/integration/GoogleDriveControllerIT.java @@ -14,11 +14,13 @@ import com.jobtracker.repository.GoogleDriveBaseResumeRepository; import com.jobtracker.repository.GoogleDriveConnectionRepository; import com.jobtracker.repository.GoogleDriveOAuthStateRepository; +import com.jobtracker.repository.InterviewEventRepository; import com.jobtracker.repository.PasswordResetTokenRepository; import com.jobtracker.repository.RefreshTokenRepository; import com.jobtracker.repository.RoleRepository; import com.jobtracker.repository.UserAchievementRepository; import com.jobtracker.repository.UserGamificationRepository; +import com.jobtracker.repository.UserInterviewMetricsRepository; import com.jobtracker.repository.UserRepository; import com.jobtracker.service.GoogleDriveApiClient; import org.junit.jupiter.api.BeforeEach; @@ -58,6 +60,8 @@ class GoogleDriveControllerIT extends AbstractIntegrationTest { @Autowired private ApplicationRepository applicationRepository; @Autowired private UserGamificationRepository userGamificationRepository; @Autowired private UserAchievementRepository userAchievementRepository; + @Autowired private InterviewEventRepository interviewEventRepository; + @Autowired private UserInterviewMetricsRepository userInterviewMetricsRepository; @Autowired private GoogleDriveConnectionRepository googleDriveConnectionRepository; @Autowired private GoogleDriveBaseResumeRepository googleDriveBaseResumeRepository; @Autowired private GoogleDriveOAuthStateRepository googleDriveOAuthStateRepository; @@ -74,9 +78,11 @@ void setUp() throws Exception { googleDriveConnectionRepository.deleteAll(); userAchievementRepository.deleteAll(); userGamificationRepository.deleteAll(); + interviewEventRepository.deleteAll(); applicationRepository.deleteAll(); passwordResetTokenRepository.deleteAll(); refreshTokenRepository.deleteAll(); + userInterviewMetricsRepository.deleteAll(); userRepository.deleteAll(); RegisterRequest reg = new RegisterRequest("Drive User", "driveuser@example.com", "pass1234", "pass1234"); diff --git a/src/test/java/com/jobtracker/unit/ApplicationServiceTest.java b/src/test/java/com/jobtracker/unit/ApplicationServiceTest.java index d4f53a07..841c3d9d 100644 --- a/src/test/java/com/jobtracker/unit/ApplicationServiceTest.java +++ b/src/test/java/com/jobtracker/unit/ApplicationServiceTest.java @@ -8,6 +8,7 @@ import com.jobtracker.exception.ResourceNotFoundException; import com.jobtracker.mapper.ApplicationMapper; import com.jobtracker.repository.ApplicationRepository; +import com.jobtracker.repository.InterviewEventRepository; import com.jobtracker.service.ApplicationService; import com.jobtracker.service.GamificationService; import com.jobtracker.service.InterviewMetricsService; @@ -45,6 +46,7 @@ class ApplicationServiceTest { private static final UUID OTHER_UUID = UUID.fromString("00000000-0000-0000-0000-000000000099"); @Mock private ApplicationRepository applicationRepository; + @Mock private InterviewEventRepository interviewEventRepository; @Mock private ApplicationMapper applicationMapper; @Mock private GamificationService gamificationService; @Mock private InterviewMetricsService interviewMetricsService; @@ -236,6 +238,28 @@ void archive_shouldThrow_whenNotFound() { .isInstanceOf(ResourceNotFoundException.class); } + @Test + void delete_shouldRemoveInterviewEventsBeforeDeletingApplication() { + when(securityUtils.getCurrentUserId()).thenReturn(USER_UUID); + when(applicationRepository.findByIdAndUserId(APP_UUID, USER_UUID)).thenReturn(Optional.of(app)); + + applicationService.delete(APP_UUID); + + var inOrder = inOrder(interviewEventRepository, applicationRepository); + inOrder.verify(interviewEventRepository).deleteByApplication_Id(APP_UUID); + inOrder.verify(applicationRepository).delete(app); + } + + @Test + void delete_shouldThrow_whenApplicationNotFound() { + when(securityUtils.getCurrentUserId()).thenReturn(USER_UUID); + when(applicationRepository.findByIdAndUserId(OTHER_UUID, USER_UUID)).thenReturn(Optional.empty()); + + assertThatThrownBy(() -> applicationService.delete(OTHER_UUID)) + .isInstanceOf(ResourceNotFoundException.class); + verifyNoInteractions(interviewEventRepository); + } + @SuppressWarnings("unchecked") @Test void getAll_shouldReturnPagedResponse() {