values, double mean, double stdDev) {
if (values.size() < 4) {
return false;
diff --git a/src/main/java/leonardo/labutilities/qualitylabpro/utils/constants/EmailTemplate.java b/src/main/java/leonardo/labutilities/qualitylabpro/utils/constants/EmailTemplate.java
index 5c820b3..ebb2605 100644
--- a/src/main/java/leonardo/labutilities/qualitylabpro/utils/constants/EmailTemplate.java
+++ b/src/main/java/leonardo/labutilities/qualitylabpro/utils/constants/EmailTemplate.java
@@ -21,6 +21,16 @@ public class EmailTemplate {
""";
+ public static final String TABLE_ROW = """
+
+ %s |
+ %s |
+ %s |
+ %s |
+ %s |
+ %s |
+ %s |
+
""";
public static final String ANALYTICS_WARNING_HEADER = """
⚠️ Quality Control Alert: Westgard violations
diff --git a/src/main/resources/application-local.properties b/src/main/resources/application-local.properties
index 1d56976..35c0f8c 100644
--- a/src/main/resources/application-local.properties
+++ b/src/main/resources/application-local.properties
@@ -46,4 +46,4 @@ email.to.send.list=${EMAIL_TO_SEND_LIST}
# = SECURITY CONFIGURATION
# ===============================
api.security.token.secret=${API_SECURITY_TOKEN_SECRET}
-api.security.issuer=${API_SECURITY_ISSUER}
\ No newline at end of file
+api.security.issuer=${API_SECURITY_ISSUER}
diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties
index 392bcdb..31ad475 100644
--- a/src/main/resources/application.properties
+++ b/src/main/resources/application.properties
@@ -32,10 +32,9 @@ spring.jpa.show-sql=false
spring.jpa.open-in-view=false
# Database Connection Pool
-spring.datasource.tomcat.validation-query=SELECT 1
-spring.datasource.tomcat.test-on-borrow=true
-spring.datasource.tomcat.test-while-idle=true
-spring.datasource.tomcat.validation-interval=60000
+spring.datasource.hikari.maximum-pool-size=5
+spring.datasource.hikari.minimum-idle=1
+spring.datasource.hikari.idle-timeout=300000
# ===============================
# = EMAIL CONFIGURATION
diff --git a/src/test/java/leonardo/labutilities/qualitylabpro/controllers/BiochemistryAnalyticControllerTest.java b/src/test/java/leonardo/labutilities/qualitylabpro/controllers/BiochemistryAnalyticControllerTest.java
index ebf7e83..6fb671e 100644
--- a/src/test/java/leonardo/labutilities/qualitylabpro/controllers/BiochemistryAnalyticControllerTest.java
+++ b/src/test/java/leonardo/labutilities/qualitylabpro/controllers/BiochemistryAnalyticControllerTest.java
@@ -24,7 +24,8 @@
import org.springframework.test.context.ActiveProfiles;
import org.springframework.test.context.bean.override.mockito.MockitoBean;
import org.springframework.test.web.servlet.MockMvc;
-
+import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
import java.util.List;
import static leonardo.labutilities.qualitylabpro.utils.AnalyticsHelperMocks.createSampleRecordList;
@@ -38,116 +39,114 @@
@AutoConfigureJsonTesters
@ActiveProfiles("test")
public class BiochemistryAnalyticControllerTest {
- @Autowired
- private MockMvc mockMvc;
-
- @MockitoBean
- private TokenService tokenService;
-
- @MockitoBean
- private UserRepository userRepository;
-
- @MockitoBean
- private BiochemistryAnalyticService biochemistryAnalyticsService;
-
- @Autowired
- private JacksonTester> jacksonGenericValuesRecord;
-
- @Autowired
- private JacksonTester jacksonUpdateAnalyticsMeanRecord;
-
- @Test
- @DisplayName("It should return a list of all analytics by level")
- void getAllAnalytics_by_level_return_list() throws Exception {
- List records = createSampleRecordList();
- Page page = new PageImpl<>(records);
-
- when(biochemistryAnalyticsService.findAnalyticsByNameInByLevel(anyList(), any(), any(), any(),
- any(Pageable.class)))
- .thenReturn(page);
-
- mockMvc.perform(get("/biochemistry-analytics/level-date-range")
- .param("level", "PCCC1")
- .param("startDate", "2025-01-01 00:00:00")
- .param("endDate", "2025-01-05 00:00:00"))
- .andExpect(status().isOk());
-
- verify(biochemistryAnalyticsService, times(1))
- .findAnalyticsByNameInByLevel(anyList(), any(), any(), any(), any(Pageable.class));
- }
-
- @Test
- @DisplayName("It should return HTTP code 201 when analytics records are saved")
- void analytics_post_return_201() throws Exception {
- List records = createSampleRecordList();
- mockMvc.perform(post("/biochemistry-analytics").contentType(MediaType.APPLICATION_JSON)
- .content(jacksonGenericValuesRecord.write(records).getJson()))
- .andExpect(status().isCreated());
- verify(biochemistryAnalyticsService, times(1)).saveNewAnalyticsRecords(anyList());
- }
-
- @Test
- @DisplayName("It should return HTTP code 204 when analytics records are updated")
- void analytics_put_return_204() throws Exception {
- var mockDto = new UpdateAnalyticsMeanDTO("Glucose", "PCCC1", "1234", 10.5);
- mockMvc.perform(patch("/biochemistry-analytics").contentType(MediaType.APPLICATION_JSON)
- .content(jacksonUpdateAnalyticsMeanRecord.write(mockDto).getJson()))
- .andExpect(status().isNoContent());
- verify(biochemistryAnalyticsService, times(1))
- .updateAnalyticsMeanByNameAndLevelAndLevelLot("Glucose", "PCCC1", "1234", 10.5);
- }
-
- @Test
- @DisplayName("It should return a list of all analytics with pagination")
- void getAllAnalytics_return_list() throws Exception {
- List records = createSampleRecordList();
- Page page = new PageImpl<>(records);
-
- when(biochemistryAnalyticsService.findAnalyticsPagedByNameIn(anyList(), any(Pageable.class)))
- .thenReturn(page);
-
- mockMvc.perform(get("/biochemistry-analytics")
- .param("page", "0")
- .param("size", "10"))
- .andExpect(status().isOk());
-
- verify(biochemistryAnalyticsService, times(1))
- .findAnalyticsPagedByNameIn(anyList(), any(Pageable.class));
- }
-
-
- @Test
- @DisplayName("It should return analytics records for a date range")
- @WithMockUser(username = "admin", roles = {"ADMIN"})
- void getAnalyticsByDateRange_return_analytics() throws Exception {
- Page records = new PageImpl<>(createSampleRecordList());
-
- when(biochemistryAnalyticsService.findAnalyticsByNameInAndDateBetween(anyList(), any(), any(), any()))
- .thenReturn(records);
-
- mockMvc.perform(get("/biochemistry-analytics/date-range")
- .param("startDate", "2025-01-01 00:00:00").param("endDate",
- "2025-01-05 00:00:00"))
- .andExpect(status().isOk());
-
- verify(biochemistryAnalyticsService, times(1))
- .findAnalyticsByNameInAndDateBetween(anyList(), any(), any(), any());
- }
-
- @Test
- @DisplayName("It should return mean and standard deviation for a date range")
- @WithMockUser(username = "admin", roles = {"ADMIN"})
- void getMeanAndStandardDeviation_return_result() throws Exception {
- MeanAndStdDeviationDTO result = new MeanAndStdDeviationDTO(10.5, 2.3);
- when(biochemistryAnalyticsService.calculateMeanAndStandardDeviation(any(), any(), any(),
- any())).thenReturn(result);
-
- mockMvc.perform(get("/biochemistry-analytics/mean-standard-deviation")
- .param("name", "Hemoglobin").param("level", "High")
- .param("startDate", "2025-01-01 00:00:00").param("endDate", "2025-01-05 00:00:00"))
- .andExpect(status().isOk());
-
- verify(biochemistryAnalyticsService, times(1)).calculateMeanAndStandardDeviation(any(),
- any(), any(), any());
- }
+ @Autowired
+ private MockMvc mockMvc;
+
+ @MockitoBean
+ private TokenService tokenService;
+
+ @MockitoBean
+ private UserRepository userRepository;
+
+ @MockitoBean
+ private BiochemistryAnalyticService biochemistryAnalyticsService;
+
+ @Autowired
+ private JacksonTester> jacksonGenericValuesRecord;
+
+ @Autowired
+ private JacksonTester jacksonUpdateAnalyticsMeanRecord;
+
+ @Test
+ @DisplayName("It should return a list of all analytics by level")
+ void getAllAnalytics_by_level_return_list() throws Exception {
+ List records = createSampleRecordList();
+ Page page = new PageImpl<>(records);
+
+ when(biochemistryAnalyticsService.findAnalyticsByNameInByLevel(anyList(), any(), any(),
+ any(), any(Pageable.class))).thenReturn(page);
+
+ mockMvc.perform(get("/biochemistry-analytics/level-date-range").param("level", "PCCC1")
+ .param("startDate", "2025-01-01 00:00:00").param("endDate", "2025-01-05 00:00:00"))
+ .andExpect(status().isOk());
+
+ verify(biochemistryAnalyticsService, times(1)).findAnalyticsByNameInByLevel(anyList(),
+ any(), any(), any(), any(Pageable.class));
+ }
+
+ @Test
+ @DisplayName("It should return HTTP code 201 when analytics records are saved")
+ void analytics_post_return_201() throws Exception {
+ List records = createSampleRecordList();
+ mockMvc.perform(post("/biochemistry-analytics").contentType(MediaType.APPLICATION_JSON)
+ .content(jacksonGenericValuesRecord.write(records).getJson()))
+ .andExpect(status().isCreated());
+ verify(biochemistryAnalyticsService, times(1)).saveNewAnalyticsRecords(anyList());
+ }
+
+ @Test
+ @DisplayName("It should return HTTP code 204 when analytics records are updated")
+ void analytics_put_return_204() throws Exception {
+ var mockDto = new UpdateAnalyticsMeanDTO("Glucose", "PCCC1", "1234", 10.5);
+ mockMvc.perform(patch("/biochemistry-analytics").contentType(MediaType.APPLICATION_JSON)
+ .content(jacksonUpdateAnalyticsMeanRecord.write(mockDto).getJson()))
+ .andExpect(status().isNoContent());
+ verify(biochemistryAnalyticsService, times(1))
+ .updateAnalyticsMeanByNameAndLevelAndLevelLot("Glucose", "PCCC1", "1234", 10.5);
+ }
+
+ @Test
+ @DisplayName("It should return a list of all analytics with pagination")
+ void getAllAnalytics_return_list() throws Exception {
+ List records = createSampleRecordList();
+ Page page = new PageImpl<>(records);
+
+ when(biochemistryAnalyticsService.findAnalyticsPagedByNameIn(anyList(),
+ any(Pageable.class))).thenReturn(page);
+
+ mockMvc.perform(get("/biochemistry-analytics").param("page", "0").param("size", "10"))
+ .andExpect(status().isOk());
+
+ verify(biochemistryAnalyticsService, times(1)).findAnalyticsPagedByNameIn(anyList(),
+ any(Pageable.class));
+ }
+
+
+ @Test
+ @DisplayName("It should return analytics records for a date range")
+ @WithMockUser(username = "admin", roles = {"ADMIN"})
+ void getAnalyticsByDateRange_return_analytics() throws Exception {
+ Page records = new PageImpl<>(createSampleRecordList());
+
+ when(biochemistryAnalyticsService.findAnalyticsByNameInAndDateBetween(anyList(), any(),
+ any(), any())).thenReturn(records);
+
+ mockMvc.perform(get("/biochemistry-analytics/date-range")
+ .param("startDate", "2025-01-01 00:00:00").param("endDate", "2025-01-05 00:00:00"))
+ .andExpect(status().isOk());
+
+ verify(biochemistryAnalyticsService, times(1))
+ .findAnalyticsByNameInAndDateBetween(anyList(), any(), any(), any());
+ }
+
+ @Test
+ @DisplayName("It should return mean and standard deviation for a date range")
+ void getMeanAndStandardDeviation_return_result() throws Exception {
+ MeanAndStdDeviationDTO result = new MeanAndStdDeviationDTO(10.5, 2.3);
+ LocalDateTime startDate = LocalDateTime.parse("2025-01-01 00:00:00",
+ DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
+ LocalDateTime endDate = LocalDateTime.parse("2025-01-05 00:00:00",
+ DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
+
+ when(biochemistryAnalyticsService.calculateMeanAndStandardDeviation(eq("Hemoglobin"),
+ eq("High"), eq(startDate), eq(endDate), any(Pageable.class))).thenReturn(result);
+
+ mockMvc.perform(get("/biochemistry-analytics/mean-standard-deviation")
+ .param("name", "Hemoglobin").param("level", "High")
+ .param("startDate", "2025-01-01 00:00:00").param("endDate", "2025-01-05 00:00:00")
+ .param("page", "0").param("size", "10")).andExpect(status().isOk());
+
+ verify(biochemistryAnalyticsService).calculateMeanAndStandardDeviation(eq("Hemoglobin"),
+ eq("High"), eq(startDate), eq(endDate), any(Pageable.class));
+ }
}
diff --git a/src/test/java/leonardo/labutilities/qualitylabpro/controllers/CoagulationAnalyticControllerTest.java b/src/test/java/leonardo/labutilities/qualitylabpro/controllers/CoagulationAnalyticControllerTest.java
index 84fb80c..3102a18 100644
--- a/src/test/java/leonardo/labutilities/qualitylabpro/controllers/CoagulationAnalyticControllerTest.java
+++ b/src/test/java/leonardo/labutilities/qualitylabpro/controllers/CoagulationAnalyticControllerTest.java
@@ -19,13 +19,18 @@
import org.springframework.data.domain.PageImpl;
import org.springframework.data.domain.Pageable;
import org.springframework.http.MediaType;
+import org.springframework.security.test.context.support.WithMockUser;
import org.springframework.test.context.ActiveProfiles;
import org.springframework.test.context.bean.override.mockito.MockitoBean;
import org.springframework.test.web.servlet.MockMvc;
-
+import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
import java.util.List;
import static leonardo.labutilities.qualitylabpro.utils.AnalyticsHelperMocks.createSampleRecordList;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.anyList;
+import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.*;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post;
@@ -38,100 +43,100 @@
@ActiveProfiles("test")
public class CoagulationAnalyticControllerTest {
- @Autowired
- private MockMvc mockMvc;
-
- @MockitoBean
- private TokenService tokenService;
-
- @MockitoBean
- private UserRepository userRepository;
-
- @MockitoBean
- private CoagulationAnalyticService coagulationAnalyticsService;
-
- @Autowired
- private JacksonTester> jacksonGenericValuesRecord;
-
- @Test
- @DisplayName("It should return a list of all analytics by level")
- void getAllAnalytics_by_level_return_list() throws Exception {
- List records = createSampleRecordList();
- Page page = new PageImpl<>(records);
-
- when(coagulationAnalyticsService
- .findAnalyticsByNameInByLevel(anyList(), any(), any(), any(), any(Pageable.class)))
- .thenReturn(page);
-
- mockMvc.perform(get("/coagulation-analytics/level-date-range")
- .param("level", "PCCC1")
- .param("startDate", "2025-01-01 00:00:00")
- .param("endDate", "2025-01-05 00:00:00"))
- .andExpect(status().isOk());
-
- verify(coagulationAnalyticsService, times(1))
- .findAnalyticsByNameInByLevel(anyList(), any(), any(), any(), any(Pageable.class));
- }
-
- @Test
- @DisplayName("It should return HTTP code 201 when analytics records are saved")
- void analytics_post_return_201() throws Exception {
- List records = createSampleRecordList();
- mockMvc.perform(post("/coagulation-analytics").contentType(MediaType.APPLICATION_JSON)
- .content(jacksonGenericValuesRecord.write(records).getJson()))
- .andExpect(status().isCreated());
- verify(coagulationAnalyticsService, times(1)).saveNewAnalyticsRecords(anyList());
- }
-
- @Test
- @DisplayName("It should return a list of all analytics with pagination")
- void getAllAnalytics_return_list() throws Exception {
- List records = createSampleRecordList();
- Page page = new PageImpl<>(records);
-
- when(coagulationAnalyticsService.findAnalyticsPagedByNameIn(anyList(), any(Pageable.class)))
- .thenReturn(page);
-
- mockMvc.perform(get("/coagulation-analytics")
- .param("page", "0")
- .param("size", "10"))
- .andExpect(status().isOk());
-
- verify(coagulationAnalyticsService, times(1))
- .findAnalyticsPagedByNameIn(anyList(), any(Pageable.class));
- }
-
- @Test
- @DisplayName("It should return analytics records for a date range")
- void getAnalyticsByDateRange_return_analytics() throws Exception {
- List records = createSampleRecordList();
- Page page = new PageImpl<>(records);
-
-
- when(coagulationAnalyticsService.findAnalyticsByNameInAndDateBetween(anyList(), any(), any(), any()))
- .thenReturn(page);
-
- mockMvc.perform(get("/coagulation-analytics/date-range")
- .param("startDate", "2025-01-01 00:00:00").param("endDate", "2025-01-05 00:00:00"))
- .andExpect(status().isOk());
-
- verify(coagulationAnalyticsService, times(1))
- .findAnalyticsByNameInAndDateBetween(anyList(), any(), any(), any());
- }
-
- @Test
- @DisplayName("It should return mean and standard deviation for a date range")
- void getMeanAndStandardDeviation_return_result() throws Exception {
- MeanAndStdDeviationDTO result = new MeanAndStdDeviationDTO(10.5, 2.3);
- when(coagulationAnalyticsService.calculateMeanAndStandardDeviation(any(), any(), any(),
- any())).thenReturn(result);
-
- mockMvc.perform(get("/coagulation-analytics/mean-standard-deviation")
- .param("name", "Hemoglobin").param("level", "High")
- .param("startDate", "2025-01-01 00:00:00").param("endDate", "2025-01-05 00:00:00"))
- .andExpect(status().isOk());
-
- verify(coagulationAnalyticsService, times(1)).calculateMeanAndStandardDeviation(any(),
- any(), any(), any());
- }
+ @Autowired
+ private MockMvc mockMvc;
+
+ @MockitoBean
+ private TokenService tokenService;
+
+ @MockitoBean
+ private UserRepository userRepository;
+
+ @MockitoBean
+ private CoagulationAnalyticService coagulationAnalyticsService;
+
+ @Autowired
+ private JacksonTester> jacksonGenericValuesRecord;
+
+ @Test
+ @DisplayName("It should return a list of all analytics by level")
+ void getAllAnalytics_by_level_return_list() throws Exception {
+ List records = createSampleRecordList();
+ Page page = new PageImpl<>(records);
+
+ when(coagulationAnalyticsService.findAnalyticsByNameInByLevel(anyList(), any(), any(),
+ any(), any(Pageable.class))).thenReturn(page);
+
+ mockMvc.perform(get("/coagulation-analytics/level-date-range").param("level", "PCCC1")
+ .param("startDate", "2025-01-01 00:00:00").param("endDate", "2025-01-05 00:00:00"))
+ .andExpect(status().isOk());
+
+ verify(coagulationAnalyticsService, times(1)).findAnalyticsByNameInByLevel(anyList(), any(),
+ any(), any(), any(Pageable.class));
+ }
+
+ @Test
+ @DisplayName("It should return HTTP code 201 when analytics records are saved")
+ void analytics_post_return_201() throws Exception {
+ List records = createSampleRecordList();
+ mockMvc.perform(post("/coagulation-analytics").contentType(MediaType.APPLICATION_JSON)
+ .content(jacksonGenericValuesRecord.write(records).getJson()))
+ .andExpect(status().isCreated());
+ verify(coagulationAnalyticsService, times(1)).saveNewAnalyticsRecords(anyList());
+ }
+
+ @Test
+ @DisplayName("It should return a list of all analytics with pagination")
+ void getAllAnalytics_return_list() throws Exception {
+ List records = createSampleRecordList();
+ Page page = new PageImpl<>(records);
+
+ when(coagulationAnalyticsService.findAnalyticsPagedByNameIn(anyList(), any(Pageable.class)))
+ .thenReturn(page);
+
+ mockMvc.perform(get("/coagulation-analytics").param("page", "0").param("size", "10"))
+ .andExpect(status().isOk());
+
+ verify(coagulationAnalyticsService, times(1)).findAnalyticsPagedByNameIn(anyList(),
+ any(Pageable.class));
+ }
+
+ @Test
+ @DisplayName("It should return analytics records for a date range")
+ void getAnalyticsByDateRange_return_analytics() throws Exception {
+ List records = createSampleRecordList();
+ Page page = new PageImpl<>(records);
+
+
+ when(coagulationAnalyticsService.findAnalyticsByNameInAndDateBetween(anyList(), any(),
+ any(), any())).thenReturn(page);
+
+ mockMvc.perform(get("/coagulation-analytics/date-range")
+ .param("startDate", "2025-01-01 00:00:00").param("endDate", "2025-01-05 00:00:00"))
+ .andExpect(status().isOk());
+
+ verify(coagulationAnalyticsService, times(1)).findAnalyticsByNameInAndDateBetween(anyList(),
+ any(), any(), any());
+ }
+
+ @Test
+ @DisplayName("It should return mean and standard deviation for a date range")
+ void getMeanAndStandardDeviation_return_result() throws Exception {
+ MeanAndStdDeviationDTO result = new MeanAndStdDeviationDTO(10.5, 2.3);
+ LocalDateTime startDate = LocalDateTime.parse("2025-01-01 00:00:00",
+ DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
+ LocalDateTime endDate = LocalDateTime.parse("2025-01-05 00:00:00",
+ DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
+
+ when(coagulationAnalyticsService.calculateMeanAndStandardDeviation(eq("Hemoglobin"),
+ eq("High"), eq(startDate), eq(endDate), any(Pageable.class))).thenReturn(result);
+
+ mockMvc.perform(get("/coagulation-analytics/mean-standard-deviation")
+ .param("name", "Hemoglobin").param("level", "High")
+ .param("startDate", "2025-01-01 00:00:00").param("endDate", "2025-01-05 00:00:00")
+ .param("page", "0").param("size", "10")).andExpect(status().isOk());
+
+ verify(coagulationAnalyticsService).calculateMeanAndStandardDeviation(eq("Hemoglobin"),
+ eq("High"), eq(startDate), eq(endDate), any(Pageable.class));
+ }
}
diff --git a/src/test/java/leonardo/labutilities/qualitylabpro/controllers/HematologyAnalyticControllerTest.java b/src/test/java/leonardo/labutilities/qualitylabpro/controllers/HematologyAnalyticControllerTest.java
index f3211d7..8f4a93a 100644
--- a/src/test/java/leonardo/labutilities/qualitylabpro/controllers/HematologyAnalyticControllerTest.java
+++ b/src/test/java/leonardo/labutilities/qualitylabpro/controllers/HematologyAnalyticControllerTest.java
@@ -19,13 +19,18 @@
import org.springframework.data.domain.PageImpl;
import org.springframework.data.domain.Pageable;
import org.springframework.http.MediaType;
+import org.springframework.security.test.context.support.WithMockUser;
import org.springframework.test.context.ActiveProfiles;
import org.springframework.test.context.bean.override.mockito.MockitoBean;
import org.springframework.test.web.servlet.MockMvc;
-
+import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
import java.util.List;
import static leonardo.labutilities.qualitylabpro.utils.AnalyticsHelperMocks.createSampleRecordList;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.anyList;
+import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.*;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post;
@@ -38,101 +43,100 @@
@ActiveProfiles("test")
public class HematologyAnalyticControllerTest {
- @MockitoBean
- private TokenService tokenService;
-
- @MockitoBean
- private UserRepository userRepository;
-
- @Autowired
- private MockMvc mockMvc;
-
- @MockitoBean
- private HematologyAnalyticService hematologyAnalyticsService;
-
- @Autowired
- private JacksonTester> jacksonGenericValuesRecord;
-
- @Test
- @DisplayName("It should return a list of all analytics by level")
- void getAllAnalytics_by_level_return_list() throws Exception {
- List records = createSampleRecordList();
- Page page = new PageImpl<>(records);
-
- when(hematologyAnalyticsService
- .findAnalyticsByNameInByLevel(anyList(), any(), any(), any(), any(Pageable.class)))
- .thenReturn(page);
-
- mockMvc.perform(get("/hematology-analytics/level-date-range")
- .param("level", "PCCC1")
- .param("startDate", "2025-01-01 00:00:00")
- .param("endDate", "2025-01-05 00:00:00"))
- .andExpect(status().isOk());
-
- verify(hematologyAnalyticsService, times(1))
- .findAnalyticsByNameInByLevel(anyList(), any(), any(), any(), any(Pageable.class));
- }
-
- @Test
- @DisplayName("It should return HTTP code 201 when analytics records are saved")
- void analytics_post_return_201() throws Exception {
- List records = createSampleRecordList();
- mockMvc.perform(post("/hematology-analytics").contentType(MediaType.APPLICATION_JSON)
- .content(jacksonGenericValuesRecord.write(records).getJson()))
- .andExpect(status().isCreated());
- verify(hematologyAnalyticsService, times(1)).saveNewAnalyticsRecords(anyList());
- }
-
- @Test
- @DisplayName("It should return a list of all analytics with pagination")
- void getAllAnalytics_return_list() throws Exception {
- List records = createSampleRecordList();
- Page page = new PageImpl<>(records);
-
- when(hematologyAnalyticsService.findAnalyticsPagedByNameIn(anyList(), any(Pageable.class)))
- .thenReturn(page);
-
- mockMvc.perform(get("/hematology-analytics")
- .param("page", "0")
- .param("size", "10"))
- .andExpect(status().isOk());
-
- verify(hematologyAnalyticsService, times(1))
- .findAnalyticsPagedByNameIn(anyList(), any(Pageable.class));
- }
-
-
- @Test
- @DisplayName("It should return analytics records for a date range")
- void getAnalyticsByDateRange_return_analytics() throws Exception {
- List records = createSampleRecordList();
- Page page = new PageImpl<>(records);
-
- when(hematologyAnalyticsService.findAnalyticsByNameInAndDateBetween(anyList(), any(), any(), any()))
- .thenReturn(page);
-
- mockMvc.perform(get("/hematology-analytics/date-range")
- .param("startDate", "2025-01-01 00:00:00").param("endDate", "2025-01-05 00:00:00"))
- .andExpect(status().isOk());
-
- verify(hematologyAnalyticsService, times(1))
- .findAnalyticsByNameInAndDateBetween(anyList(), any(), any(), any());
- }
-
- @Test
- @DisplayName("It should return mean and standard deviation for a date range")
- void getMeanAndStandardDeviation_return_result() throws Exception {
- MeanAndStdDeviationDTO result = new MeanAndStdDeviationDTO(10.5, 2.3);
- when(hematologyAnalyticsService.calculateMeanAndStandardDeviation(any(), any(), any(),
- any())).thenReturn(result);
-
- mockMvc.perform(get("/hematology-analytics/mean-standard-deviation")
- .param("name", "Hemoglobin").param("level", "High")
- .param("startDate", "2025-01-01 00:00:00").param("endDate",
- "2025-01-05 00:00:00"))
- .andExpect(status().isOk());
- verify(hematologyAnalyticsService, times(1))
- .calculateMeanAndStandardDeviation(any(), any(),
- any(), any());
- }
+ @MockitoBean
+ private TokenService tokenService;
+
+ @MockitoBean
+ private UserRepository userRepository;
+
+ @Autowired
+ private MockMvc mockMvc;
+
+ @MockitoBean
+ private HematologyAnalyticService hematologyAnalyticsService;
+
+ @Autowired
+ private JacksonTester> jacksonGenericValuesRecord;
+
+ @Test
+ @DisplayName("It should return a list of all analytics by level")
+ void getAllAnalytics_by_level_return_list() throws Exception {
+ List records = createSampleRecordList();
+ Page page = new PageImpl<>(records);
+
+ when(hematologyAnalyticsService.findAnalyticsByNameInByLevel(anyList(), any(), any(), any(),
+ any(Pageable.class))).thenReturn(page);
+
+ mockMvc.perform(get("/hematology-analytics/level-date-range").param("level", "PCCC1")
+ .param("startDate", "2025-01-01 00:00:00").param("endDate", "2025-01-05 00:00:00"))
+ .andExpect(status().isOk());
+
+ verify(hematologyAnalyticsService, times(1)).findAnalyticsByNameInByLevel(anyList(), any(),
+ any(), any(), any(Pageable.class));
+ }
+
+ @Test
+ @DisplayName("It should return HTTP code 201 when analytics records are saved")
+ void analytics_post_return_201() throws Exception {
+ List records = createSampleRecordList();
+ mockMvc.perform(post("/hematology-analytics").contentType(MediaType.APPLICATION_JSON)
+ .content(jacksonGenericValuesRecord.write(records).getJson()))
+ .andExpect(status().isCreated());
+ verify(hematologyAnalyticsService, times(1)).saveNewAnalyticsRecords(anyList());
+ }
+
+ @Test
+ @DisplayName("It should return a list of all analytics with pagination")
+ void getAllAnalytics_return_list() throws Exception {
+ List records = createSampleRecordList();
+ Page page = new PageImpl<>(records);
+
+ when(hematologyAnalyticsService.findAnalyticsPagedByNameIn(anyList(), any(Pageable.class)))
+ .thenReturn(page);
+
+ mockMvc.perform(get("/hematology-analytics").param("page", "0").param("size", "10"))
+ .andExpect(status().isOk());
+
+ verify(hematologyAnalyticsService, times(1)).findAnalyticsPagedByNameIn(anyList(),
+ any(Pageable.class));
+ }
+
+
+ @Test
+ @DisplayName("It should return analytics records for a date range")
+ void getAnalyticsByDateRange_return_analytics() throws Exception {
+ List records = createSampleRecordList();
+ Page page = new PageImpl<>(records);
+
+ when(hematologyAnalyticsService.findAnalyticsByNameInAndDateBetween(anyList(), any(), any(),
+ any())).thenReturn(page);
+
+ mockMvc.perform(get("/hematology-analytics/date-range")
+ .param("startDate", "2025-01-01 00:00:00").param("endDate", "2025-01-05 00:00:00"))
+ .andExpect(status().isOk());
+
+ verify(hematologyAnalyticsService, times(1)).findAnalyticsByNameInAndDateBetween(anyList(),
+ any(), any(), any());
+ }
+
+ @Test
+ @DisplayName("It should return mean and standard deviation for a date range")
+ void getMeanAndStandardDeviation_return_result() throws Exception {
+ MeanAndStdDeviationDTO result = new MeanAndStdDeviationDTO(10.5, 2.3);
+ LocalDateTime startDate = LocalDateTime.parse("2025-01-01 00:00:00",
+ DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
+ LocalDateTime endDate = LocalDateTime.parse("2025-01-05 00:00:00",
+ DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
+
+ when(hematologyAnalyticsService.calculateMeanAndStandardDeviation(eq("Hemoglobin"),
+ eq("High"), eq(startDate), eq(endDate), any(Pageable.class))).thenReturn(result);
+
+ mockMvc.perform(get("/hematology-analytics/mean-standard-deviation")
+ .param("name", "Hemoglobin").param("level", "High")
+ .param("startDate", "2025-01-01 00:00:00").param("endDate", "2025-01-05 00:00:00")
+ .param("page", "0").param("size", "10")).andExpect(status().isOk());
+
+ verify(hematologyAnalyticsService).calculateMeanAndStandardDeviation(eq("Hemoglobin"),
+ eq("High"), eq(startDate), eq(endDate), any(Pageable.class));
+ }
}
diff --git a/src/test/java/leonardo/labutilities/qualitylabpro/controllers/UsersControllerTest.java b/src/test/java/leonardo/labutilities/qualitylabpro/controllers/UsersControllerTest.java
index 15e66a8..7a64832 100644
--- a/src/test/java/leonardo/labutilities/qualitylabpro/controllers/UsersControllerTest.java
+++ b/src/test/java/leonardo/labutilities/qualitylabpro/controllers/UsersControllerTest.java
@@ -1,17 +1,17 @@
package leonardo.labutilities.qualitylabpro.controllers;
-import leonardo.labutilities.qualitylabpro.configs.TestSecurityConfig;
-import leonardo.labutilities.qualitylabpro.controllers.users.UsersController;
-import leonardo.labutilities.qualitylabpro.dtos.authentication.LoginUserDTO;
-import leonardo.labutilities.qualitylabpro.dtos.authentication.TokenJwtDTO;
-import leonardo.labutilities.qualitylabpro.dtos.users.RecoverPasswordDTO;
-import leonardo.labutilities.qualitylabpro.dtos.users.UpdatePasswordDTO;
-import leonardo.labutilities.qualitylabpro.dtos.users.UsersDTO;
-import leonardo.labutilities.qualitylabpro.entities.User;
-import leonardo.labutilities.qualitylabpro.enums.UserRoles;
-import leonardo.labutilities.qualitylabpro.repositories.UserRepository;
-import leonardo.labutilities.qualitylabpro.services.authentication.TokenService;
-import leonardo.labutilities.qualitylabpro.services.users.UserService;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.times;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.patch;
+import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post;
+import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath;
+import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
+import java.time.Instant;
+import java.time.LocalDateTime;
+import java.time.ZoneOffset;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
@@ -32,16 +32,19 @@
import org.springframework.test.context.ActiveProfiles;
import org.springframework.test.context.bean.override.mockito.MockitoBean;
import org.springframework.test.web.servlet.MockMvc;
-import static org.mockito.ArgumentMatchers.any;
-import static org.mockito.ArgumentMatchers.anyString;
-import static org.mockito.Mockito.*;
-import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.patch;
-import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post;
-import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath;
-import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
-import java.time.Instant;
-import java.time.LocalDateTime;
-import java.time.ZoneOffset;
+import leonardo.labutilities.qualitylabpro.configs.TestSecurityConfig;
+import leonardo.labutilities.qualitylabpro.controllers.users.UsersController;
+import leonardo.labutilities.qualitylabpro.dtos.authentication.LoginUserDTO;
+import leonardo.labutilities.qualitylabpro.dtos.authentication.TokenJwtDTO;
+import leonardo.labutilities.qualitylabpro.dtos.users.RecoverPasswordDTO;
+import leonardo.labutilities.qualitylabpro.dtos.users.SignUpUsersDTO;
+import leonardo.labutilities.qualitylabpro.dtos.users.UpdatePasswordDTO;
+import leonardo.labutilities.qualitylabpro.dtos.users.UsersDTO;
+import leonardo.labutilities.qualitylabpro.entities.User;
+import leonardo.labutilities.qualitylabpro.enums.UserRoles;
+import leonardo.labutilities.qualitylabpro.repositories.UserRepository;
+import leonardo.labutilities.qualitylabpro.services.authentication.TokenService;
+import leonardo.labutilities.qualitylabpro.services.users.UserService;
@WebMvcTest(UsersController.class)
@Import(TestSecurityConfig.class)
@@ -68,6 +71,10 @@ class UsersControllerTest {
@Autowired
private JacksonTester usersRecordJacksonTester;
+ @Autowired
+ private JacksonTester signUpUsersDTOJacksonTester;
+
+
@Autowired
private JacksonTester loginRecordJacksonTester;
@@ -80,18 +87,15 @@ class UsersControllerTest {
@Test
@DisplayName("Should return 204 when signing up a new user")
void signUp_return_204() throws Exception {
- UsersDTO usersDTO = new UsersDTO("testUser", "Marmota2024@", "test@example.com");
- User user = new User("testUser", "password", "test@example.com", UserRoles.USER);
-
- when(userService.signUp(anyString(), anyString(), anyString())).thenReturn(user);
+ SignUpUsersDTO signUpUsersDTO =
+ new SignUpUsersDTO("Leonardo Meireles", "marmotas2024@email.com", "marmotas2024@");
mockMvc.perform(post("/users/sign-up").contentType(MediaType.APPLICATION_JSON)
- .content(usersRecordJacksonTester.write(usersDTO).getJson()))
- .andExpect(status().isNoContent())
- .andExpect(jsonPath("$.identifier").value("testUser"))
- .andExpect(jsonPath("$.identifier").value("test@example.com"));
+ .content(signUpUsersDTOJacksonTester.write(signUpUsersDTO).getJson()))
+ .andExpect(status().isNoContent());
- verify(userService).signUp(usersDTO.username(), usersDTO.password(), usersDTO.email());
+ verify(userService).signUp(signUpUsersDTO.identifier(), signUpUsersDTO.email(),
+ signUpUsersDTO.password());
}
@Test
diff --git a/src/test/java/leonardo/labutilities/qualitylabpro/services/AnalyticHelperServiceTests.java b/src/test/java/leonardo/labutilities/qualitylabpro/services/AnalyticHelperServiceTests.java
index b343351..9b18150 100644
--- a/src/test/java/leonardo/labutilities/qualitylabpro/services/AnalyticHelperServiceTests.java
+++ b/src/test/java/leonardo/labutilities/qualitylabpro/services/AnalyticHelperServiceTests.java
@@ -51,14 +51,15 @@ void setUp() {
@Override
public List findAnalyticsByNameAndLevel(Pageable pageable,
- String name, String level) {
+ String name, String level) {
return analyticsRepository.findByNameAndLevel(pageable, name, level).stream()
.map(AnalyticMapper::toRecord).toList();
}
@Override
public List findAnalyticsByNameAndLevelAndDate(String name,
- String level, LocalDateTime dateStart, LocalDateTime dateEnd) {
+ String level, LocalDateTime dateStart, LocalDateTime dateEnd,
+ Pageable pageable) {
return analyticsRepository
.findByNameAndLevelAndDateBetween(name, level, dateStart, dateEnd,
PageRequest.of(0, 200))
@@ -123,7 +124,8 @@ void saveNewAnalyticsRecords_WithValidRecords_ShouldSaveSuccessfully() {
List records = createSampleRecordList();
when(analyticsRepository.existsByDateAndLevelAndName(any(), any(), any()))
.thenReturn(false);
- when(analyticsRepository.saveAll(any())).thenReturn(null);
+ when(analyticsRepository.saveAll(any()))
+ .thenAnswer(invocation -> invocation.getArgument(0));
assertDoesNotThrow(() -> analyticHelperService.saveNewAnalyticsRecords(records));
verify(analyticsRepository, times(1)).saveAll(any());
@@ -191,8 +193,8 @@ void findAllAnalyticsByNameAndLevelAndDate_WithDateRange_ShouldReturnFilteredRec
when(analyticsRepository.findByNameAndLevelAndDateBetween(eq(name), eq(level),
eq(startDate), eq(endDate), any(Pageable.class))).thenReturn(expectedRecords);
- List result = analyticHelperService
- .findAnalyticsByNameAndLevelAndDate(name, level, startDate, endDate);
+ List result = analyticHelperService.findAnalyticsByNameAndLevelAndDate(name,
+ level, startDate, endDate, null);
assertNotNull(result);
assertEquals(expectedRecords.size(), result.size());
@@ -281,8 +283,8 @@ void findGroupedAnalyticsByLevel_WithValidInputs_ShouldReturnGroupedRecords() {
when(analyticsRepository.findByNameAndDateBetweenGroupByLevel(eq(name), eq(startDate),
eq(endDate), any(Pageable.class))).thenReturn(records);
- List result =
- analyticHelperService.findGroupedAnalyticsByLevel(name, startDate, endDate);
+ List result = analyticHelperService
+ .findGroupedAnalyticsByLevel(name, startDate, endDate, Pageable.unpaged());
assertNotNull(result);
assertFalse(result.isEmpty());
diff --git a/src/test/java/leonardo/labutilities/qualitylabpro/services/UserServiceTest.java b/src/test/java/leonardo/labutilities/qualitylabpro/services/UserServiceTest.java
index 9e309df..0f4af46 100644
--- a/src/test/java/leonardo/labutilities/qualitylabpro/services/UserServiceTest.java
+++ b/src/test/java/leonardo/labutilities/qualitylabpro/services/UserServiceTest.java
@@ -23,101 +23,102 @@
@ExtendWith(MockitoExtension.class)
class UserServiceTest {
- @Mock
- private UserRepository userRepository;
-
- @Mock
- private PasswordRecoveryTokenManager passwordRecoveryTokenManager;
-
- @Mock
- private EmailService emailService;
-
- @InjectMocks
- private UserService userService;
-
- @Test
- void testRecoverPassword_UserExists() {
- when(userRepository.existsByUsernameAndEmail(anyString(), anyString())).thenReturn(true);
- when(passwordRecoveryTokenManager.generateTemporaryPassword()).thenReturn("tempPassword");
-
- userService.recoverPassword("identifier", "identifier@example.com");
-
- verify(passwordRecoveryTokenManager).generateAndStoreToken("identifier@example.com",
- "tempPassword");
- verify(emailService).sendPlainTextEmail(any());
- }
-
- @Test
- void testRecoverPassword_UserDoesNotExist() {
- when(userRepository.existsByUsernameAndEmail(anyString(), anyString())).thenReturn(false);
-
- assertThrows(CustomGlobalErrorHandling.ResourceNotFoundException.class,
- () -> userService.recoverPassword("identifier", "identifier@example.com"));
- }
-
- @Test
- void testChangePassword_ValidToken() {
- User user = new User("identifier", BCryptEncoderComponent.encrypt("newPassword"),
- "identifier@example.com", UserRoles.USER);
- when(passwordRecoveryTokenManager.isRecoveryTokenValid(anyString(), anyString()))
- .thenReturn(true);
- userService.changePassword("identifier@example.com", "tempPassword", "newPassword");
- assertThat(passwordRecoveryTokenManager.isRecoveryTokenValid("tempPassword",
- "identifier@example.com")).isTrue();
- }
-
- @Test
- void testChangePassword_InvalidToken() {
- when(passwordRecoveryTokenManager.isRecoveryTokenValid(anyString(), anyString()))
- .thenReturn(false);
-
- assertThrows(CustomGlobalErrorHandling.ResourceNotFoundException.class, () -> userService
- .changePassword("identifier@example.com", "tempPassword", "newPassword"));
- }
-
- @Test
- void testSignUp_UserAlreadyExists() {
- when(userRepository.existsByEmail(anyString())).thenReturn(true);
-
- assertThrows(CustomGlobalErrorHandling.UserAlreadyExistException.class,
- () -> userService.signUp("identifier", "password", "identifier@example.com"));
- }
-
- @Test
- void testSignUp_NewUser() {
- when(userRepository.existsByEmail(anyString())).thenReturn(false);
- when(userRepository.save(any(User.class))).thenReturn(
- new User("identifier", "encryptedPassword", "identifier@example.com", UserRoles.USER));
-
- User user = userService.signUp("identifier", "password", "identifier@example.com");
-
- assertNotNull(user);
- assertEquals("identifier", user.getUsername());
- assertEquals("identifier@example.com", user.getEmail());
- }
-
- @Test
- void should_return_error_with_testUpdateUserPassword_PasswordMatches() {
- User user = new User("identifier", BCryptEncoderComponent.encrypt("newPassword"),
- "identifier@example.com", UserRoles.USER);
-
- when(userRepository.getReferenceByUsernameAndEmail(anyString(), anyString()))
- .thenReturn(user);
-
- assertThrows(CustomGlobalErrorHandling.PasswordNotMatchesException.class, () -> userService
- .updateUserPassword("identifier", "identifier@example.com", "oldPassword", "newPassword"));
- verify(userRepository, never()).setPasswordWhereByUsername(anyString(), anyString());
- }
-
- @Test
- void testUpdateUserPassword_PasswordDoesNotMatch() {
- User user = new User("identifier", BCryptEncoderComponent.encrypt("oldPassword"),
- "identifier@example.com", UserRoles.USER);
- when(userRepository.getReferenceByUsernameAndEmail(anyString(), anyString()))
- .thenReturn(user);
-
- assertThrows(CustomGlobalErrorHandling.PasswordNotMatchesException.class,
- () -> userService.updateUserPassword("identifier", "identifier@example.com",
- "wrongPassword", "newPassword"));
- }
+ @Mock
+ private UserRepository userRepository;
+
+ @Mock
+ private PasswordRecoveryTokenManager passwordRecoveryTokenManager;
+
+ @Mock
+ private EmailService emailService;
+
+ @InjectMocks
+ private UserService userService;
+
+ @Test
+ void testRecoverPassword_UserExists() {
+ when(userRepository.existsByUsernameAndEmail(anyString(), anyString())).thenReturn(true);
+ when(passwordRecoveryTokenManager.generateTemporaryPassword()).thenReturn("tempPassword");
+
+ userService.recoverPassword("identifier", "identifier@example.com");
+
+ verify(passwordRecoveryTokenManager).generateAndStoreToken("identifier@example.com",
+ "tempPassword");
+ verify(emailService).sendPlainTextEmail(any());
+ }
+
+ @Test
+ void testRecoverPassword_UserDoesNotExist() {
+ when(userRepository.existsByUsernameAndEmail(anyString(), anyString())).thenReturn(false);
+
+ assertThrows(CustomGlobalErrorHandling.ResourceNotFoundException.class,
+ () -> userService.recoverPassword("identifier", "identifier@example.com"));
+ }
+
+ @Test
+ void testChangePassword_ValidToken() {
+ User user = new User("identifier", BCryptEncoderComponent.encrypt("newPassword"),
+ "identifier@example.com", UserRoles.USER);
+ when(passwordRecoveryTokenManager.isRecoveryTokenValid(anyString(), anyString()))
+ .thenReturn(true);
+ userService.changePassword("identifier@example.com", "tempPassword", "newPassword");
+ assertThat(passwordRecoveryTokenManager.isRecoveryTokenValid("tempPassword",
+ "identifier@example.com")).isTrue();
+ }
+
+ @Test
+ void testChangePassword_InvalidToken() {
+ when(passwordRecoveryTokenManager.isRecoveryTokenValid(anyString(), anyString()))
+ .thenReturn(false);
+
+ assertThrows(CustomGlobalErrorHandling.ResourceNotFoundException.class, () -> userService
+ .changePassword("identifier@example.com", "tempPassword", "newPassword"));
+ }
+
+ @Test
+ void testSignUp_UserAlreadyExists() {
+ when(userRepository.existsByUsernameOrEmail(anyString(), anyString())).thenReturn(true);
+
+ assertThrows(CustomGlobalErrorHandling.UserAlreadyExistException.class,
+ () -> userService.signUp("identifier", "identifier@example.com", "password"));
+ }
+
+ @Test
+ void testSignUp_NewUser() {
+ when(userRepository.existsByUsernameOrEmail(anyString(), anyString())).thenReturn(false);
+ when(userRepository.save(any(User.class))).thenReturn(new User("identifier",
+ "encryptedPassword", "identifier@example.com", UserRoles.USER));
+
+ User user = userService.signUp("identifier", "password", "identifier@example.com");
+
+ assertNotNull(user);
+ assertEquals("identifier", user.getUsername());
+ assertEquals("identifier@example.com", user.getEmail());
+ }
+
+ @Test
+ void should_return_error_with_testUpdateUserPassword_PasswordMatches() {
+ User user = new User("identifier", BCryptEncoderComponent.encrypt("newPassword"),
+ "identifier@example.com", UserRoles.USER);
+
+ when(userRepository.getReferenceByUsernameAndEmail(anyString(), anyString()))
+ .thenReturn(user);
+
+ assertThrows(CustomGlobalErrorHandling.PasswordNotMatchesException.class,
+ () -> userService.updateUserPassword("identifier", "identifier@example.com",
+ "oldPassword", "newPassword"));
+ verify(userRepository, never()).setPasswordWhereByUsername(anyString(), anyString());
+ }
+
+ @Test
+ void testUpdateUserPassword_PasswordDoesNotMatch() {
+ User user = new User("identifier", BCryptEncoderComponent.encrypt("oldPassword"),
+ "identifier@example.com", UserRoles.USER);
+ when(userRepository.getReferenceByUsernameAndEmail(anyString(), anyString()))
+ .thenReturn(user);
+
+ assertThrows(CustomGlobalErrorHandling.PasswordNotMatchesException.class,
+ () -> userService.updateUserPassword("identifier", "identifier@example.com",
+ "wrongPassword", "newPassword"));
+ }
}