修改login,register逻辑

Change-Id: If07481bce426e50165c4005416fa9911b218aee4
diff --git a/src/test/java/databasetest/databasesystest.java b/src/test/java/databasetest/databasesystest.java
index f802360..22a9b1e 100644
--- a/src/test/java/databasetest/databasesystest.java
+++ b/src/test/java/databasetest/databasesystest.java
@@ -20,6 +20,8 @@
 import org.junit.jupiter.api.DynamicTest;
 import org.junit.jupiter.api.TestFactory;
 
+import entity.UserInvite;
+import entity.QUserInvite;
 import database.Database1;
 import entity.User;
 import entity.config;
@@ -78,50 +80,133 @@
             EntityTransaction tx = em.getTransaction();
             tx.begin();
             try {
-                User user = new User();
-                String userId = testUserIds.get(i);
-                if (userId.length() > 36) userId = userId.substring(0, 36);
-                user.userid = userId;
-                user.email = testEmails.get(i);
-                user.username = "user" + i;
-                user.password = "pwd" + i;
-                user.sex = "m";
-                user.school = "school" + i;
-                user.pictureurl = null;
-                user.profile = null;
-                user.accountstate = false; // 必填
-                user.invitetimes = 5;      // 必填
-                // 关键:补充userPT字段,避免not-null property异常
-                entity.UserPT userPT = new entity.UserPT();
-                userPT.userid = user.userid;
-                userPT.magic = 0;
-                userPT.upload = 0L;
-                userPT.download = 0L;
-                userPT.share = 0.0;
-                userPT.farmurl = null;
-                userPT.viptime = 0;
-                userPT.user = user;
-                user.userPT = userPT;
-                // 正常注册
-                int ret = db.RegisterUser(user);
-                Assertions.assertEquals(0, ret, "RegisterUser should return 0 for success");
-                // 再次注册同邮箱用户应返回1
-                User user2 = new User();
-                String userId2 = userId + "_dup";
-                if (userId2.length() > 36) userId2 = userId2.substring(0, 36);
-                user2.userid = userId2;
-                user2.email = testEmails.get(i);
-                user2.username = "user_dup" + i;
-                user2.password = "pwd_dup" + i;
-                user2.sex = "f";
-                user2.school = "school_dup" + i;
-                user2.pictureurl = null;
-                user2.profile = null;
-                user2.accountstate = false; // 必填
-                user2.invitetimes = 5;      // 必填
-                int ret2 = db.RegisterUser(user2);
+                // 1. 创建一些用户并将其保存到数据库中
+                List<User> existingUsers = new ArrayList<>();
+                for (int j = 0; j < 3; j++) {
+                    User existingUser = new User();
+                    String userId = "existing_user_" + i + "_" + j;
+                    if (userId.length() > 36) userId = userId.substring(0, 36);
+                    existingUser.userid = userId;
+                    existingUser.email = "existing_email_" + i + "_" + j + "@example.com";
+                    existingUser.username = "existing_user" + i + "_" + j;
+                    existingUser.password = "pwd" + i;
+                    existingUser.sex = "m";
+                    existingUser.school = "school" + i;
+                    existingUser.pictureurl = null;
+                    existingUser.profile = null;
+                    existingUser.accountstate = false;
+                    existingUser.invitetimes = 5;
+                    
+                    entity.UserPT existingUserPT = new entity.UserPT();
+                    existingUserPT.userid = existingUser.userid;
+                    existingUserPT.magic = 0;
+                    existingUserPT.upload = 0L;
+                    existingUserPT.download = 0L;
+                    existingUserPT.share = 0.0;
+                    existingUserPT.farmurl = null;
+                    existingUserPT.viptime = 0;
+                    existingUserPT.user = existingUser;
+                    existingUser.userPT = existingUserPT;
+                    
+                    em.persist(existingUser);
+                    existingUsers.add(existingUser);
+                }
+                em.flush();
+                
+                // 2. 创建邀请记录 - 一些被邀请的邮箱和一些未被邀请的邮箱
+                // 被邀请的邮箱列表
+                List<String> invitedEmails = new ArrayList<>();
+                for (int j = 0; j < 3; j++) {
+                    // 生成邀请记录
+                    String invitedEmail = "invited_" + i + "_" + j + "@example.com";
+                    invitedEmails.add(invitedEmail);
+                    
+                    UserInvite invite = new UserInvite();
+                    invite.userId = existingUsers.get(j % existingUsers.size()).userid; // 使用现有用户作为邀请人
+                    invite.inviterEmail = invitedEmail;
+                    invite.inviterRegistered = false;
+                    em.persist(invite);
+                }
+                em.flush();
+                
+                // 非邀请邮箱
+                List<String> uninvitedEmails = new ArrayList<>();
+                for (int j = 0; j < 2; j++) {
+                    uninvitedEmails.add("uninvited_" + i + "_" + j + "@example.com");
+                }
+                
+                // 3. 测试被邀请且首次注册的用户 - 应该成功 (返回0)
+                User invitedUser = new User();
+                String invitedUserId = testUserIds.get(i);
+                if (invitedUserId.length() > 36) invitedUserId = invitedUserId.substring(0, 36);
+                invitedUser.userid = invitedUserId;
+                invitedUser.email = invitedEmails.get(0); // 使用被邀请的邮箱
+                invitedUser.username = "invited_user" + i;
+                invitedUser.password = "pwd" + i;
+                invitedUser.sex = "m";
+                invitedUser.school = "school" + i;
+                invitedUser.pictureurl = null;
+                invitedUser.profile = null;
+                invitedUser.accountstate = false;
+                invitedUser.invitetimes = 5;
+                
+                entity.UserPT invitedUserPT = new entity.UserPT();
+                invitedUserPT.userid = invitedUser.userid;
+                invitedUserPT.magic = 0;
+                invitedUserPT.upload = 0L;
+                invitedUserPT.download = 0L;
+                invitedUserPT.share = 0.0;
+                invitedUserPT.farmurl = null;
+                invitedUserPT.viptime = 0;
+                invitedUserPT.user = invitedUser;
+                invitedUser.userPT = invitedUserPT;
+                
+                int ret1 = db.RegisterUser(invitedUser);
+                Assertions.assertEquals(0, ret1, "RegisterUser should return 0 for invited user's first registration");
+                
+                // 检查用户是否已保存到数据库
+                User checkUser = em.find(User.class, invitedUserId);
+                Assertions.assertNotNull(checkUser, "User should be saved to database when registration succeeds");
+                Assertions.assertEquals(invitedUser.email, checkUser.email);
+                
+                // 4. 测试被邀请但重复注册的用户 - 应该失败 (返回1)
+                User duplicateUser = new User();
+                String duplicateUserId = "duplicate_" + i;
+                if (duplicateUserId.length() > 36) duplicateUserId = duplicateUserId.substring(0, 36);
+                duplicateUser.userid = duplicateUserId;
+                duplicateUser.email = invitedEmails.get(0); // 重复使用同一个邮箱
+                duplicateUser.username = "duplicate_user" + i;
+                duplicateUser.password = "pwd_dup" + i;
+                duplicateUser.sex = "f";
+                duplicateUser.school = "school_dup" + i;
+                duplicateUser.pictureurl = null;
+                duplicateUser.profile = null;
+                duplicateUser.accountstate = false;
+                duplicateUser.invitetimes = 5;
+                
+                int ret2 = db.RegisterUser(duplicateUser);
                 Assertions.assertEquals(1, ret2, "RegisterUser should return 1 for duplicate email");
+                
+                // 5. 测试未被邀请的用户 - 应该失败 (返回2)
+                User uninvitedUser = new User();
+                String uninvitedUserId = "uninvited_" + i;
+                if (uninvitedUserId.length() > 36) uninvitedUserId = uninvitedUserId.substring(0, 36);
+                uninvitedUser.userid = uninvitedUserId;
+                uninvitedUser.email = uninvitedEmails.get(0); // 使用未被邀请的邮箱
+                uninvitedUser.username = "uninvited_user" + i;
+                uninvitedUser.password = "pwd_uninv" + i;
+                uninvitedUser.sex = "m";
+                uninvitedUser.school = "school_uninv" + i;
+                uninvitedUser.pictureurl = null;
+                uninvitedUser.profile = null;
+                uninvitedUser.accountstate = false;
+                uninvitedUser.invitetimes = 5;
+                
+                int ret3 = db.RegisterUser(uninvitedUser);
+                Assertions.assertEquals(2, ret3, "RegisterUser should return 2 for uninvited email");
+                
             } finally {
+                // 确保回滚所有更改,不影响真实数据库
                 tx.rollback();
             }
         })).collect(Collectors.toList());
