添加了修改密码 忘记密码 邀请码的生成与验证

Change-Id: I88ffc40e64943c7c9fcd411c763e788e6e49c834
diff --git a/src/test/java/com/example/g8backend/service/ForgotPasswordServiceImplTest.java b/src/test/java/com/example/g8backend/service/ForgotPasswordServiceImplTest.java
new file mode 100644
index 0000000..05535fd
--- /dev/null
+++ b/src/test/java/com/example/g8backend/service/ForgotPasswordServiceImplTest.java
@@ -0,0 +1,77 @@
+package com.example.g8backend.service;
+
+import com.example.g8backend.entity.User;
+import com.example.g8backend.mapper.UserMapper;
+import com.example.g8backend.service.impl.ForgotPasswordServiceImpl;
+import com.example.g8backend.util.mailUtil; // Import mailUtil
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+import org.mockito.InjectMocks;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+import org.springframework.data.redis.core.RedisTemplate;
+import org.springframework.data.redis.core.ValueOperations;
+import org.springframework.security.crypto.password.PasswordEncoder;
+
+import static org.junit.jupiter.api.Assertions.*;
+import static org.mockito.Mockito.*;
+
+public class ForgotPasswordServiceImplTest {
+
+    @Mock
+    private UserMapper userMapper;
+    @Mock
+    private RedisTemplate<String, String> redisTemplate;
+    @Mock
+    private PasswordEncoder passwordEncoder;
+    @Mock
+    private mailUtil mailUtil;  // Mock mailUtil
+
+    @InjectMocks
+    private ForgotPasswordServiceImpl forgotPasswordService;
+
+    @Mock
+    private ValueOperations<String, String> valueOperations; // Mock Redis ValueOperations
+
+    @BeforeEach
+    void setUp() {
+        MockitoAnnotations.openMocks(this);
+        when(redisTemplate.opsForValue()).thenReturn(valueOperations); // Mock Redis operations
+    }
+
+    @Test
+    void sendCodeToEmail_Success() {
+        User user = new User();
+        user.setUserName("test");
+        user.setEmail("test@example.com");
+        when(userMapper.getUserByName("test")).thenReturn(user);
+
+        // Call the method under test
+        forgotPasswordService.sendCodeToEmail("test");
+
+        // Verify that mailUtil.sendMail was called once with the expected arguments
+        verify(mailUtil, times(1)).sendMail(eq("test@example.com"), eq("重置密码验证码"), contains("您的验证码"));
+        verify(redisTemplate, times(1)).opsForValue();
+    }
+
+    @Test
+    void resetPassword_Success() {
+        User user = new User();
+        user.setUserName("test");
+        user.setPassword("old");
+        when(userMapper.getUserByName("test")).thenReturn(user);
+        when(redisTemplate.opsForValue().get("reset_code:test")).thenReturn("123456");
+        when(passwordEncoder.encode("newpass")).thenReturn("encodedNew");
+        when(userMapper.updateById(any(User.class))).thenReturn(1);
+
+        boolean result = forgotPasswordService.resetPassword("test", "123456", "newpass");
+        assertTrue(result);
+        verify(redisTemplate, times(1)).delete("reset_code:test");
+    }
+
+    @Test
+    void resetPassword_WrongCode() {
+        when(redisTemplate.opsForValue().get("reset_code:test")).thenReturn("654321");
+        assertThrows(RuntimeException.class, () -> forgotPasswordService.resetPassword("test", "123456", "newpass"));
+    }
+}
diff --git a/src/test/java/com/example/g8backend/service/UserSecurityServiceImplTest.java b/src/test/java/com/example/g8backend/service/UserSecurityServiceImplTest.java
new file mode 100644
index 0000000..f04fbc5
--- /dev/null
+++ b/src/test/java/com/example/g8backend/service/UserSecurityServiceImplTest.java
@@ -0,0 +1,55 @@
+package com.example.g8backend.service;
+
+import com.example.g8backend.entity.User;
+import com.example.g8backend.mapper.UserMapper;
+import com.example.g8backend.service.impl.UserSecurityServiceImpl;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+import org.mockito.InjectMocks;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+import org.springframework.security.crypto.password.PasswordEncoder;
+
+import static org.junit.jupiter.api.Assertions.*;
+import static org.mockito.Mockito.*;
+
+public class UserSecurityServiceImplTest {
+
+    @Mock
+    private UserMapper userMapper;
+    @Mock
+    private PasswordEncoder passwordEncoder;
+
+    @InjectMocks
+    private UserSecurityServiceImpl userSecurityService;
+
+    private User user;
+
+    @BeforeEach
+    void setUp() {
+        MockitoAnnotations.openMocks(this);
+        user = new User();
+        user.setUserId(1L);
+        user.setPassword("encodedOld");
+    }
+
+    @Test
+    void changePassword_Success() {
+        when(userMapper.selectById(1L)).thenReturn(user);
+        when(passwordEncoder.matches("old", "encodedOld")).thenReturn(true);
+        when(passwordEncoder.encode("new")).thenReturn("encodedNew");
+        when(userMapper.updateById(any(User.class))).thenReturn(1);
+
+        boolean result = userSecurityService.changePassword(1L, "old", "new");
+        assertTrue(result);
+        verify(userMapper).updateById(any(User.class));
+    }
+
+    @Test
+    void changePassword_WrongOldPassword() {
+        when(userMapper.selectById(1L)).thenReturn(user);
+        when(passwordEncoder.matches("wrong", "encodedOld")).thenReturn(false);
+
+        assertThrows(RuntimeException.class, () -> userSecurityService.changePassword(1L, "wrong", "new"));
+    }
+}
\ No newline at end of file