From 96e1827812ea25d37bbe72958b7108a2b6f61738 Mon Sep 17 00:00:00 2001 From: kapcake Date: Mon, 15 May 2023 21:30:54 +0200 Subject: [PATCH] Add missing "city" property in User and test --- .../bankingservice/model/domain/User.java | 1 + .../bankingservice/model/dtos/UserDTO.java | 1 + .../model/dtos/UserUpdateRequest.java | 3 +- .../bankingservice/services/UserService.java | 15 ++-- .../BankingServiceApplicationTests.java | 13 --- .../services/UserServiceTest.java | 81 +++++++++++++++++++ 6 files changed, 94 insertions(+), 20 deletions(-) delete mode 100644 src/test/java/net/kapcake/bankingservice/BankingServiceApplicationTests.java create mode 100644 src/test/java/net/kapcake/bankingservice/services/UserServiceTest.java diff --git a/src/main/java/net/kapcake/bankingservice/model/domain/User.java b/src/main/java/net/kapcake/bankingservice/model/domain/User.java index 1a44cac..f5ab6bc 100644 --- a/src/main/java/net/kapcake/bankingservice/model/domain/User.java +++ b/src/main/java/net/kapcake/bankingservice/model/domain/User.java @@ -26,6 +26,7 @@ public class User { private Integer number; private String numberExtension; private Integer postalCode; + private String city; private String country; @ManyToMany(mappedBy = "users", fetch = FetchType.EAGER) private List bankAccounts; diff --git a/src/main/java/net/kapcake/bankingservice/model/dtos/UserDTO.java b/src/main/java/net/kapcake/bankingservice/model/dtos/UserDTO.java index 73a198c..bbff16d 100644 --- a/src/main/java/net/kapcake/bankingservice/model/dtos/UserDTO.java +++ b/src/main/java/net/kapcake/bankingservice/model/dtos/UserDTO.java @@ -16,5 +16,6 @@ public class UserDTO implements Serializable { private Integer number; private String numberExtension; private Integer postalCode; + private String city; private String country; } diff --git a/src/main/java/net/kapcake/bankingservice/model/dtos/UserUpdateRequest.java b/src/main/java/net/kapcake/bankingservice/model/dtos/UserUpdateRequest.java index 956763b..c6a675e 100644 --- a/src/main/java/net/kapcake/bankingservice/model/dtos/UserUpdateRequest.java +++ b/src/main/java/net/kapcake/bankingservice/model/dtos/UserUpdateRequest.java @@ -9,7 +9,7 @@ import java.io.Serializable; @Data @Accessors(chain = true) -@AtLeastOneFieldNotEmpty(fieldNames = {"password", "street", "number", "numberExtension", "postalCode", "country"}) +@AtLeastOneFieldNotEmpty(fieldNames = {"password", "street", "number", "numberExtension", "postalCode", "city", "country"}) public class UserUpdateRequest implements Serializable { @Pattern(regexp = "^[^\\s]+$") private String password; @@ -17,5 +17,6 @@ public class UserUpdateRequest implements Serializable { private Integer number; private String numberExtension; private Integer postalCode; + private String city; private String country; } diff --git a/src/main/java/net/kapcake/bankingservice/services/UserService.java b/src/main/java/net/kapcake/bankingservice/services/UserService.java index 44cf084..6dd1464 100644 --- a/src/main/java/net/kapcake/bankingservice/services/UserService.java +++ b/src/main/java/net/kapcake/bankingservice/services/UserService.java @@ -31,8 +31,11 @@ public class UserService { private boolean applyUpdateToBuilderAndDecideIfNeedsLogout(UserUpdateRequest userUpdateRequest, User.UserBuilder builder) { boolean needsLogout = false; - if (userUpdateRequest.getCountry() != null) { - builder.country(userUpdateRequest.getCountry()); + if (userUpdateRequest.getNumber() != null) { + builder.number(userUpdateRequest.getNumber()); + } + if (userUpdateRequest.getNumberExtension() != null) { + builder.numberExtension(userUpdateRequest.getNumberExtension()); } if (userUpdateRequest.getStreet() != null) { builder.street(userUpdateRequest.getStreet()); @@ -40,11 +43,11 @@ public class UserService { if (userUpdateRequest.getPostalCode() != null) { builder.postalCode(userUpdateRequest.getPostalCode()); } - if (userUpdateRequest.getNumber() != null) { - builder.number(userUpdateRequest.getNumber()); + if (userUpdateRequest.getCity() != null) { + builder.city(userUpdateRequest.getCity()); } - if (userUpdateRequest.getNumberExtension() != null) { - builder.numberExtension(userUpdateRequest.getNumberExtension()); + if (userUpdateRequest.getCountry() != null) { + builder.country(userUpdateRequest.getCountry()); } if (userUpdateRequest.getPassword() != null) { builder.password(passwordEncoder.encode(userUpdateRequest.getPassword())); diff --git a/src/test/java/net/kapcake/bankingservice/BankingServiceApplicationTests.java b/src/test/java/net/kapcake/bankingservice/BankingServiceApplicationTests.java deleted file mode 100644 index 49c1983..0000000 --- a/src/test/java/net/kapcake/bankingservice/BankingServiceApplicationTests.java +++ /dev/null @@ -1,13 +0,0 @@ -package net.kapcake.bankingservice; - -import org.junit.jupiter.api.Test; -import org.springframework.boot.test.context.SpringBootTest; - -@SpringBootTest -class BankingServiceApplicationTests { - - @Test - void contextLoads() { - } - -} diff --git a/src/test/java/net/kapcake/bankingservice/services/UserServiceTest.java b/src/test/java/net/kapcake/bankingservice/services/UserServiceTest.java new file mode 100644 index 0000000..c7f39e6 --- /dev/null +++ b/src/test/java/net/kapcake/bankingservice/services/UserServiceTest.java @@ -0,0 +1,81 @@ +package net.kapcake.bankingservice.services; + +import net.kapcake.bankingservice.model.domain.User; +import net.kapcake.bankingservice.model.dtos.UserUpdateRequest; +import net.kapcake.bankingservice.repositories.UserRepository; +import net.kapcake.bankingservice.security.UserDetailsImpl; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.Mock; +import org.mockito.junit.jupiter.MockitoExtension; +import org.mockito.stubbing.Answer; +import org.springframework.security.crypto.password.PasswordEncoder; + +import java.util.Optional; + +import static org.junit.jupiter.api.Assertions.*; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.when; + +@ExtendWith(MockitoExtension.class) +class UserServiceTest { + public static final String TEST_USER_1 = "test-user-1"; + @Mock + private static PasswordEncoder passwordEncoder; + @Mock + private static UserRepository userRepository; + private User user1; + private UserService userService; + + @BeforeEach + void beforeEach() { + userService = new UserService(userRepository, passwordEncoder); + + user1 = new User().setId(1L).setUsername(TEST_USER_1); + } + + @Test + void updateUser() { + UserDetailsImpl authenticatedUser = new UserDetailsImpl(user1); + String updatedPassword = "update"; + String encodedPassword = "encoded"; + UserUpdateRequest userUpdateRequest = new UserUpdateRequest().setPassword(updatedPassword); + final User[] updatedUser = new User[1]; + + when(userRepository.findByUsername(TEST_USER_1)).thenReturn(Optional.of(user1)); + when(userRepository.save(any())).then((Answer) invocationOnMock -> { + updatedUser[0] = invocationOnMock.getArgument(0); + return null; + }); + when(passwordEncoder.encode(updatedPassword)).thenReturn(encodedPassword); + + boolean needsLogout = userService.updateUser(authenticatedUser, userUpdateRequest); + assertTrue(needsLogout); + assertEquals(encodedPassword, updatedUser[0].getPassword()); + + userUpdateRequest = new UserUpdateRequest() + .setNumber(2) + .setNumberExtension("ext") + .setStreet("Street") + .setPostalCode(9999) + .setCity("City") + .setCountry("Luxembourg"); + + assertNull(updatedUser[0].getNumber()); + assertNull(updatedUser[0].getNumberExtension()); + assertNull(updatedUser[0].getStreet()); + assertNull(updatedUser[0].getPostalCode()); + assertNull(updatedUser[0].getCity()); + assertNull(updatedUser[0].getCountry()); + + needsLogout = userService.updateUser(authenticatedUser, userUpdateRequest); + assertFalse(needsLogout); + assertEquals(2, updatedUser[0].getNumber()); + assertEquals("ext", updatedUser[0].getNumberExtension()); + assertEquals("Street", updatedUser[0].getStreet()); + assertEquals(9999, updatedUser[0].getPostalCode()); + assertEquals("City", updatedUser[0].getCity()); + assertEquals("Luxembourg", updatedUser[0].getCountry()); + } +} \ No newline at end of file