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
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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")
Expand Down Expand Up @@ -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)
Expand All @@ -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)
Expand Down Expand Up @@ -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
);
}
}
5 changes: 3 additions & 2 deletions src/test/java/com/jobtracker/unit/ApplicationServiceTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -179,6 +179,7 @@ void update_shouldClearApplicationDate_whenMarkedToSendLater() {
null,
false,
"Follow up this week",
null,
null
);
when(securityUtils.getCurrentUserId()).thenReturn(USER_UUID);
Expand Down Expand Up @@ -351,14 +352,14 @@ 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
);
}

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());
}
}
41 changes: 12 additions & 29 deletions src/test/java/com/jobtracker/unit/InterviewMetricsServiceTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,55 +2,46 @@

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;

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"));

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
Expand All @@ -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<UserInterviewMetrics> 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());
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -238,6 +238,6 @@ private static ApplicationResponse applicationResponseWithId(UUID id) {
null,
false, null,
null, null, null, null, null,
null, null);
0, null, null);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -220,6 +220,6 @@ private static ApplicationResponse applicationResponseWithId(UUID id) {
null,
false, null,
null, null, null, null, null,
null, null);
0, null, null);
}
}
Loading