@@ -1151,4 +1236,92 @@
             }
         })).collect(Collectors.toList());
     }
+
+    @TestFactory
+    Collection<DynamicTest> testLoginUser() {
+        // 查询所有现有用户
+        List<User> allUsers = em.createQuery("SELECT u FROM User u", User.class).getResultList();
+        
+        // 为每个用户创建测试
+        return allUsers.stream().map(existingUser -> 
+            DynamicTest.dynamicTest("LoginUser test for user: " + existingUser.username, () -> {
+                EntityTransaction tx = em.getTransaction();
+                tx.begin();
+                try {
+                    // 测试1:使用用户名登录(成功)
+                    User loginWithUsername = new User();
+                    loginWithUsername.username = existingUser.username;
+                    loginWithUsername.password = existingUser.password;
+                    String loginResult1 = db.LoginUser(loginWithUsername);
+                    Assertions.assertEquals(existingUser.userid, loginResult1, 
+                        "Should successfully login with username and correct password for user: " + existingUser.username);
+                    
+                    // 测试2:使用邮箱登录(成功)
+                    User loginWithEmail = new User();
+                    loginWithEmail.email = existingUser.email;
+                    loginWithEmail.password = existingUser.password;
+                    String loginResult2 = db.LoginUser(loginWithEmail);
+                    Assertions.assertEquals(existingUser.userid, loginResult2, 
+                        "Should successfully login with email and correct password for user: " + existingUser.email);
+                    
+                    // 测试3:密码错误(失败)
+                    User wrongPassword = new User();
+                    wrongPassword.username = existingUser.username;
+                    wrongPassword.password = "wrong_password_" + UUID.randomUUID();
+                    String loginResult3 = db.LoginUser(wrongPassword);
+                    Assertions.assertNull(loginResult3, 
+                        "Should fail with wrong password for user: " + existingUser.username);
+                    
+                    // 测试4:同时提供用户名和邮箱(失败)
+                    User bothFields = new User();
+                    bothFields.username = existingUser.username;
+                    bothFields.email = existingUser.email;
+                    bothFields.password = existingUser.password;
+                    String loginResult5 = db.LoginUser(bothFields);
+                    Assertions.assertNull(loginResult5, 
+                        "Should fail when both username and email are provided for user: " + existingUser.username);
+                    
+                } finally {
+                    tx.rollback();
+                }
+            })
+        ).collect(Collectors.toList());
+    }
+    
+    @TestFactory
+    Collection<DynamicTest> testLoginUserAdditionalCases() {
+        return IntStream.range(0, 3).mapToObj(i -> DynamicTest.dynamicTest("LoginUser additional test #" + i, () -> {
+            EntityTransaction tx = em.getTransaction();
+            tx.begin();
+            try {
+                // 测试1:用户名不存在(失败)
+                User nonExistentUser = new User();
+                nonExistentUser.username = "non_existent_user_" + UUID.randomUUID();
+                nonExistentUser.password = "any_password";
+                String loginResult1 = db.LoginUser(nonExistentUser);
+                Assertions.assertNull(loginResult1, "Should fail with non-existent username");
+                
+                // 测试2:邮箱不存在(失败)
+                User nonExistentEmail = new User();
+                nonExistentEmail.email = "non_existent_" + UUID.randomUUID() + "@example.com";
+                nonExistentEmail.password = "any_password";
+                String loginResult2 = db.LoginUser(nonExistentEmail);
+                Assertions.assertNull(loginResult2, "Should fail with non-existent email");
+                
+                // 测试3:缺少密码(失败)
+                User noPassword = new User();
+                noPassword.username = "some_username";
+                noPassword.password = null;
+                String loginResult3 = db.LoginUser(noPassword);
+                Assertions.assertNull(loginResult3, "Should fail when password is null");
+                
+                // 测试4:null userinfo(失败)
+                String loginResult4 = db.LoginUser(null);
+                Assertions.assertNull(loginResult4, "Should fail when userinfo is null");
+                
+            } finally {
+                tx.rollback();
+            }
+        })).collect(Collectors.toList());
+    }
 }
\ No newline at end of file