From cfc508deb2c1b77c90412c1275c978f1c57dd3be Mon Sep 17 00:00:00 2001 From: oleksandr-jr Date: Fri, 6 Jun 2025 19:00:10 +0200 Subject: [PATCH 1/5] Added the H2 database --- pom.xml | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/pom.xml b/pom.xml index d5c3971..dc177d7 100644 --- a/pom.xml +++ b/pom.xml @@ -114,6 +114,18 @@ mapstruct 1.6.0.Beta1 + + + org.springdoc + springdoc-openapi-starter-webmvc-ui + 2.5.0 + + + + com.h2database + h2 + runtime + From 7b97528d2ed2cddbc4a0f0d6fb20b6bd75b6d8ad Mon Sep 17 00:00:00 2001 From: oleksandr-jr Date: Fri, 6 Jun 2025 19:04:41 +0200 Subject: [PATCH 2/5] Format pom.xml --- pom.xml | 519 ++++++++++++++++++++++++++++---------------------------- 1 file changed, 259 insertions(+), 260 deletions(-) diff --git a/pom.xml b/pom.xml index 0fda058..0063470 100644 --- a/pom.xml +++ b/pom.xml @@ -1,273 +1,272 @@ - 4.0.0 - - org.springframework.boot - spring-boot-starter-parent - 3.4.5 - - - ua.com.javarush.gnew - contact-manager - 0.0.1-SNAPSHOT - contact-manager-spring-boot - contact-manager-spring-boot - - - - - - - - - - - - - - - 17 - v20.9.0 - - - - org.springframework.boot - spring-boot-starter-data-jpa - - - org.springframework.boot - spring-boot-starter-hateoas - - - org.springframework.boot - spring-boot-starter-thymeleaf - - - org.springframework.boot - spring-boot-starter-web - - - org.springframework.boot - spring-boot-starter-validation - - - org.springframework.boot - spring-boot-devtools - runtime - true - - - org.springframework.boot - spring-boot-docker-compose - runtime - true - - - org.postgresql - postgresql - runtime - - - org.projectlombok - lombok - 1.18.30 - true - - - org.springframework.boot - spring-boot-starter-test - test - - - org.springframework.restdocs - spring-restdocs-mockmvc - test - - - org.springframework.boot - spring-boot-starter-actuator - - - - com.google.code.gson - gson - 2.11.0 - - - org.springframework.boot - spring-boot-starter-security - - - org.springframework.security - spring-security-test - test - - - org.thymeleaf.extras - thymeleaf-extras-springsecurity6 - - - - org.mapstruct - mapstruct - 1.6.0.Beta1 - - + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> + 4.0.0 + + org.springframework.boot + spring-boot-starter-parent + 3.4.5 + + + ua.com.javarush.gnew + contact-manager + 0.0.1-SNAPSHOT + contact-manager-spring-boot + contact-manager-spring-boot + + + + + + + + + + + + + + + 17 + v20.9.0 + + + + org.springframework.boot + spring-boot-starter-data-jpa + + + org.springframework.boot + spring-boot-starter-hateoas + + + org.springframework.boot + spring-boot-starter-thymeleaf + + + org.springframework.boot + spring-boot-starter-web + + + org.springframework.boot + spring-boot-starter-validation + + + org.springframework.boot + spring-boot-devtools + runtime + true + + + org.springframework.boot + spring-boot-docker-compose + runtime + true + + + org.postgresql + postgresql + runtime + + + org.projectlombok + lombok + 1.18.30 + true + + + org.springframework.boot + spring-boot-starter-test + test + + + org.springframework.restdocs + spring-restdocs-mockmvc + test + + + org.springframework.boot + spring-boot-starter-actuator + + + + com.google.code.gson + gson + 2.11.0 + + + org.springframework.boot + spring-boot-starter-security + + + org.springframework.security + spring-security-test + test + + + org.thymeleaf.extras + thymeleaf-extras-springsecurity6 + - - org.springdoc - springdoc-openapi-starter-webmvc-ui - 2.5.0 - + + org.mapstruct + mapstruct + 1.6.0.Beta1 + - - com.h2database - h2 - runtime - + + org.springdoc + springdoc-openapi-starter-webmvc-ui + 2.5.0 + - org.springdoc - springdoc-openapi-starter-webmvc-ui - 2.5.0 + com.h2database + h2 + runtime - - - - - org.apache.maven.plugins - maven-compiler-plugin - - - - org.projectlombok - lombok - 1.18.30 - - - org.mapstruct - mapstruct-processor - 1.6.0.Beta1 - - - - - - org.asciidoctor - asciidoctor-maven-plugin - 2.2.1 - - - generate-docs - prepare-package - - process-asciidoc - - - html - book - - - - - - org.springframework.restdocs - spring-restdocs-asciidoctor - ${spring-restdocs.version} - - - - - org.springframework.boot - spring-boot-maven-plugin - - - - org.projectlombok - lombok - - - - - - com.spotify.fmt - fmt-maven-plugin - 2.25 - - - format-code - verify - - format - - - - + + org.springdoc + springdoc-openapi-starter-webmvc-ui + 2.5.0 + + - - com.github.eirslett - frontend-maven-plugin - 1.15.1 - - - - install node and npm - - install-node-and-npm - - - ${node.version} - - - - - npm install - - npm - - - install - - - - - npm build - - npm - - - run build - - - - - ${node.version} - src/main/frontend - target - - + + + + org.apache.maven.plugins + maven-compiler-plugin + + + + org.projectlombok + lombok + 1.18.30 + + + org.mapstruct + mapstruct-processor + 1.6.0.Beta1 + + + + + + org.asciidoctor + asciidoctor-maven-plugin + 2.2.1 + + + generate-docs + prepare-package + + process-asciidoc + + + html + book + + + + + + org.springframework.restdocs + spring-restdocs-asciidoctor + ${spring-restdocs.version} + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + org.projectlombok + lombok + + + + + + com.spotify.fmt + fmt-maven-plugin + 2.25 + + + format-code + verify + + format + + + + - - maven-clean-plugin - 3.1.0 - - - - - - ${project.basedir}/src/main/resources/static - - main.css - - - - - + + com.github.eirslett + frontend-maven-plugin + 1.15.1 + + + + install node and npm + + install-node-and-npm + + + ${node.version} + + + + + npm install + + npm + + + install + + + + + npm build + + npm + + + run build + + + + + ${node.version} + src/main/frontend + target + + - - + + maven-clean-plugin + 3.1.0 + + + + + + ${project.basedir}/src/main/resources/static + + + main.css + + + + + + + From 0be17473beb876cccc829c51bfe9fb417e190fec Mon Sep 17 00:00:00 2001 From: oleksandr-jr Date: Fri, 6 Jun 2025 20:13:32 +0200 Subject: [PATCH 3/5] Implemented simple tests --- .../gnew/contactm/DTOs/AppUserDTO.java | 6 +- .../gnew/contactm/DTOs/ContactDTO.java | 7 +- .../gnew/contactm/entity/Contact.java | 7 +- .../rest/ContactControllerApiTest.java | 65 +++++++++++++++++++ .../contactm/services/AppUserServiceTest.java | 65 +++++++++++++++++++ 5 files changed, 141 insertions(+), 9 deletions(-) create mode 100644 src/test/java/ua/com/javarush/gnew/contactm/controller/rest/ContactControllerApiTest.java create mode 100644 src/test/java/ua/com/javarush/gnew/contactm/services/AppUserServiceTest.java diff --git a/src/main/java/ua/com/javarush/gnew/contactm/DTOs/AppUserDTO.java b/src/main/java/ua/com/javarush/gnew/contactm/DTOs/AppUserDTO.java index 24166af..90cdac1 100644 --- a/src/main/java/ua/com/javarush/gnew/contactm/DTOs/AppUserDTO.java +++ b/src/main/java/ua/com/javarush/gnew/contactm/DTOs/AppUserDTO.java @@ -1,13 +1,13 @@ package ua.com.javarush.gnew.contactm.DTOs; -import lombok.Getter; -import lombok.NoArgsConstructor; -import lombok.Setter; +import lombok.*; @Getter @Setter @NoArgsConstructor +@AllArgsConstructor +@Builder public class AppUserDTO { private long id; private String firstName; diff --git a/src/main/java/ua/com/javarush/gnew/contactm/DTOs/ContactDTO.java b/src/main/java/ua/com/javarush/gnew/contactm/DTOs/ContactDTO.java index dd57bc8..0ba8e0f 100644 --- a/src/main/java/ua/com/javarush/gnew/contactm/DTOs/ContactDTO.java +++ b/src/main/java/ua/com/javarush/gnew/contactm/DTOs/ContactDTO.java @@ -1,13 +1,14 @@ package ua.com.javarush.gnew.contactm.DTOs; import java.util.List; -import lombok.Getter; -import lombok.NoArgsConstructor; -import lombok.Setter; + +import lombok.*; @Getter @Setter @NoArgsConstructor +@AllArgsConstructor +@Builder public class ContactDTO { private long id; private String name; diff --git a/src/main/java/ua/com/javarush/gnew/contactm/entity/Contact.java b/src/main/java/ua/com/javarush/gnew/contactm/entity/Contact.java index bd19b72..7509145 100644 --- a/src/main/java/ua/com/javarush/gnew/contactm/entity/Contact.java +++ b/src/main/java/ua/com/javarush/gnew/contactm/entity/Contact.java @@ -7,9 +7,8 @@ import java.util.List; import java.util.Objects; -import lombok.Getter; -import lombok.NoArgsConstructor; -import lombok.Setter; +import lombok.*; +import org.hibernate.annotations.BatchSize; import org.hibernate.annotations.CreationTimestamp; import org.hibernate.annotations.UpdateTimestamp; @@ -17,6 +16,8 @@ @Getter @Setter @NoArgsConstructor +@AllArgsConstructor +@Builder @Entity @Table(name = "contact") public class Contact { diff --git a/src/test/java/ua/com/javarush/gnew/contactm/controller/rest/ContactControllerApiTest.java b/src/test/java/ua/com/javarush/gnew/contactm/controller/rest/ContactControllerApiTest.java new file mode 100644 index 0000000..aa490e2 --- /dev/null +++ b/src/test/java/ua/com/javarush/gnew/contactm/controller/rest/ContactControllerApiTest.java @@ -0,0 +1,65 @@ +package ua.com.javarush.gnew.contactm.controller.rest; + +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration; +import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; +import org.springframework.http.MediaType; +import org.springframework.test.context.bean.override.mockito.MockitoBean; +import org.springframework.test.web.servlet.MockMvc; +import org.springframework.test.web.servlet.result.MockMvcResultMatchers; +import ua.com.javarush.gnew.contactm.DTOs.ContactDTO; +import ua.com.javarush.gnew.contactm.entity.Contact; +import ua.com.javarush.gnew.contactm.mapper.ContactMapper; +import ua.com.javarush.gnew.contactm.repository.ContactRepository; + +import static org.mockito.Mockito.when; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + + +@WebMvcTest(value = ContactControllerApi.class, + excludeAutoConfiguration = SecurityAutoConfiguration.class) +class ContactControllerApiTest { + + @Autowired + private MockMvc mvc; + + @MockitoBean + private ContactRepository contactRepository; + + @MockitoBean + private ContactMapper contactMapper; + + @Test + void getContact_ShouldReturnContactDTOAndStatus200WhenContactExists() throws Exception { + // Arrange + long id = 1L; + String name = "name"; + + Contact contact = Contact.builder() + .id(id) + .name(name) + .build(); + + ContactDTO contactDTO = ContactDTO.builder().id(id).name(name).build(); + + + when(contactRepository.findById(id)).thenReturn(java.util.Optional.of(contact)); + when(contactMapper.toDto(contact)).thenReturn(contactDTO); + + + // Act & Assert + String path = "/api/v1/contact"; + + mvc.perform(get(path) + .param("id", "1") + .accept(MediaType.APPLICATION_JSON)) + .andExpect(status().isOk()) + .andExpect(content().contentType(MediaType.APPLICATION_JSON)) + .andExpect(MockMvcResultMatchers.jsonPath("$.id").value(id)) + .andExpect(MockMvcResultMatchers.jsonPath("$.name").value(name)) + ; + } +} \ No newline at end of file diff --git a/src/test/java/ua/com/javarush/gnew/contactm/services/AppUserServiceTest.java b/src/test/java/ua/com/javarush/gnew/contactm/services/AppUserServiceTest.java new file mode 100644 index 0000000..dff0252 --- /dev/null +++ b/src/test/java/ua/com/javarush/gnew/contactm/services/AppUserServiceTest.java @@ -0,0 +1,65 @@ +package ua.com.javarush.gnew.contactm.services; + +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.ArgumentCaptor; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.junit.jupiter.MockitoExtension; +import org.springframework.security.crypto.password.PasswordEncoder; +import ua.com.javarush.gnew.contactm.DTOs.AppUserDTO; +import ua.com.javarush.gnew.contactm.entity.AppUser; +import ua.com.javarush.gnew.contactm.repository.AppUserRepository; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.mockito.Mockito.*; + +@ExtendWith(MockitoExtension.class) +class AppUserServiceTest { + + @Mock + private AppUserRepository appUserRepository; + + @Mock + private PasswordEncoder passwordEncoder; + + @InjectMocks + private AppUserService appUserService; + + + @Test + void register_ShouldEncodePasswordAndSaveUser() { + // Arrange + String username = "username"; + String password = "password"; + + String encodedPassword = "encodedPassword"; + + AppUserDTO appUserDTO = AppUserDTO.builder() + .username(username) + .password(password) + .build(); + + when(passwordEncoder.encode(password)).thenReturn(encodedPassword); + + ArgumentCaptor appUserArgumentCaptor = ArgumentCaptor.forClass(AppUser.class); + + //Act + appUserService.register(appUserDTO); + + //Assert + verify(passwordEncoder, times(1)).encode(password); + + + verify(appUserRepository, times(1)).save(appUserArgumentCaptor.capture()); + + AppUser savedAppUser = appUserArgumentCaptor.getValue(); + + assertEquals(username, savedAppUser.getUsername()); + assertEquals(encodedPassword, savedAppUser.getPassword()); + } + + @Test + void findByUserName() { + } +} \ No newline at end of file From 53551049556f097b702cda5fc6e38b36f148a2ca Mon Sep 17 00:00:00 2001 From: oleksandr-jr Date: Fri, 6 Jun 2025 20:21:11 +0200 Subject: [PATCH 4/5] Implemented simple tests and formated the code --- pom.xml | 20 ++++++++ .../gnew/contactm/DTOs/AppUserDTO.java | 1 - .../gnew/contactm/DTOs/ContactDTO.java | 1 - .../gnew/contactm/config/SecurityConfig.java | 13 ++++- .../controller/rest/ContactControllerApi.java | 7 +-- .../controller/web/auth/LoginController.java | 3 +- .../gnew/contactm/entity/Contact.java | 28 +++++------ .../rest/ContactControllerApiTest.java | 47 +++++++------------ .../contactm/services/AppUserServiceTest.java | 31 +++++------- 9 files changed, 77 insertions(+), 74 deletions(-) diff --git a/pom.xml b/pom.xml index 0063470..ea50390 100644 --- a/pom.xml +++ b/pom.xml @@ -266,6 +266,26 @@ + + + org.jacoco + jacoco-maven-plugin + 0.8.12 + + + + prepare-agent + + + + report + test + + report + + + + diff --git a/src/main/java/ua/com/javarush/gnew/contactm/DTOs/AppUserDTO.java b/src/main/java/ua/com/javarush/gnew/contactm/DTOs/AppUserDTO.java index 90cdac1..20acd2d 100644 --- a/src/main/java/ua/com/javarush/gnew/contactm/DTOs/AppUserDTO.java +++ b/src/main/java/ua/com/javarush/gnew/contactm/DTOs/AppUserDTO.java @@ -1,6 +1,5 @@ package ua.com.javarush.gnew.contactm.DTOs; - import lombok.*; @Getter diff --git a/src/main/java/ua/com/javarush/gnew/contactm/DTOs/ContactDTO.java b/src/main/java/ua/com/javarush/gnew/contactm/DTOs/ContactDTO.java index 0ba8e0f..94bc791 100644 --- a/src/main/java/ua/com/javarush/gnew/contactm/DTOs/ContactDTO.java +++ b/src/main/java/ua/com/javarush/gnew/contactm/DTOs/ContactDTO.java @@ -1,7 +1,6 @@ package ua.com.javarush.gnew.contactm.DTOs; import java.util.List; - import lombok.*; @Getter diff --git a/src/main/java/ua/com/javarush/gnew/contactm/config/SecurityConfig.java b/src/main/java/ua/com/javarush/gnew/contactm/config/SecurityConfig.java index ff61c01..bb23c53 100644 --- a/src/main/java/ua/com/javarush/gnew/contactm/config/SecurityConfig.java +++ b/src/main/java/ua/com/javarush/gnew/contactm/config/SecurityConfig.java @@ -20,7 +20,17 @@ public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Excepti .authorizeHttpRequests( requests -> requests - .requestMatchers("/", "/main.css", "/img/**", "/register", "/login", "/api/**", "/swagger-ui.html", "/swagger-ui/**", "/v3/api-docs/**", "/webjars/**") + .requestMatchers( + "/", + "/main.css", + "/img/**", + "/register", + "/login", + "/api/**", + "/swagger-ui.html", + "/swagger-ui/**", + "/v3/api-docs/**", + "/webjars/**") .permitAll() .anyRequest() .authenticated()) @@ -34,5 +44,4 @@ public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Excepti public PasswordEncoder passwordEncoder() { return new BCryptPasswordEncoder(); } - } diff --git a/src/main/java/ua/com/javarush/gnew/contactm/controller/rest/ContactControllerApi.java b/src/main/java/ua/com/javarush/gnew/contactm/controller/rest/ContactControllerApi.java index 46dd581..fddfa6b 100644 --- a/src/main/java/ua/com/javarush/gnew/contactm/controller/rest/ContactControllerApi.java +++ b/src/main/java/ua/com/javarush/gnew/contactm/controller/rest/ContactControllerApi.java @@ -1,6 +1,7 @@ package ua.com.javarush.gnew.contactm.controller.rest; import java.util.Optional; +import lombok.RequiredArgsConstructor; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; @@ -9,6 +10,7 @@ import ua.com.javarush.gnew.contactm.mapper.ContactMapper; import ua.com.javarush.gnew.contactm.repository.ContactRepository; +@RequiredArgsConstructor @RestController @RequestMapping("/api/v1/contact") public class ContactControllerApi { @@ -16,11 +18,6 @@ public class ContactControllerApi { private final ContactRepository contactRepository; private final ContactMapper contactMapper; - public ContactControllerApi(ContactRepository contactRepository, ContactMapper contactMapper) { - this.contactRepository = contactRepository; - this.contactMapper = contactMapper; - } - @GetMapping public ResponseEntity getContact(@RequestParam("id") Long id) { return contactRepository diff --git a/src/main/java/ua/com/javarush/gnew/contactm/controller/web/auth/LoginController.java b/src/main/java/ua/com/javarush/gnew/contactm/controller/web/auth/LoginController.java index a6f4382..b047912 100644 --- a/src/main/java/ua/com/javarush/gnew/contactm/controller/web/auth/LoginController.java +++ b/src/main/java/ua/com/javarush/gnew/contactm/controller/web/auth/LoginController.java @@ -12,8 +12,7 @@ public class LoginController { @GetMapping("/login") public String getLoginPage() { Authentication auth = SecurityContextHolder.getContext().getAuthentication(); - if (auth != null && auth.isAuthenticated() && - !(auth instanceof AnonymousAuthenticationToken)) { + if (auth != null && auth.isAuthenticated() && !(auth instanceof AnonymousAuthenticationToken)) { return "redirect:/"; } return "login"; diff --git a/src/main/java/ua/com/javarush/gnew/contactm/entity/Contact.java b/src/main/java/ua/com/javarush/gnew/contactm/entity/Contact.java index 7509145..8340dc3 100644 --- a/src/main/java/ua/com/javarush/gnew/contactm/entity/Contact.java +++ b/src/main/java/ua/com/javarush/gnew/contactm/entity/Contact.java @@ -6,9 +6,7 @@ import java.util.Date; import java.util.List; import java.util.Objects; - import lombok.*; -import org.hibernate.annotations.BatchSize; import org.hibernate.annotations.CreationTimestamp; import org.hibernate.annotations.UpdateTimestamp; @@ -39,9 +37,9 @@ public class Contact { @Expose private List emails = new ArrayList<>(); - @Column(name = "last_name") - @Expose - private String lastName; + @Column(name = "last_name") + @Expose + private String lastName; @OneToMany(mappedBy = "contact", fetch = FetchType.EAGER, cascade = CascadeType.ALL) @Expose @@ -61,14 +59,16 @@ public class Contact { @Column(name = "modify_date") private Date modifyDate; - @Override - public boolean equals(Object o) { - if (!(o instanceof Contact contact)) return false; - return getId() == contact.getId() && Objects.equals(getName(), contact.getName()) && Objects.equals(getLastName(), contact.getLastName()); - } + @Override + public boolean equals(Object o) { + if (!(o instanceof Contact contact)) return false; + return getId() == contact.getId() + && Objects.equals(getName(), contact.getName()) + && Objects.equals(getLastName(), contact.getLastName()); + } - @Override - public int hashCode() { - return Objects.hash(getId(), getName(), getLastName()); - } + @Override + public int hashCode() { + return Objects.hash(getId(), getName(), getLastName()); + } } diff --git a/src/test/java/ua/com/javarush/gnew/contactm/controller/rest/ContactControllerApiTest.java b/src/test/java/ua/com/javarush/gnew/contactm/controller/rest/ContactControllerApiTest.java index aa490e2..b0dddd0 100644 --- a/src/test/java/ua/com/javarush/gnew/contactm/controller/rest/ContactControllerApiTest.java +++ b/src/test/java/ua/com/javarush/gnew/contactm/controller/rest/ContactControllerApiTest.java @@ -1,5 +1,10 @@ package ua.com.javarush.gnew.contactm.controller.rest; +import static org.mockito.Mockito.when; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration; @@ -13,24 +18,16 @@ import ua.com.javarush.gnew.contactm.mapper.ContactMapper; import ua.com.javarush.gnew.contactm.repository.ContactRepository; -import static org.mockito.Mockito.when; -import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; - - -@WebMvcTest(value = ContactControllerApi.class, - excludeAutoConfiguration = SecurityAutoConfiguration.class) +@WebMvcTest( + value = ContactControllerApi.class, + excludeAutoConfiguration = SecurityAutoConfiguration.class) class ContactControllerApiTest { - @Autowired - private MockMvc mvc; + @Autowired private MockMvc mvc; - @MockitoBean - private ContactRepository contactRepository; + @MockitoBean private ContactRepository contactRepository; - @MockitoBean - private ContactMapper contactMapper; + @MockitoBean private ContactMapper contactMapper; @Test void getContact_ShouldReturnContactDTOAndStatus200WhenContactExists() throws Exception { @@ -38,28 +35,20 @@ void getContact_ShouldReturnContactDTOAndStatus200WhenContactExists() throws Exc long id = 1L; String name = "name"; - Contact contact = Contact.builder() - .id(id) - .name(name) - .build(); + Contact contact = Contact.builder().id(id).name(name).build(); ContactDTO contactDTO = ContactDTO.builder().id(id).name(name).build(); - when(contactRepository.findById(id)).thenReturn(java.util.Optional.of(contact)); when(contactMapper.toDto(contact)).thenReturn(contactDTO); - // Act & Assert String path = "/api/v1/contact"; - mvc.perform(get(path) - .param("id", "1") - .accept(MediaType.APPLICATION_JSON)) - .andExpect(status().isOk()) - .andExpect(content().contentType(MediaType.APPLICATION_JSON)) - .andExpect(MockMvcResultMatchers.jsonPath("$.id").value(id)) - .andExpect(MockMvcResultMatchers.jsonPath("$.name").value(name)) - ; + mvc.perform(get(path).param("id", "1").accept(MediaType.APPLICATION_JSON)) + .andExpect(status().isOk()) + .andExpect(content().contentType(MediaType.APPLICATION_JSON)) + .andExpect(MockMvcResultMatchers.jsonPath("$.id").value(id)) + .andExpect(MockMvcResultMatchers.jsonPath("$.name").value(name)); } -} \ No newline at end of file +} diff --git a/src/test/java/ua/com/javarush/gnew/contactm/services/AppUserServiceTest.java b/src/test/java/ua/com/javarush/gnew/contactm/services/AppUserServiceTest.java index dff0252..01f302b 100644 --- a/src/test/java/ua/com/javarush/gnew/contactm/services/AppUserServiceTest.java +++ b/src/test/java/ua/com/javarush/gnew/contactm/services/AppUserServiceTest.java @@ -1,5 +1,8 @@ package ua.com.javarush.gnew.contactm.services; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.mockito.Mockito.*; + import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.ArgumentCaptor; @@ -11,21 +14,14 @@ import ua.com.javarush.gnew.contactm.entity.AppUser; import ua.com.javarush.gnew.contactm.repository.AppUserRepository; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.mockito.Mockito.*; - @ExtendWith(MockitoExtension.class) class AppUserServiceTest { - @Mock - private AppUserRepository appUserRepository; - - @Mock - private PasswordEncoder passwordEncoder; + @Mock private AppUserRepository appUserRepository; - @InjectMocks - private AppUserService appUserService; + @Mock private PasswordEncoder passwordEncoder; + @InjectMocks private AppUserService appUserService; @Test void register_ShouldEncodePasswordAndSaveUser() { @@ -35,22 +31,18 @@ void register_ShouldEncodePasswordAndSaveUser() { String encodedPassword = "encodedPassword"; - AppUserDTO appUserDTO = AppUserDTO.builder() - .username(username) - .password(password) - .build(); + AppUserDTO appUserDTO = AppUserDTO.builder().username(username).password(password).build(); when(passwordEncoder.encode(password)).thenReturn(encodedPassword); ArgumentCaptor appUserArgumentCaptor = ArgumentCaptor.forClass(AppUser.class); - //Act + // Act appUserService.register(appUserDTO); - //Assert + // Assert verify(passwordEncoder, times(1)).encode(password); - verify(appUserRepository, times(1)).save(appUserArgumentCaptor.capture()); AppUser savedAppUser = appUserArgumentCaptor.getValue(); @@ -60,6 +52,5 @@ void register_ShouldEncodePasswordAndSaveUser() { } @Test - void findByUserName() { - } -} \ No newline at end of file + void findByUserName() {} +} From 8d8d176cd7e53d3d21c3c6f928f65905c373cd2f Mon Sep 17 00:00:00 2001 From: oleksandr-jr Date: Fri, 6 Jun 2025 20:23:07 +0200 Subject: [PATCH 5/5] Disabled Codacy Coverage Reporter --- .github/workflows/run_tests.yml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/.github/workflows/run_tests.yml b/.github/workflows/run_tests.yml index a418f74..7a7c8d0 100644 --- a/.github/workflows/run_tests.yml +++ b/.github/workflows/run_tests.yml @@ -49,8 +49,8 @@ jobs: report_paths: 'target/surefire-reports/*.xml' check_name: JUnit Test Report - - name: Codacy Coverage Reporter - uses: codacy/codacy-coverage-reporter-action@v1.3.0 - with: - project-token: ${{ secrets.CODACY_PROJECT_TOKEN }} - coverage-reports: target/site/jacoco/jacoco.xml +# - name: Codacy Coverage Reporter +# uses: codacy/codacy-coverage-reporter-action@v1.3.0 +# with: +# project-token: ${{ secrets.CODACY_PROJECT_TOKEN }} +# coverage-reports: target/site/jacoco/jacoco.xml