lrj
昨天 9f8395fab13ca4b230a0f7d62636e209745c91d4
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
package com.rongyichuang.user;
 
import com.rongyichuang.user.entity.User;
import com.rongyichuang.user.service.UserService;
import com.rongyichuang.user.repository.UserRepository;
import com.rongyichuang.employee.entity.Employee;
import com.rongyichuang.employee.repository.EmployeeRepository;
import com.rongyichuang.judge.entity.Judge;
import com.rongyichuang.judge.repository.JudgeRepository;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.ActiveProfiles;
import org.springframework.transaction.annotation.Transactional;
 
import static org.junit.jupiter.api.Assertions.*;
 
/**
 * 测试saveUserPhone方法的功能
 */
@SpringBootTest
@ActiveProfiles("test")
@Transactional
public class SaveUserPhoneTest {
 
    @Autowired
    private UserService userService;
 
    @Autowired
    private UserRepository userRepository;
 
    @Autowired
    private EmployeeRepository employeeRepository;
 
    @Autowired
    private JudgeRepository judgeRepository;
 
    @Test
    public void testSaveUserPhoneNewPhone() {
        System.out.println("=== 测试场景1:保存新手机号 ===");
        
        // 创建一个有openid的用户
        User user = new User();
        user.setName("测试用户");
        user.setWxOpenid("test_openid_123");
        user = userRepository.save(user);
        
        // 保存手机号(使用时间戳确保唯一性)
        String phone = "139" + String.valueOf(System.currentTimeMillis()).substring(5);
        User result = userService.saveUserPhone(user.getId(), phone);
        
        // 验证结果
        assertEquals(phone, result.getPhone());
        System.out.println("✅ 成功保存新手机号: " + phone);
    }
 
    @Test
    public void testSaveUserPhoneSameUser() {
        System.out.println("=== 测试场景2:保存相同用户的手机号 ===");
        
        // 创建一个已有手机号的用户
        String phone = "139" + String.valueOf(System.currentTimeMillis()).substring(5);
        User user = new User();
        user.setName("测试用户");
        user.setPhone(phone);
        user.setWxOpenid("test_openid_456");
        user = userRepository.save(user);
        
        // 再次保存相同手机号
        User result = userService.saveUserPhone(user.getId(), phone);
        
        // 验证结果
        assertEquals(phone, result.getPhone());
        System.out.println("✅ 相同用户手机号无需更新");
    }
 
    @Test
    public void testSaveUserPhoneWithDataMigration() {
        System.out.println("=== 测试场景3:数据迁移场景 ===");
        
        // 创建一个没有openid但有手机号的用户(老用户)
        String phone = "139" + String.valueOf(System.currentTimeMillis()).substring(5);
        User oldUser = new User();
        oldUser.setName("老用户");
        oldUser.setPhone(phone);
        // 注意:没有设置wxOpenid
        oldUser = userRepository.save(oldUser);
        
        // 为老用户创建员工信息
        Employee employee = new Employee();
        employee.setName("老用户员工");
        employee.setPhone(phone);
        employee.setUserId(oldUser.getId());
        employee.setRoleId("EMPLOYEE");
        employee = employeeRepository.save(employee);
        
        // 创建一个有openid的新用户(微信用户)
        User newUser = new User();
        newUser.setName("新用户");
        newUser.setWxOpenid("test_openid_789");
        newUser = userRepository.save(newUser);
        
        // 新用户尝试保存老用户的手机号
        User result = userService.saveUserPhone(newUser.getId(), phone);
        
        // 验证结果
        assertEquals(phone, result.getPhone());
        
        // 验证老用户的手机号被清空
        User updatedOldUser = userRepository.findById(oldUser.getId()).orElse(null);
        assertNotNull(updatedOldUser);
        assertNull(updatedOldUser.getPhone());
        
        // 验证员工信息被迁移到新用户
        Employee updatedEmployee = employeeRepository.findById(employee.getId()).orElse(null);
        assertNotNull(updatedEmployee);
        assertEquals(newUser.getId(), updatedEmployee.getUserId());
        
        System.out.println("✅ 数据迁移成功完成");
        System.out.println("  - 老用户手机号已清空");
        System.out.println("  - 员工信息已迁移到新用户");
    }
 
    @Test
    public void testSaveUserPhoneConflictResolution() {
        System.out.println("=== 测试场景4:冲突处理 ===");
        
        // 创建一个有openid和手机号的用户A
        String phone = "139" + String.valueOf(System.currentTimeMillis()).substring(5);
        User userA = new User();
        userA.setName("用户A");
        userA.setPhone(phone);
        userA.setWxOpenid("test_openid_A");
        userA = userRepository.save(userA);
        
        // 创建一个有openid的用户B
        User userB = new User();
        userB.setName("用户B");
        userB.setWxOpenid("test_openid_B");
        userB = userRepository.save(userB);
        
        // 用户B尝试保存用户A的手机号(应该抛出异常)
        final Long userBId = userB.getId();
        assertThrows(RuntimeException.class, () -> {
            userService.saveUserPhone(userBId, phone);
        });
        
        System.out.println("✅ 正确处理了冲突情况");
    }
 
    @Test
    public void testSaveUserPhoneComplexDataMigration() {
        System.out.println("=== 测试场景5:复杂数据迁移 ===");
        
        // 创建一个没有openid但有手机号的用户(老用户)
        String phone = "139" + String.valueOf(System.currentTimeMillis()).substring(5);
        User oldUser = new User();
        oldUser.setName("老用户");
        oldUser.setPhone(phone);
        oldUser = userRepository.save(oldUser);
        
        // 为老用户创建员工和裁判信息
        Employee employee = new Employee();
        employee.setName("老用户员工");
        employee.setPhone(phone);
        employee.setUserId(oldUser.getId());
        employee.setRoleId("EMPLOYEE");
        employee = employeeRepository.save(employee);
        
        Judge judge = new Judge();
        judge.setName("老用户裁判");
        judge.setPhone(phone);
        judge.setUserId(oldUser.getId());
        judge = judgeRepository.save(judge);
        
        // 创建一个有openid的新用户(微信用户)
        User newUser = new User();
        newUser.setName("新用户");
        newUser.setWxOpenid("test_openid_complex");
        newUser = userRepository.save(newUser);
        
        // 新用户尝试保存老用户的手机号
        User result = userService.saveUserPhone(newUser.getId(), phone);
        
        // 验证结果
        assertEquals(phone, result.getPhone());
        
        // 验证老用户的手机号被清空
        User updatedOldUser = userRepository.findById(oldUser.getId()).orElse(null);
        assertNotNull(updatedOldUser);
        assertNull(updatedOldUser.getPhone());
        
        // 验证员工信息被迁移到新用户
        Employee updatedEmployee = employeeRepository.findById(employee.getId()).orElse(null);
        assertNotNull(updatedEmployee);
        assertEquals(newUser.getId(), updatedEmployee.getUserId());
        
        // 验证评委信息被迁移到新用户
        Judge updatedJudge = judgeRepository.findById(judge.getId()).orElse(null);
        assertNotNull(updatedJudge);
        assertEquals(newUser.getId(), updatedJudge.getUserId());
        
        System.out.println("✅ 复杂数据迁移成功完成");
        System.out.println("  - 老用户手机号已清空");
        System.out.println("  - 员工信息已迁移到新用户");
        System.out.println("  - 评委信息已迁移到新用户");
    }
}