diff --git a/src/main/java/com/jobtracker/service/InterviewMetricsService.java b/src/main/java/com/jobtracker/service/InterviewMetricsService.java index 8c07df23..15dfe907 100644 --- a/src/main/java/com/jobtracker/service/InterviewMetricsService.java +++ b/src/main/java/com/jobtracker/service/InterviewMetricsService.java @@ -61,6 +61,8 @@ public void recordStatusTransition(JobApplication application, return; } + application.setInterviewCount(application.getInterviewCount() + 1); + InterviewEvent event = new InterviewEvent(); event.setUser(application.getUser()); event.setApplication(application); diff --git a/src/test/java/com/jobtracker/integration/ApplicationControllerIT.java b/src/test/java/com/jobtracker/integration/ApplicationControllerIT.java index 4b4f9e5a..c1703b5d 100644 --- a/src/test/java/com/jobtracker/integration/ApplicationControllerIT.java +++ b/src/test/java/com/jobtracker/integration/ApplicationControllerIT.java @@ -294,7 +294,7 @@ void applicationLifecycle_shouldAutoAwardXpAndAvoidDuplicates() throws Exception ApplicationRequest createRequest = new ApplicationRequest( "Gamified App", "Recruiter", "Org", "https://example.com/job", LocalDate.now(), - false, false, null, "RH", false, null, null + false, false, null, "RH", false, null, null, null ); MvcResult createResult = mockMvc.perform(post("/api/v1/applications") @@ -339,7 +339,7 @@ void applicationLifecycle_shouldAutoAwardXpAndAvoidDuplicates() throws Exception ApplicationRequest addNoteRequest = new ApplicationRequest( "Gamified App", "Recruiter", "Org", "https://example.com/job", LocalDate.now(), - false, false, null, "Teste Técnico", false, "First note", null + false, false, null, "Teste Técnico", false, "First note", null, null ); mockMvc.perform(put("/api/v1/applications/{id}", id) @@ -352,7 +352,7 @@ void applicationLifecycle_shouldAutoAwardXpAndAvoidDuplicates() throws Exception ApplicationRequest updateNoteRequest = new ApplicationRequest( "Gamified App", "Recruiter", "Org", "https://example.com/job", LocalDate.now(), - false, false, null, "Teste Técnico", false, "Edited note", null + false, false, null, "Teste Técnico", false, "Edited note", null, null ); mockMvc.perform(put("/api/v1/applications/{id}", id) @@ -382,7 +382,7 @@ private ApplicationRequest buildRequest(String vacancyName) { return new ApplicationRequest( vacancyName, "Some Recruiter", "HR Department", "https://example.com/job", LocalDate.now().minusDays(1), - false, false, null, "RH", false, "Remember to follow up", null + false, false, null, "RH", false, "Remember to follow up", null, null ); } } diff --git a/src/test/java/com/jobtracker/unit/ApplicationServiceTest.java b/src/test/java/com/jobtracker/unit/ApplicationServiceTest.java index 3ec79bca..2bae2923 100644 --- a/src/test/java/com/jobtracker/unit/ApplicationServiceTest.java +++ b/src/test/java/com/jobtracker/unit/ApplicationServiceTest.java @@ -179,6 +179,7 @@ void update_shouldClearApplicationDate_whenMarkedToSendLater() { null, false, "Follow up this week", + null, null ); when(securityUtils.getCurrentUserId()).thenReturn(USER_UUID); @@ -351,7 +352,7 @@ private ApplicationRequest buildRequest() { return new ApplicationRequest( "Software Engineer", "Recruiter", "HR", "https://example.com/job", LocalDate.now(), - false, false, null, "RH", false, "Follow up this week", null + false, false, null, "RH", false, "Follow up this week", null, null ); } @@ -359,6 +360,6 @@ private ApplicationResponse buildApplicationResponse(UUID id) { return new ApplicationResponse(id, "Software Engineer", "Recruiter", "HR", "https://example.com/job", LocalDate.now(), false, false, null, "RH", null, false, LocalDateTime.now(), "Follow up this week", null, false, null, null, null, null, null, null, - LocalDateTime.now(), LocalDateTime.now()); + 0, LocalDateTime.now(), LocalDateTime.now()); } } diff --git a/src/test/java/com/jobtracker/unit/InterviewMetricsServiceTest.java b/src/test/java/com/jobtracker/unit/InterviewMetricsServiceTest.java index e8fd7391..41e4f26d 100644 --- a/src/test/java/com/jobtracker/unit/InterviewMetricsServiceTest.java +++ b/src/test/java/com/jobtracker/unit/InterviewMetricsServiceTest.java @@ -2,32 +2,28 @@ import com.jobtracker.entity.JobApplication; import com.jobtracker.entity.User; -import com.jobtracker.entity.UserInterviewMetrics; import com.jobtracker.entity.enums.ApplicationStatus; +import com.jobtracker.repository.ApplicationRepository; import com.jobtracker.repository.InterviewEventRepository; -import com.jobtracker.repository.UserInterviewMetricsRepository; import com.jobtracker.service.InterviewMetricsService; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; -import org.mockito.ArgumentCaptor; import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; -import java.util.Optional; import java.util.UUID; import static org.assertj.core.api.Assertions.assertThat; import static org.mockito.ArgumentMatchers.any; import static org.mockito.Mockito.never; import static org.mockito.Mockito.verify; -import static org.mockito.Mockito.when; @ExtendWith(MockitoExtension.class) class InterviewMetricsServiceTest { @Mock - private UserInterviewMetricsRepository metricsRepository; + private ApplicationRepository applicationRepository; @Mock private InterviewEventRepository eventRepository; @@ -35,11 +31,10 @@ class InterviewMetricsServiceTest { private InterviewMetricsService service; private User user; private JobApplication application; - private UserInterviewMetrics metrics; @BeforeEach void setUp() { - service = new InterviewMetricsService(metricsRepository, eventRepository); + service = new InterviewMetricsService(applicationRepository, eventRepository); user = new User(); user.setId(UUID.fromString("00000000-0000-0000-0000-000000000001")); @@ -47,10 +42,6 @@ void setUp() { application = new JobApplication(); application.setId(UUID.fromString("00000000-0000-0000-0000-000000000002")); application.setUser(user); - - metrics = new UserInterviewMetrics(); - metrics.setUser(user); - metrics.setInterviewCount(2); } @Test @@ -72,35 +63,27 @@ void wasInterviewTriggered_shouldOnlyDetectEntryIntoInterviewStatus() { } @Test - void recordStatusTransition_shouldIncrementAndLogWhenEnteringInterviewStatus() { - when(metricsRepository.findByUser_Id(user.getId())).thenReturn(Optional.of(metrics)); - + void recordStatusTransition_shouldIncrementCountAndLogEventWhenEnteringInterviewStatus() { service.recordStatusTransition(application, ApplicationStatus.RH, ApplicationStatus.TESTE_TECNICO); - assertThat(metrics.getInterviewCount()).isEqualTo(3); - verify(metricsRepository).save(metrics); + assertThat(application.getInterviewCount()).isEqualTo(1); verify(eventRepository).save(any()); } @Test - void recordStatusTransition_shouldCreateMetricsWhenMissing() { - when(metricsRepository.findByUser_Id(user.getId())).thenReturn(Optional.empty()); - when(metricsRepository.save(any(UserInterviewMetrics.class))).thenAnswer(invocation -> invocation.getArgument(0)); - - service.recordStatusTransition(application, ApplicationStatus.RH, ApplicationStatus.TESTE_TECNICO); + void recordStatusTransition_shouldNotIncrementWhenStayingWithinInterviewStatuses() { + service.recordStatusTransition(application, ApplicationStatus.TESTE_TECNICO, ApplicationStatus.RH_NEGOCIACAO); - ArgumentCaptor metricsCaptor = ArgumentCaptor.forClass(UserInterviewMetrics.class); - verify(metricsRepository).save(metricsCaptor.capture()); - assertThat(metricsCaptor.getAllValues().getLast().getInterviewCount()).isEqualTo(1); - verify(eventRepository).save(any()); + assertThat(application.getInterviewCount()).isEqualTo(0); + verify(eventRepository, never()).save(any()); } @Test - void recordStatusTransition_shouldNotDoubleCountRepeatedSavesOrInterviewFlowMoves() { + void recordStatusTransition_shouldNotIncrementForNonInterviewTransitions() { service.recordStatusTransition(application, ApplicationStatus.TESTE_TECNICO, ApplicationStatus.TESTE_TECNICO); - service.recordStatusTransition(application, ApplicationStatus.TESTE_TECNICO, ApplicationStatus.RH_NEGOCIACAO); + service.recordStatusTransition(application, ApplicationStatus.RH, ApplicationStatus.REJEITADO); - verify(metricsRepository, never()).save(any()); + assertThat(application.getInterviewCount()).isEqualTo(0); verify(eventRepository, never()).save(any()); } } diff --git a/src/test/java/com/jobtracker/unit/mcp/McpAnalyticsToolsTest.java b/src/test/java/com/jobtracker/unit/mcp/McpAnalyticsToolsTest.java index a932ddc1..72d3cd90 100644 --- a/src/test/java/com/jobtracker/unit/mcp/McpAnalyticsToolsTest.java +++ b/src/test/java/com/jobtracker/unit/mcp/McpAnalyticsToolsTest.java @@ -238,6 +238,6 @@ private static ApplicationResponse applicationResponseWithId(UUID id) { null, false, null, null, null, null, null, null, - null, null); + 0, null, null); } } diff --git a/src/test/java/com/jobtracker/unit/mcp/McpApplicationToolsTest.java b/src/test/java/com/jobtracker/unit/mcp/McpApplicationToolsTest.java index 7432dd77..b40dfcc3 100644 --- a/src/test/java/com/jobtracker/unit/mcp/McpApplicationToolsTest.java +++ b/src/test/java/com/jobtracker/unit/mcp/McpApplicationToolsTest.java @@ -220,6 +220,6 @@ private static ApplicationResponse applicationResponseWithId(UUID id) { null, false, null, null, null, null, null, null, - null, null); + 0, null, null); } }