From cf533a034068d84ea33e41340b8eb5c1bdf79dfd Mon Sep 17 00:00:00 2001 From: Thiago dos Santos Hora Date: Wed, 25 Aug 2021 17:19:13 +0200 Subject: [PATCH] [BAEL-4955] The DTO pattern (#11166) * [BAEL-4955] The DTO pattern * Fix encrypt logic * Add tests * Add tests * Move packages --- design-patterns/README.md | 5 ++ design-patterns/dto-pattern/pom.xml | 31 +++++++ .../designpatterns/dtopattern/Main.java | 12 +++ .../designpatterns/dtopattern/api/Mapper.java | 28 +++++++ .../dtopattern/api/UserController.java | 51 ++++++++++++ .../dtopattern/api/UserCreationDTO.java | 36 ++++++++ .../dtopattern/api/UserDTO.java | 22 +++++ .../dtopattern/api/UserIdDTO.java | 14 ++++ .../dtopattern/domain/InMemoryRepository.java | 49 +++++++++++ .../dtopattern/domain/Role.java | 28 +++++++ .../dtopattern/domain/RoleRepository.java | 7 ++ .../dtopattern/domain/RoleService.java | 32 +++++++ .../dtopattern/domain/User.java | 80 ++++++++++++++++++ .../dtopattern/domain/UserRepository.java | 9 ++ .../dtopattern/domain/UserService.java | 25 ++++++ .../dtopattern/api/MapperUnitTest.java | 56 +++++++++++++ .../api/UserControllerIntegrationTest.java | 80 ++++++++++++++++++ .../domain/InMemoryRepositoryUnitTest.java | 83 +++++++++++++++++++ .../dtopattern/domain/UserUnitTest.java | 38 +++++++++ design-patterns/pom.xml | 22 +++++ pom.xml | 1 + 21 files changed, 709 insertions(+) create mode 100644 design-patterns/README.md create mode 100644 design-patterns/dto-pattern/pom.xml create mode 100644 design-patterns/dto-pattern/src/main/java/com/baeldung/designpatterns/dtopattern/Main.java create mode 100644 design-patterns/dto-pattern/src/main/java/com/baeldung/designpatterns/dtopattern/api/Mapper.java create mode 100644 design-patterns/dto-pattern/src/main/java/com/baeldung/designpatterns/dtopattern/api/UserController.java create mode 100644 design-patterns/dto-pattern/src/main/java/com/baeldung/designpatterns/dtopattern/api/UserCreationDTO.java create mode 100644 design-patterns/dto-pattern/src/main/java/com/baeldung/designpatterns/dtopattern/api/UserDTO.java create mode 100644 design-patterns/dto-pattern/src/main/java/com/baeldung/designpatterns/dtopattern/api/UserIdDTO.java create mode 100644 design-patterns/dto-pattern/src/main/java/com/baeldung/designpatterns/dtopattern/domain/InMemoryRepository.java create mode 100644 design-patterns/dto-pattern/src/main/java/com/baeldung/designpatterns/dtopattern/domain/Role.java create mode 100644 design-patterns/dto-pattern/src/main/java/com/baeldung/designpatterns/dtopattern/domain/RoleRepository.java create mode 100644 design-patterns/dto-pattern/src/main/java/com/baeldung/designpatterns/dtopattern/domain/RoleService.java create mode 100644 design-patterns/dto-pattern/src/main/java/com/baeldung/designpatterns/dtopattern/domain/User.java create mode 100644 design-patterns/dto-pattern/src/main/java/com/baeldung/designpatterns/dtopattern/domain/UserRepository.java create mode 100644 design-patterns/dto-pattern/src/main/java/com/baeldung/designpatterns/dtopattern/domain/UserService.java create mode 100644 design-patterns/dto-pattern/src/test/java/com/baeldung/designpatterns/dtopattern/api/MapperUnitTest.java create mode 100644 design-patterns/dto-pattern/src/test/java/com/baeldung/designpatterns/dtopattern/api/UserControllerIntegrationTest.java create mode 100644 design-patterns/dto-pattern/src/test/java/com/baeldung/designpatterns/dtopattern/domain/InMemoryRepositoryUnitTest.java create mode 100644 design-patterns/dto-pattern/src/test/java/com/baeldung/designpatterns/dtopattern/domain/UserUnitTest.java create mode 100644 design-patterns/pom.xml diff --git a/design-patterns/README.md b/design-patterns/README.md new file mode 100644 index 0000000000..2cca13c9b9 --- /dev/null +++ b/design-patterns/README.md @@ -0,0 +1,5 @@ +## Article related + +- [The DTO Pattern (Data Transfer Object)]() + + diff --git a/design-patterns/dto-pattern/pom.xml b/design-patterns/dto-pattern/pom.xml new file mode 100644 index 0000000000..19f66ac596 --- /dev/null +++ b/design-patterns/dto-pattern/pom.xml @@ -0,0 +1,31 @@ + + + + com.baeldung.designpatterns.dtopattern + 4.0.0 + dto-pattern + dto-pattern + + + com.baeldung + parent-boot-2 + 0.0.1-SNAPSHOT + ../../parent-boot-2 + + + + + org.springframework.boot + spring-boot-starter-web + + + + + 1.8 + 1.8 + UTF-8 + + + \ No newline at end of file diff --git a/design-patterns/dto-pattern/src/main/java/com/baeldung/designpatterns/dtopattern/Main.java b/design-patterns/dto-pattern/src/main/java/com/baeldung/designpatterns/dtopattern/Main.java new file mode 100644 index 0000000000..ae6c03f856 --- /dev/null +++ b/design-patterns/dto-pattern/src/main/java/com/baeldung/designpatterns/dtopattern/Main.java @@ -0,0 +1,12 @@ +package com.baeldung.designpatterns.dtopattern; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class Main { + public static void main(String[] args) { + SpringApplication.run(Main.class, args); + } +} + diff --git a/design-patterns/dto-pattern/src/main/java/com/baeldung/designpatterns/dtopattern/api/Mapper.java b/design-patterns/dto-pattern/src/main/java/com/baeldung/designpatterns/dtopattern/api/Mapper.java new file mode 100644 index 0000000000..7f9466b6a4 --- /dev/null +++ b/design-patterns/dto-pattern/src/main/java/com/baeldung/designpatterns/dtopattern/api/Mapper.java @@ -0,0 +1,28 @@ +package com.baeldung.designpatterns.dtopattern.api; + +import com.baeldung.designpatterns.dtopattern.domain.Role; +import com.baeldung.designpatterns.dtopattern.domain.User; +import org.springframework.stereotype.Component; + +import java.util.ArrayList; +import java.util.List; + +import static java.util.stream.Collectors.toList; + +@Component +class Mapper { + public UserDTO toDto(User user) { + String name = user.getName(); + List roles = user + .getRoles() + .stream() + .map(Role::getName) + .collect(toList()); + + return new UserDTO(name, roles); + } + + public User toUser(UserCreationDTO userDTO) { + return new User(userDTO.getName(), userDTO.getPassword(), new ArrayList<>()); + } +} diff --git a/design-patterns/dto-pattern/src/main/java/com/baeldung/designpatterns/dtopattern/api/UserController.java b/design-patterns/dto-pattern/src/main/java/com/baeldung/designpatterns/dtopattern/api/UserController.java new file mode 100644 index 0000000000..8866d1236f --- /dev/null +++ b/design-patterns/dto-pattern/src/main/java/com/baeldung/designpatterns/dtopattern/api/UserController.java @@ -0,0 +1,51 @@ +package com.baeldung.designpatterns.dtopattern.api; + +import com.baeldung.designpatterns.dtopattern.domain.RoleService; +import com.baeldung.designpatterns.dtopattern.domain.User; +import com.baeldung.designpatterns.dtopattern.domain.UserService; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +import static java.util.stream.Collectors.toList; + +@RestController +@RequestMapping("/users") +class UserController { + + private UserService userService; + private RoleService roleService; + private Mapper mapper; + + public UserController(UserService userService, RoleService roleService, Mapper mapper) { + this.userService = userService; + this.roleService = roleService; + this.mapper = mapper; + } + + @GetMapping + @ResponseBody + public List getUsers() { + return userService.getAll() + .stream() + .map(mapper::toDto) + .collect(toList()); + } + + + @PostMapping + @ResponseBody + public UserIdDTO create(@RequestBody UserCreationDTO userDTO) { + User user = mapper.toUser(userDTO); + + userDTO.getRoles() + .stream() + .map(role -> roleService.getOrCreate(role)) + .forEach(user::addRole); + + userService.save(user); + + return new UserIdDTO(user.getId()); + } + +} diff --git a/design-patterns/dto-pattern/src/main/java/com/baeldung/designpatterns/dtopattern/api/UserCreationDTO.java b/design-patterns/dto-pattern/src/main/java/com/baeldung/designpatterns/dtopattern/api/UserCreationDTO.java new file mode 100644 index 0000000000..3a38547cbd --- /dev/null +++ b/design-patterns/dto-pattern/src/main/java/com/baeldung/designpatterns/dtopattern/api/UserCreationDTO.java @@ -0,0 +1,36 @@ +package com.baeldung.designpatterns.dtopattern.api; + +import java.util.List; + +public class UserCreationDTO { + + private String name; + private String password; + private List roles; + + UserCreationDTO() {} + + public String getName() { + return name; + } + + public String getPassword() { + return password; + } + + public List getRoles() { + return roles; + } + + void setName(String name) { + this.name = name; + } + + void setPassword(String password) { + this.password = password; + } + + void setRoles(List roles) { + this.roles = roles; + } +} diff --git a/design-patterns/dto-pattern/src/main/java/com/baeldung/designpatterns/dtopattern/api/UserDTO.java b/design-patterns/dto-pattern/src/main/java/com/baeldung/designpatterns/dtopattern/api/UserDTO.java new file mode 100644 index 0000000000..41d4ac2dc9 --- /dev/null +++ b/design-patterns/dto-pattern/src/main/java/com/baeldung/designpatterns/dtopattern/api/UserDTO.java @@ -0,0 +1,22 @@ +package com.baeldung.designpatterns.dtopattern.api; + +import java.util.List; + +public class UserDTO { + private String name; + private List roles; + + public UserDTO(String name, List roles) { + this.name = name; + this.roles = roles; + } + + public String getName() { + return name; + } + + public List getRoles() { + return roles; + } + +} diff --git a/design-patterns/dto-pattern/src/main/java/com/baeldung/designpatterns/dtopattern/api/UserIdDTO.java b/design-patterns/dto-pattern/src/main/java/com/baeldung/designpatterns/dtopattern/api/UserIdDTO.java new file mode 100644 index 0000000000..0a4a6c8291 --- /dev/null +++ b/design-patterns/dto-pattern/src/main/java/com/baeldung/designpatterns/dtopattern/api/UserIdDTO.java @@ -0,0 +1,14 @@ +package com.baeldung.designpatterns.dtopattern.api; + +public class UserIdDTO { + + private String id; + + public UserIdDTO(String id) { + this.id = id; + } + + public String getId() { + return id; + } +} diff --git a/design-patterns/dto-pattern/src/main/java/com/baeldung/designpatterns/dtopattern/domain/InMemoryRepository.java b/design-patterns/dto-pattern/src/main/java/com/baeldung/designpatterns/dtopattern/domain/InMemoryRepository.java new file mode 100644 index 0000000000..c947519786 --- /dev/null +++ b/design-patterns/dto-pattern/src/main/java/com/baeldung/designpatterns/dtopattern/domain/InMemoryRepository.java @@ -0,0 +1,49 @@ +package com.baeldung.designpatterns.dtopattern.domain; + +import org.springframework.stereotype.Service; + +import java.util.*; + +@Service +class InMemoryRepository implements UserRepository, RoleRepository { + + private Map users = new LinkedHashMap<>(); + private Map roles = new LinkedHashMap<>(); + + @Override + public List getAll() { + return new ArrayList<>(users.values()); + } + + @Override + public void save(User user) { + user.setId(UUID.randomUUID().toString()); + users.put(user.getId(), user); + } + + @Override + public void save(Role role) { + role.setId(UUID.randomUUID().toString()); + roles.put(role.getId(), role); + } + + @Override + public Role getRoleById(String id) { + return roles.get(id); + } + + @Override + public Role getRoleByName(String name) { + return roles.values() + .stream() + .filter(role -> role.getName().equalsIgnoreCase(name)) + .findFirst() + .orElse(null); + } + + @Override + public void deleteAll() { + users.clear(); + roles.clear(); + } +} diff --git a/design-patterns/dto-pattern/src/main/java/com/baeldung/designpatterns/dtopattern/domain/Role.java b/design-patterns/dto-pattern/src/main/java/com/baeldung/designpatterns/dtopattern/domain/Role.java new file mode 100644 index 0000000000..c671741720 --- /dev/null +++ b/design-patterns/dto-pattern/src/main/java/com/baeldung/designpatterns/dtopattern/domain/Role.java @@ -0,0 +1,28 @@ +package com.baeldung.designpatterns.dtopattern.domain; + +import java.util.Objects; + +public class Role { + private String id; + private String name; + + public Role(String name) { + this.name = Objects.requireNonNull(name); + } + + public String getId() { + return id; + } + + void setId(String id) { + this.id = Objects.requireNonNull(id); + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = Objects.requireNonNull(name); + } +} diff --git a/design-patterns/dto-pattern/src/main/java/com/baeldung/designpatterns/dtopattern/domain/RoleRepository.java b/design-patterns/dto-pattern/src/main/java/com/baeldung/designpatterns/dtopattern/domain/RoleRepository.java new file mode 100644 index 0000000000..d43ea709f3 --- /dev/null +++ b/design-patterns/dto-pattern/src/main/java/com/baeldung/designpatterns/dtopattern/domain/RoleRepository.java @@ -0,0 +1,7 @@ +package com.baeldung.designpatterns.dtopattern.domain; + +public interface RoleRepository { + Role getRoleById(String id); + Role getRoleByName(String name); + void save(Role role); +} diff --git a/design-patterns/dto-pattern/src/main/java/com/baeldung/designpatterns/dtopattern/domain/RoleService.java b/design-patterns/dto-pattern/src/main/java/com/baeldung/designpatterns/dtopattern/domain/RoleService.java new file mode 100644 index 0000000000..4a5b371fa2 --- /dev/null +++ b/design-patterns/dto-pattern/src/main/java/com/baeldung/designpatterns/dtopattern/domain/RoleService.java @@ -0,0 +1,32 @@ +package com.baeldung.designpatterns.dtopattern.domain; + +import org.springframework.stereotype.Service; + +import java.util.Objects; + +@Service +public class RoleService { + + private RoleRepository repository; + + public RoleService(RoleRepository repository) { + this.repository = repository; + } + + public Role getOrCreate(String name) { + Role role = repository.getRoleByName(name); + + if (role == null) { + role = new Role(name); + repository.save(role); + } + + return role; + } + + public void save(Role role) { + Objects.requireNonNull(role); + repository.save(role); + } + +} diff --git a/design-patterns/dto-pattern/src/main/java/com/baeldung/designpatterns/dtopattern/domain/User.java b/design-patterns/dto-pattern/src/main/java/com/baeldung/designpatterns/dtopattern/domain/User.java new file mode 100644 index 0000000000..086c701620 --- /dev/null +++ b/design-patterns/dto-pattern/src/main/java/com/baeldung/designpatterns/dtopattern/domain/User.java @@ -0,0 +1,80 @@ +package com.baeldung.designpatterns.dtopattern.domain; + +import javax.crypto.*; +import javax.crypto.spec.SecretKeySpec; +import java.nio.charset.StandardCharsets; +import java.security.InvalidKeyException; +import java.security.NoSuchAlgorithmException; +import java.util.Collections; +import java.util.List; +import java.util.Objects; + +public class User { + + private static SecretKeySpec KEY = initKey(); + + static SecretKeySpec initKey(){ + try { + SecretKey secretKey = KeyGenerator.getInstance("AES").generateKey(); + return new SecretKeySpec(secretKey.getEncoded(), "AES"); + } catch (NoSuchAlgorithmException ex) { + return null; + } + } + + private String id; + private String name; + private String password; + private List roles; + + public User(String name, String password, List roles) { + this.name = Objects.requireNonNull(name); + this.password = this.encrypt(password); + this.roles = Objects.requireNonNull(roles); + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getPassword() { + return password; + } + + public void setPassword(String password) { + this.password = password; + } + + public void addRole(Role role) { + roles.add(role); + } + + public List getRoles() { + return Collections.unmodifiableList(roles); + } + + public String getId() { + return id; + } + + void setId(String id) { + this.id = id; + } + + String encrypt(String password) { + Objects.requireNonNull(password); + try { + Cipher cipher = Cipher.getInstance("AES"); + cipher.init(Cipher.ENCRYPT_MODE, KEY); + final byte[] encryptedBytes = cipher.doFinal(password.getBytes(StandardCharsets.UTF_8)); + return new String(encryptedBytes, StandardCharsets.UTF_8); + } catch (NoSuchAlgorithmException | NoSuchPaddingException | InvalidKeyException | IllegalBlockSizeException | BadPaddingException e) { + // do nothing + return ""; + } + } +} diff --git a/design-patterns/dto-pattern/src/main/java/com/baeldung/designpatterns/dtopattern/domain/UserRepository.java b/design-patterns/dto-pattern/src/main/java/com/baeldung/designpatterns/dtopattern/domain/UserRepository.java new file mode 100644 index 0000000000..504f328118 --- /dev/null +++ b/design-patterns/dto-pattern/src/main/java/com/baeldung/designpatterns/dtopattern/domain/UserRepository.java @@ -0,0 +1,9 @@ +package com.baeldung.designpatterns.dtopattern.domain; + +import java.util.List; + +public interface UserRepository { + List getAll(); + void save(User user); + void deleteAll(); +} diff --git a/design-patterns/dto-pattern/src/main/java/com/baeldung/designpatterns/dtopattern/domain/UserService.java b/design-patterns/dto-pattern/src/main/java/com/baeldung/designpatterns/dtopattern/domain/UserService.java new file mode 100644 index 0000000000..3b5ac86974 --- /dev/null +++ b/design-patterns/dto-pattern/src/main/java/com/baeldung/designpatterns/dtopattern/domain/UserService.java @@ -0,0 +1,25 @@ +package com.baeldung.designpatterns.dtopattern.domain; + +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Objects; + +@Service +public class UserService { + + private UserRepository repository; + + public UserService(UserRepository repository) { + this.repository = repository; + } + + public List getAll() { + return repository.getAll(); + } + + public void save(User user) { + Objects.requireNonNull(user); + repository.save(user); + } +} diff --git a/design-patterns/dto-pattern/src/test/java/com/baeldung/designpatterns/dtopattern/api/MapperUnitTest.java b/design-patterns/dto-pattern/src/test/java/com/baeldung/designpatterns/dtopattern/api/MapperUnitTest.java new file mode 100644 index 0000000000..8728f6952e --- /dev/null +++ b/design-patterns/dto-pattern/src/test/java/com/baeldung/designpatterns/dtopattern/api/MapperUnitTest.java @@ -0,0 +1,56 @@ +package com.baeldung.designpatterns.dtopattern.api; + +import com.baeldung.designpatterns.dtopattern.domain.Role; +import com.baeldung.designpatterns.dtopattern.domain.User; +import org.junit.jupiter.api.Test; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +import static org.junit.jupiter.api.Assertions.*; + +class MapperUnitTest { + + @Test + void toDto_shouldMapFromDomainToDTO() { + String name = "Test"; + String password = "test"; + Role admin = new Role("admin"); + List expectedRoles = Collections.singletonList("admin"); + + List roles = new ArrayList<>(); + roles.add(admin); + + User user = new User(name, password, roles); + Mapper mapper = new Mapper(); + + UserDTO dto = mapper.toDto(user); + + assertEquals(name, dto.getName()); + assertEquals(expectedRoles, dto.getRoles()); + } + + @Test + void toUser_shouldMapFromDTOToDomain() { + String name = "Test"; + String password = "test"; + String role = "admin"; + + UserCreationDTO dto = new UserCreationDTO(); + dto.setName(name); + dto.setPassword(password); + dto.setRoles(Collections.singletonList("admin")); + + User expectedUser = new User(name, password, new ArrayList<>()); + + Mapper mapper = new Mapper(); + + User user = mapper.toUser(dto); + + assertEquals(name, user.getName()); + assertEquals(expectedUser.getPassword(), user.getPassword()); + assertEquals(Collections.emptyList(), user.getRoles()); + } + +} \ No newline at end of file diff --git a/design-patterns/dto-pattern/src/test/java/com/baeldung/designpatterns/dtopattern/api/UserControllerIntegrationTest.java b/design-patterns/dto-pattern/src/test/java/com/baeldung/designpatterns/dtopattern/api/UserControllerIntegrationTest.java new file mode 100644 index 0000000000..2cb351ffd1 --- /dev/null +++ b/design-patterns/dto-pattern/src/test/java/com/baeldung/designpatterns/dtopattern/api/UserControllerIntegrationTest.java @@ -0,0 +1,80 @@ +package com.baeldung.designpatterns.dtopattern.api; + +import com.baeldung.designpatterns.dtopattern.domain.Role; +import com.baeldung.designpatterns.dtopattern.domain.RoleRepository; +import com.baeldung.designpatterns.dtopattern.domain.User; +import com.baeldung.designpatterns.dtopattern.domain.UserRepository; +import com.fasterxml.jackson.databind.ObjectMapper; +import io.restassured.http.ContentType; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.boot.test.web.client.TestRestTemplate; +import org.springframework.boot.web.server.LocalServerPort; + +import java.util.Collections; + +import static io.restassured.RestAssured.given; +import static org.hamcrest.CoreMatchers.*; +import static org.springframework.http.HttpStatus.OK; + +@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) +class UserControllerIntegrationTest { + + @Autowired + private TestRestTemplate restTemplate; + + @Autowired + private UserRepository userRepository; + + @Autowired + private RoleRepository roleRepository; + + @LocalServerPort + int port; + + @Autowired + private ObjectMapper objectMapper; + + @Test + void create_shouldReturnUseId() throws Exception { + UserCreationDTO request = new UserCreationDTO(); + request.setName("User 1"); + request.setPassword("Test@123456"); + request.setRoles(Collections.singletonList("admin")); + + given() + .contentType(ContentType.JSON) + .body(objectMapper.writeValueAsString(request)) + .when() + .port(port) + .post("/users") + .then() + .statusCode(OK.value()) + .body("id", notNullValue()); + } + + @Test + void getAll_shouldReturnUseDTO() { + + userRepository.deleteAll(); + + String roleName = "admin"; + Role admin = new Role(roleName); + roleRepository.save(admin); + + String name = "User 1"; + User user = new User(name, "Test@123456", Collections.singletonList(admin)); + userRepository.save(user); + + given() + .port(port) + .when() + .get("/users") + .then() + .statusCode(OK.value()) + .body("size()", is(1)) + .body("[0].name", equalTo(name)) + .body("[0].roles", hasItem(roleName)); + } +} diff --git a/design-patterns/dto-pattern/src/test/java/com/baeldung/designpatterns/dtopattern/domain/InMemoryRepositoryUnitTest.java b/design-patterns/dto-pattern/src/test/java/com/baeldung/designpatterns/dtopattern/domain/InMemoryRepositoryUnitTest.java new file mode 100644 index 0000000000..cc16005f01 --- /dev/null +++ b/design-patterns/dto-pattern/src/test/java/com/baeldung/designpatterns/dtopattern/domain/InMemoryRepositoryUnitTest.java @@ -0,0 +1,83 @@ +package com.baeldung.designpatterns.dtopattern.domain; + +import org.junit.jupiter.api.Test; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; + +class InMemoryRepositoryUnitTest { + + @Test + void getAll_shouldReturnAllUsers() { + + String name = "Test"; + String password = "test123"; + List roles = new ArrayList<>(); + + User user = new User(name, password, roles); + List expectedUsers = Collections.singletonList(user); + + InMemoryRepository repository = new InMemoryRepository(); + repository.save(user); + + List users = repository.getAll(); + + assertEquals(expectedUsers, users); + } + + @Test + void save_whenSavingUser_shouldSetId() { + String name = "Test"; + String password = "test123"; + List roles = new ArrayList<>(); + + User user = new User(name, password, roles); + + InMemoryRepository repository = new InMemoryRepository(); + repository.save(user); + + assertNotNull(user.getId()); + } + + @Test + void save_whenSavingRole_shouldSetId() { + String name = "Test"; + Role role = new Role(name); + + InMemoryRepository repository = new InMemoryRepository(); + repository.save(role); + + assertNotNull(role.getId()); + } + + @Test + void getRoleById_shouldReturnRoleById() { + String name = "Test"; + Role expectedRole = new Role(name); + + InMemoryRepository repository = new InMemoryRepository(); + repository.save(expectedRole); + + Role role = repository.getRoleById(expectedRole.getId()); + + assertEquals(expectedRole, role); + } + + @Test + void getRoleByName_shouldReturnRoleByName() { + String name = "Test"; + Role expectedRole = new Role(name); + + InMemoryRepository repository = new InMemoryRepository(); + repository.save(expectedRole); + + Role role = repository.getRoleByName(name); + + assertEquals(expectedRole, role); + } + +} \ No newline at end of file diff --git a/design-patterns/dto-pattern/src/test/java/com/baeldung/designpatterns/dtopattern/domain/UserUnitTest.java b/design-patterns/dto-pattern/src/test/java/com/baeldung/designpatterns/dtopattern/domain/UserUnitTest.java new file mode 100644 index 0000000000..0af2c37cb5 --- /dev/null +++ b/design-patterns/dto-pattern/src/test/java/com/baeldung/designpatterns/dtopattern/domain/UserUnitTest.java @@ -0,0 +1,38 @@ +package com.baeldung.designpatterns.dtopattern.domain; + +import org.junit.jupiter.api.Test; + +import java.util.ArrayList; + +import static org.junit.jupiter.api.Assertions.*; + +class UserUnitTest { + + + @Test + void whenUserIsCreated_shouldEncryptPassword() { + User user = new User("Test", "test", new ArrayList<>()); + + assertEquals(user.encrypt("test"), user.getPassword()); + assertNotEquals(user.encrypt("Test"), user.getPassword()); + } + + @Test + void whenUserIsCreated_shouldFailIfNameIsNull() { + assertThrows(NullPointerException.class, () -> + new User(null, "test", new ArrayList<>())); + } + + @Test + void whenUserIsCreated_shouldFailIfPasswordIsNull() { + assertThrows(NullPointerException.class, () -> + new User("Test", null, new ArrayList<>())); + } + + @Test + void whenUserIsCreated_shouldFailIfRolesIsNull() { + assertThrows(NullPointerException.class, () -> + new User("Test", "Test", null)); + } + +} diff --git a/design-patterns/pom.xml b/design-patterns/pom.xml new file mode 100644 index 0000000000..5fc0e95b2b --- /dev/null +++ b/design-patterns/pom.xml @@ -0,0 +1,22 @@ + + + 4.0.0 + com.baeldung.designpatterns + design-patterns + 1.0.0-SNAPSHOT + design-patterns + pom + + + com.baeldung + parent-modules + 1.0.0-SNAPSHOT + + + + dto-pattern + + + \ No newline at end of file diff --git a/pom.xml b/pom.xml index 059c6dae25..b82a044893 100644 --- a/pom.xml +++ b/pom.xml @@ -387,6 +387,7 @@ core-groovy-strings core-java-modules + design-patterns couchbase custom-pmd