From 62dbeb76defcf6fee9608e78881ee6ced421a705 Mon Sep 17 00:00:00 2001 From: riorio805 <sefrianojieftara@gmail.com> Date: Fri, 28 Feb 2025 17:59:44 +0700 Subject: [PATCH] [REFACTOR] Remove long constructor in User and replace all occurrences with the no-arg constructor and set attribute. --- .../safetypin/authentication/model/User.java | 37 ++--- .../authentication/seeder/DevDataSeeder.java | 92 ++++++----- .../service/AuthenticationService.java | 24 ++- .../AuthenticationControllerTest.java | 44 ++++- .../authentication/model/UserTest.java | 11 +- .../seeder/DevDataSeederTest.java | 18 +- .../service/AuthenticationServiceTest.java | 156 +++++++++++++++--- 7 files changed, 268 insertions(+), 114 deletions(-) diff --git a/src/main/java/com/safetypin/authentication/model/User.java b/src/main/java/com/safetypin/authentication/model/User.java index c08cb81..d38fe7d 100644 --- a/src/main/java/com/safetypin/authentication/model/User.java +++ b/src/main/java/com/safetypin/authentication/model/User.java @@ -10,59 +10,42 @@ import java.time.LocalDate; @Table(name = "users") public class User { - @Setter - @Getter @Id + @Setter @Getter @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; - @Setter - @Getter + @Setter @Getter @Column(nullable = false, unique = true) private String email; // May be null for social login users - @Setter - @Getter + @Setter @Getter @Column(nullable = false) private String password; - @Setter - @Getter + @Setter @Getter @Column(nullable = false) private String name; @Column(nullable = false) private boolean isVerified = false; - @Setter - @Getter + @Setter @Getter private String role; // New fields - @Setter - @Getter + @Setter @Getter private LocalDate birthdate; - @Setter - @Getter + + @Setter @Getter private String provider; // "EMAIL", "GOOGLE", "APPLE" - @Setter - @Getter + + @Setter @Getter private String socialId; // For social login users public User() {} - public User(String email, String password, String name, boolean isVerified, String role, - LocalDate birthdate, String provider, String socialId) { - this.email = email; - this.password = password; - this.name = name; - this.isVerified = isVerified; - this.role = role; - this.birthdate = birthdate; - this.provider = provider; - this.socialId = socialId; - } // Getters and setters diff --git a/src/main/java/com/safetypin/authentication/seeder/DevDataSeeder.java b/src/main/java/com/safetypin/authentication/seeder/DevDataSeeder.java index 4f23a81..7b9a5b2 100644 --- a/src/main/java/com/safetypin/authentication/seeder/DevDataSeeder.java +++ b/src/main/java/com/safetypin/authentication/seeder/DevDataSeeder.java @@ -33,50 +33,62 @@ public class DevDataSeeder implements Runnable { public void run() { // Only seed if there are no users in the repository if (userRepository.count() == 0) { - userRepository.save(new User("user1@example.com", - passwordEncoder.encode("password1"), - "User One", - true, - "user", - LocalDate.of(1990, 1, 1), - EMAIL_PROVIDER, - "social1")); - userRepository.save(new User("user2@example.com", - passwordEncoder.encode("password2"), - "User Two", - true, - "user", - LocalDate.of(1991, 2, 2), - EMAIL_PROVIDER, - "social2")); + User user1 = new User(); + user1.setEmail("user1@example.com"); + user1.setPassword(passwordEncoder.encode("password1")); + user1.setName("User One"); + user1.setVerified(true); + user1.setRole("user"); + user1.setBirthdate(LocalDate.of(1990, 1, 1)); + user1.setProvider(EMAIL_PROVIDER); + user1.setSocialId("social1"); + userRepository.save(user1); - userRepository.save(new User("user3@example.com", - passwordEncoder.encode("password3"), - "User Three", - true, - "user", - LocalDate.of(1992, 3, 3), - EMAIL_PROVIDER, - "social3")); + User user2 = new User(); + user2.setEmail("user2@example.com"); + user2.setPassword(passwordEncoder.encode("password2")); + user2.setName("User Two"); + user2.setVerified(true); + user2.setRole("user"); + user2.setBirthdate(LocalDate.of(1991, 2, 2)); + user2.setProvider(EMAIL_PROVIDER); + user2.setSocialId("social2"); + userRepository.save(user2); - userRepository.save(new User("user4@example.com", - passwordEncoder.encode("password4"), - "User Four", - true, - "user", - LocalDate.of(1993, 4, 4), - EMAIL_PROVIDER, - "social4")); - userRepository.save(new User("user5@example.com", - passwordEncoder.encode("password5"), - "User Five", - true, - "user", - LocalDate.of(1994, 5, 5), - EMAIL_PROVIDER, - "social5")); + User user3 = new User(); + user3.setEmail("user3@example.com"); + user3.setPassword(passwordEncoder.encode("password3")); + user3.setName("User Three"); + user3.setVerified(true); + user3.setRole("user"); + user3.setBirthdate(LocalDate.of(1992, 3, 3)); + user3.setProvider(EMAIL_PROVIDER); + user3.setSocialId("social3"); + userRepository.save(user3); + + User user4 = new User(); + user4.setEmail("user4@example.com"); + user4.setPassword(passwordEncoder.encode("password4")); + user4.setName("User Four"); + user4.setVerified(true); + user4.setRole("user"); + user4.setBirthdate(LocalDate.of(1993, 4, 4)); + user4.setProvider(EMAIL_PROVIDER); + user4.setSocialId("social4"); + userRepository.save(user4); + + User user5 = new User(); + user5.setEmail("user5@example.com"); + user5.setPassword(passwordEncoder.encode("password5")); + user5.setName("User Five"); + user5.setVerified(true); + user5.setRole("user"); + user5.setBirthdate(LocalDate.of(1994, 5, 5)); + user5.setProvider(EMAIL_PROVIDER); + user5.setSocialId("social5"); + userRepository.save(user5); } } } diff --git a/src/main/java/com/safetypin/authentication/service/AuthenticationService.java b/src/main/java/com/safetypin/authentication/service/AuthenticationService.java index 3a177cc..c5616f6 100644 --- a/src/main/java/com/safetypin/authentication/service/AuthenticationService.java +++ b/src/main/java/com/safetypin/authentication/service/AuthenticationService.java @@ -37,8 +37,16 @@ public class AuthenticationService { throw new UserAlreadyExistsException("User already exists with this email. If you registered using social login, please sign in with Google/Apple."); } String encodedPassword = passwordEncoder.encode(request.getPassword()); - User user = new User(request.getEmail(), encodedPassword, request.getName(), false, "USER", - request.getBirthdate(), EMAIL_PROVIDER, null); + + User user = new User(); + user.setEmail(request.getEmail()); + user.setPassword(encodedPassword); + user.setName(request.getName()); + user.setVerified(false); + user.setRole("USER"); + user.setBirthdate(request.getBirthdate()); + user.setProvider(EMAIL_PROVIDER); + user.setSocialId(null); user = userRepository.save(user); otpService.generateOTP(request.getEmail()); logger.info("OTP generated for {} at {}", request.getEmail(), java.time.LocalDateTime.now()); @@ -57,8 +65,16 @@ public class AuthenticationService { } return existing; } - User user = new User(request.getEmail(), null, request.getName(), true, "USER", - request.getBirthdate(), request.getProvider().toUpperCase(), request.getSocialId()); + User user = new User(); + user.setEmail(request.getEmail()); + user.setPassword(null); + user.setName(request.getName()); + user.setVerified(true); + user.setRole("USER"); + user.setBirthdate(request.getBirthdate()); + user.setProvider(request.getProvider().toUpperCase()); + user.setSocialId(request.getSocialId()); + user = userRepository.save(user); logger.info("User registered via {}: {} at {}", request.getProvider(), request.getEmail(), java.time.LocalDateTime.now()); return user; diff --git a/src/test/java/com/safetypin/authentication/controller/AuthenticationControllerTest.java b/src/test/java/com/safetypin/authentication/controller/AuthenticationControllerTest.java index 2051cf1..f0de3fd 100644 --- a/src/test/java/com/safetypin/authentication/controller/AuthenticationControllerTest.java +++ b/src/test/java/com/safetypin/authentication/controller/AuthenticationControllerTest.java @@ -67,8 +67,14 @@ class AuthenticationControllerTest { request.setName("Test User"); request.setBirthdate(LocalDate.now().minusYears(20)); - User user = new User("email@example.com", "encodedPassword", "Test User", false, "USER", - request.getBirthdate(), "EMAIL", null); + User user = new User(); + user.setEmail("email@example.com"); + user.setPassword("encodedPassword"); + user.setName("Test User"); + user.setRole("USER"); + user.setBirthdate(request.getBirthdate()); + user.setProvider("EMAIL"); + user.setId(1L); Mockito.when(authenticationService.registerUser(any(RegistrationRequest.class))).thenReturn(user); @@ -90,8 +96,15 @@ class AuthenticationControllerTest { request.setBirthdate(LocalDate.now().minusYears(25)); request.setSocialId("social123"); - User user = new User("social@example.com", null, "Social User", true, "USER", - request.getBirthdate(), "GOOGLE", "social123"); + User user = new User(); + user.setEmail("social@example.com"); + user.setPassword(null); + user.setName("Social User"); + user.setVerified(true); + user.setRole("USER"); + user.setBirthdate(request.getBirthdate()); + user.setProvider("GOOGLE"); + user.setSocialId("social123"); user.setId(2L); Mockito.when(authenticationService.socialLogin(any(SocialLoginRequest.class))).thenReturn(user); @@ -105,8 +118,16 @@ class AuthenticationControllerTest { @Test void testLoginEmail() throws Exception { - User user = new User("email@example.com", "encodedPassword", "Test User", true, "USER", - LocalDate.now().minusYears(20), "EMAIL", null); + User user = new User(); + user.setEmail("email@example.com"); + user.setPassword("encodedPassword"); + user.setName("Test User"); + user.setVerified(true); + user.setRole("USER"); + user.setBirthdate(LocalDate.now().minusYears(20)); + user.setProvider("EMAIL"); + user.setSocialId(null); + user.setId(1L); Mockito.when(authenticationService.loginUser(eq("email@example.com"), eq("password"))).thenReturn(user); @@ -120,8 +141,15 @@ class AuthenticationControllerTest { @Test void testLoginSocial() throws Exception { - User user = new User("social@example.com", null, "Social User", true, "USER", - LocalDate.now().minusYears(25), "GOOGLE", "social123"); + User user = new User(); + user.setEmail("social@example.com"); + user.setPassword(null); + user.setName("Social User"); + user.setVerified(true); + user.setRole("USER"); + user.setBirthdate(LocalDate.now().minusYears(25)); + user.setProvider("GOOGLE"); + user.setSocialId("social123"); user.setId(2L); Mockito.when(authenticationService.loginSocial(eq("social@example.com"))).thenReturn(user); diff --git a/src/test/java/com/safetypin/authentication/model/UserTest.java b/src/test/java/com/safetypin/authentication/model/UserTest.java index f66bde4..0b3c180 100644 --- a/src/test/java/com/safetypin/authentication/model/UserTest.java +++ b/src/test/java/com/safetypin/authentication/model/UserTest.java @@ -68,7 +68,16 @@ class UserTest { String provider = "EMAIL"; String socialId = null; - User user = new User(email, password, name, verified, role, birthdate, provider, socialId); + User user = new User(); + user.setEmail(email); + user.setPassword(password); + user.setName(name); + user.setVerified(verified); + user.setRole(role); + user.setBirthdate(birthdate); + user.setProvider(provider); + user.setSocialId(socialId); + // id remains null until set (by the persistence layer) assertNull(user.getId(), "Id should be null when not set"); diff --git a/src/test/java/com/safetypin/authentication/seeder/DevDataSeederTest.java b/src/test/java/com/safetypin/authentication/seeder/DevDataSeederTest.java index 8b58e96..04e4931 100644 --- a/src/test/java/com/safetypin/authentication/seeder/DevDataSeederTest.java +++ b/src/test/java/com/safetypin/authentication/seeder/DevDataSeederTest.java @@ -42,14 +42,16 @@ class DevDataSeederTest { @Test void testSeederDoesNotInsertIfUsersExist() { // Save an existing user into the repository - userRepository.save(new User("existing@example.com", - passwordEncoder.encode("test"), - "Existing User", - true, - "admin", - LocalDate.of(1990, 1, 1), - "EMAIL", - "social_9999")); + User user = new User(); + user.setEmail("existing@example.com"); + user.setPassword(passwordEncoder.encode("test")); + user.setName("Existing User"); + user.setVerified(true); + user.setRole("admin"); + user.setBirthdate(LocalDate.of(1990, 1, 1)); + user.setProvider("EMAIL"); + user.setSocialId("social_9999"); + userRepository.save(user); long countBefore = userRepository.count(); new DevDataSeeder(userRepository, passwordEncoder).run(); diff --git a/src/test/java/com/safetypin/authentication/service/AuthenticationServiceTest.java b/src/test/java/com/safetypin/authentication/service/AuthenticationServiceTest.java index b1f12b9..32b2265 100644 --- a/src/test/java/com/safetypin/authentication/service/AuthenticationServiceTest.java +++ b/src/test/java/com/safetypin/authentication/service/AuthenticationServiceTest.java @@ -77,8 +77,16 @@ class AuthenticationServiceTest { when(userRepository.findByEmail("test@example.com")).thenReturn(null); when(passwordEncoder.encode("password")).thenReturn("encodedPassword"); - User savedUser = new User("test@example.com", "encodedPassword", "Test User", false, "USER", - request.getBirthdate(), "EMAIL", null); + User savedUser = new User(); + savedUser.setEmail("test@example.com"); + savedUser.setPassword("encodedPassword"); + savedUser.setName("Test User"); + savedUser.setVerified(false); + savedUser.setRole("USER"); + savedUser.setBirthdate(request.getBirthdate()); + savedUser.setProvider("EMAIL"); + savedUser.setSocialId(null); + savedUser.setId(1L); when(userRepository.save(any(User.class))).thenReturn(savedUser); @@ -117,8 +125,16 @@ class AuthenticationServiceTest { request.setSocialId("social123"); request.setSocialToken("token"); - User existingUser = new User("social@example.com", "encodedPassword", "Existing User", false, "USER", - LocalDate.now().minusYears(30), "EMAIL", null); + User existingUser = new User(); + existingUser.setEmail("social@example.com"); + existingUser.setPassword("encodedPassword"); + existingUser.setName("Existing User"); + existingUser.setVerified(false); + existingUser.setRole("USER"); + existingUser.setBirthdate(LocalDate.now().minusYears(30)); + existingUser.setProvider("EMAIL"); + existingUser.setSocialId(null); + when(userRepository.findByEmail("social@example.com")).thenReturn(existingUser); Exception exception = assertThrows(UserAlreadyExistsException.class, () -> @@ -137,8 +153,16 @@ class AuthenticationServiceTest { request.setSocialId("social123"); request.setSocialToken("token"); - User existingUser = new User("social@example.com", null, "Social User", true, "USER", - LocalDate.now().minusYears(25), "GOOGLE", "social123"); + User existingUser = new User(); + existingUser.setEmail("social@example.com"); + existingUser.setPassword(null); + existingUser.setName("Social User"); + existingUser.setVerified(true); + existingUser.setRole("USER"); + existingUser.setBirthdate(LocalDate.now().minusYears(25)); + existingUser.setProvider("GOOGLE"); + existingUser.setSocialId("social123"); + when(userRepository.findByEmail("social@example.com")).thenReturn(existingUser); User result = authenticationService.socialLogin(request); @@ -157,8 +181,16 @@ class AuthenticationServiceTest { request.setSocialToken("token"); when(userRepository.findByEmail("social@example.com")).thenReturn(null); - User savedUser = new User("social@example.com", null, "Social User", true, "USER", - request.getBirthdate(), "GOOGLE", "social123"); + User savedUser = new User(); + savedUser.setEmail("social@example.com"); + savedUser.setPassword(null); + savedUser.setName("Social User"); + savedUser.setVerified(true); + savedUser.setRole("USER"); + savedUser.setBirthdate(request.getBirthdate()); + savedUser.setProvider("GOOGLE"); + savedUser.setSocialId("social123"); + savedUser.setId(2L); when(userRepository.save(any(User.class))).thenReturn(savedUser); @@ -180,8 +212,16 @@ class AuthenticationServiceTest { @Test void testLoginUser_InvalidPassword_NullPassword() { - User user = new User("test@example.com", null, "Test User", true, "USER", - LocalDate.now().minusYears(20), "EMAIL", null); + User user = new User(); + user.setEmail("test@example.com"); + user.setPassword(null); + user.setName("Test User"); + user.setVerified(true); + user.setRole("USER"); + user.setBirthdate(LocalDate.now().minusYears(20)); + user.setProvider("EMAIL"); + user.setSocialId(null); + when(userRepository.findByEmail("test@example.com")).thenReturn(user); Exception exception = assertThrows(InvalidCredentialsException.class, () -> @@ -192,8 +232,16 @@ class AuthenticationServiceTest { @Test void testLoginUser_InvalidPassword_WrongMatch() { - User user = new User("test@example.com", "encodedPassword", "Test User", true, "USER", - LocalDate.now().minusYears(20), "EMAIL", null); + User user = new User(); + user.setEmail("test@example.com"); + user.setPassword("encodedPassword"); + user.setName("Test User"); + user.setVerified(true); + user.setRole("USER"); + user.setBirthdate(LocalDate.now().minusYears(20)); + user.setProvider("EMAIL"); + user.setSocialId(null); + when(userRepository.findByEmail("test@example.com")).thenReturn(user); when(passwordEncoder.matches("wrongPassword", "encodedPassword")).thenReturn(false); @@ -205,8 +253,16 @@ class AuthenticationServiceTest { @Test void testLoginUser_Success() { - User user = new User("test@example.com", "encodedPassword", "Test User", true, "USER", - LocalDate.now().minusYears(20), "EMAIL", null); + User user = new User(); + user.setEmail("test@example.com"); + user.setPassword("encodedPassword"); + user.setName("Test User"); + user.setVerified(true); + user.setRole("USER"); + user.setBirthdate(LocalDate.now().minusYears(20)); + user.setProvider("EMAIL"); + user.setSocialId(null); + when(userRepository.findByEmail("test@example.com")).thenReturn(user); when(passwordEncoder.matches("password", "encodedPassword")).thenReturn(true); @@ -228,8 +284,16 @@ class AuthenticationServiceTest { @Test void testLoginSocial_Success() { - User user = new User("social@example.com", null, "Social User", true, "USER", - LocalDate.now().minusYears(25), "GOOGLE", "social123"); + User user = new User(); + user.setEmail("social@example.com"); + user.setPassword(null); + user.setName("Social User"); + user.setVerified(true); + user.setRole("USER"); + user.setBirthdate(LocalDate.now().minusYears(25)); + user.setProvider("GOOGLE"); + user.setSocialId("social123"); + when(userRepository.findByEmail("social@example.com")).thenReturn(user); User result = authenticationService.loginSocial("social@example.com"); @@ -243,8 +307,16 @@ class AuthenticationServiceTest { void testVerifyOTP_Success() { // OTPService returns true and user is found when(otpService.verifyOTP("test@example.com", "123456")).thenReturn(true); - User user = new User("test@example.com", "encodedPassword", "Test User", false, "USER", - LocalDate.now().minusYears(20), "EMAIL", null); + User user = new User(); + user.setEmail("test@example.com"); + user.setPassword("encodedPassword"); + user.setName("Test User"); + user.setVerified(false); + user.setRole("USER"); + user.setBirthdate(LocalDate.now().minusYears(20)); + user.setProvider("EMAIL"); + user.setSocialId(null); + when(userRepository.findByEmail("test@example.com")).thenReturn(user); when(userRepository.save(any(User.class))).thenReturn(user); @@ -277,8 +349,16 @@ class AuthenticationServiceTest { @Test void testForgotPassword_Success() { - User user = new User("test@example.com", "encodedPassword", "Test User", true, "USER", - LocalDate.now().minusYears(20), "EMAIL", null); + User user = new User(); + user.setEmail("test@example.com"); + user.setPassword("encodedPassword"); + user.setName("Test User"); + user.setVerified(true); + user.setRole("USER"); + user.setBirthdate(LocalDate.now().minusYears(20)); + user.setProvider("EMAIL"); + user.setSocialId(null); + when(userRepository.findByEmail("test@example.com")).thenReturn(user); assertDoesNotThrow(() -> authenticationService.forgotPassword("test@example.com")); @@ -294,8 +374,16 @@ class AuthenticationServiceTest { assertTrue(exception1.getMessage().contains("Password reset is only available for email-registered users.")); // Case 2: user exists but provider is not EMAIL - User user = new User("social@example.com", null, "Social User", true, "USER", - LocalDate.now().minusYears(25), "GOOGLE", "social123"); + User user = new User(); + user.setEmail("social@example.com"); + user.setPassword(null); + user.setName("Social User"); + user.setVerified(true); + user.setRole("USER"); + user.setBirthdate(LocalDate.now().minusYears(25)); + user.setProvider("GOOGLE"); + user.setSocialId("social123"); + when(userRepository.findByEmail("social@example.com")).thenReturn(user); Exception exception2 = assertThrows(IllegalArgumentException.class, () -> authenticationService.forgotPassword("social@example.com") @@ -314,8 +402,16 @@ class AuthenticationServiceTest { @Test void testPostContent_UserNotVerified() { - User user = new User("test@example.com", "encodedPassword", "Test User", false, "USER", - LocalDate.now().minusYears(20), "EMAIL", null); + User user = new User(); + user.setEmail("test@example.com"); + user.setPassword("encodedPassword"); + user.setName("Test User"); + user.setVerified(false); + user.setRole("USER"); + user.setBirthdate(LocalDate.now().minusYears(20)); + user.setProvider("EMAIL"); + user.setSocialId(null); + when(userRepository.findByEmail("test@example.com")).thenReturn(user); String response = authenticationService.postContent("test@example.com", "Content"); assertTrue(response.contains("not verified")); @@ -323,8 +419,16 @@ class AuthenticationServiceTest { @Test void testPostContent_UserVerified() { - User user = new User("test@example.com", "encodedPassword", "Test User", true, "USER", - LocalDate.now().minusYears(20), "EMAIL", null); + User user = new User(); + user.setEmail("test@example.com"); + user.setPassword("encodedPassword"); + user.setName("Test User"); + user.setVerified(true); + user.setRole("USER"); + user.setBirthdate(LocalDate.now().minusYears(20)); + user.setProvider("EMAIL"); + user.setSocialId(null); + when(userRepository.findByEmail("test@example.com")).thenReturn(user); String response = authenticationService.postContent("test@example.com", "Content"); assertEquals("Content posted successfully", response); -- GitLab