lrj
2 天以前 c61d4fe27c97d2ecc907756aa571a4ef14a7b9b6
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
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
package com.rongyichuang.judge;
 
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.test.context.ActiveProfiles;
 
import java.io.File;
import java.util.List;
import java.util.Map;
 
import static org.junit.jupiter.api.Assertions.*;
 
@SpringBootTest
@ActiveProfiles("test")
public class JudgeModuleCompleteTest {
 
    @Autowired
    private JdbcTemplate jdbcTemplate;
 
    @Test
    public void testCompleteJudgeModuleFlow() throws Exception {
        System.out.println("=== 开始完整的评委模块测试 ===");
        
        // 1. 验证logo图片文件存在
        System.out.println("步骤1: 验证头像图片文件");
        File logoFile = findLogoFile();
        assertNotNull(logoFile, "应该找到logo图片文件");
        System.out.println("✓ 找到头像图片: " + logoFile.getAbsolutePath());
        
        // 2. 模拟前端上传头像,保存到t_media表
        System.out.println("步骤2: 保存头像媒体信息");
        Long mediaId = saveAvatarMedia();
        assertNotNull(mediaId, "头像媒体信息保存应该成功");
        System.out.println("✓ 头像媒体信息保存成功,ID: " + mediaId);
        
        // 3. 创建评委信息,保存到t_judge表
        System.out.println("步骤3: 创建评委信息");
        Long judgeId = createJudge();
        assertNotNull(judgeId, "评委创建应该成功");
        System.out.println("✓ 评委创建成功,ID: " + judgeId);
        
        // 4. 创建标签并关联到评委
        System.out.println("步骤4: 创建标签并关联");
        createTagsAndAssociate(judgeId);
        System.out.println("✓ 标签创建和关联成功");
        
        // 5. 更新媒体记录的关联信息
        System.out.println("步骤5: 更新媒体关联信息");
        updateMediaAssociation(mediaId, judgeId);
        System.out.println("✓ 媒体关联信息更新成功");
        
        // 6. 验证所有数据库数据的正确性
        System.out.println("步骤6: 验证数据库数据");
        verifyAllDatabaseData(mediaId, judgeId);
        
        System.out.println("=== 完整的评委模块测试成功 ===");
    }
 
    private File findLogoFile() {
        String[] possiblePaths = {
            "../UI/logo.jpg",
            "UI/logo.jpg",
            "../UI/logo.png",
            "UI/logo.png"
        };
        
        for (String path : possiblePaths) {
            File file = new File(path);
            if (file.exists()) {
                return file;
            }
        }
        return null;
    }
 
    private Long saveAvatarMedia() {
        // 模拟文件上传到COS后的路径
        String cosPath = "avatars/judge_avatar_" + System.currentTimeMillis() + ".jpg";
        
        String sql = """
            INSERT INTO t_media (name, path, file_size, file_ext, media_type, target_type, target_id, state) 
            VALUES (?, ?, ?, ?, ?, ?, ?, ?)
            """;
        
        jdbcTemplate.update(sql, 
            "judge_avatar.jpg",     // name
            cosPath,                // path
            1024,                   // file_size
            "jpg",                  // file_ext
            1,                      // media_type (1=图片)
            1,                      // target_type (1=评委头像)
            0L,                     // target_id (临时值,后续更新)
            1                       // state
        );
        
        // 获取刚插入的ID
        String selectSql = "SELECT id FROM t_media WHERE path = ? ORDER BY id DESC LIMIT 1";
        return jdbcTemplate.queryForObject(selectSql, Long.class, cosPath);
    }
 
    private Long createJudge() {
        String sql = """
            INSERT INTO t_judge (name, phone, gender, description, state) 
            VALUES (?, ?, ?, ?, ?)
            """;
        
        jdbcTemplate.update(sql, 
            "张三",                                    // name
            "13800138000",                           // phone
            1,                                       // gender (1=男)
            "拥有10年以上的技术开发经验,专注于云计算和大数据领域。", // description
            1                                        // state (1=正常)
        );
        
        // 获取刚插入的ID
        String selectSql = "SELECT id FROM t_judge WHERE phone = ? ORDER BY id DESC LIMIT 1";
        return jdbcTemplate.queryForObject(selectSql, Long.class, "13800138000");
    }
 
    private void createTagsAndAssociate(Long judgeId) {
        String[] tagNames = {"云计算", "大数据", "架构设计"};
        
        for (String tagName : tagNames) {
            // 检查标签是否已存在
            String checkSql = "SELECT COUNT(*) FROM t_tag WHERE name = ?";
            int count = jdbcTemplate.queryForObject(checkSql, Integer.class, tagName);
            
            Long tagId;
            if (count == 0) {
                // 创建新标签
                String insertTagSql = """
                    INSERT INTO t_tag (name, code, category, state) 
                    VALUES (?, ?, ?, ?)
                    """;
                
                jdbcTemplate.update(insertTagSql, 
                    tagName,                    // name
                    tagName.toLowerCase(),      // code
                    "技术",                     // category
                    1                          // state
                );
                
                // 获取标签ID
                String selectTagSql = "SELECT id FROM t_tag WHERE name = ? ORDER BY id DESC LIMIT 1";
                tagId = jdbcTemplate.queryForObject(selectTagSql, Long.class, tagName);
            } else {
                // 获取已存在的标签ID
                String selectTagSql = "SELECT id FROM t_tag WHERE name = ?";
                tagId = jdbcTemplate.queryForObject(selectTagSql, Long.class, tagName);
            }
            
            // 关联评委和标签
            String associateSql = """
                INSERT INTO t_judge_tag (judge_id, tag_id, state) 
                VALUES (?, ?, ?)
                """;
            
            jdbcTemplate.update(associateSql, judgeId, tagId, 1);
        }
    }
 
    private void updateMediaAssociation(Long mediaId, Long judgeId) {
        String sql = "UPDATE t_media SET target_id = ? WHERE id = ?";
        int updated = jdbcTemplate.update(sql, judgeId, mediaId);
        assertEquals(1, updated, "应该更新一条媒体记录");
    }
 
    private void verifyAllDatabaseData(Long mediaId, Long judgeId) {
        System.out.println("=== 验证数据库数据 ===");
        
        // 验证t_media表数据
        System.out.println("验证t_media表数据...");
        String mediaSql = "SELECT id, name, path, target_type, target_id, media_type, file_size, file_ext FROM t_media WHERE id = ?";
        Map<String, Object> mediaRecord = jdbcTemplate.queryForMap(mediaSql, mediaId);
        
        assertNotNull(mediaRecord, "应该找到媒体记录");
        assertEquals("judge_avatar.jpg", mediaRecord.get("name"), "媒体文件名应该正确");
        assertTrue(mediaRecord.get("path").toString().contains("avatars/"), "媒体路径应该包含avatars目录");
        assertEquals(1, mediaRecord.get("target_type"), "target_type应该是1(评委头像)");
        assertEquals(judgeId.longValue(), ((Number)mediaRecord.get("target_id")).longValue(), "target_id应该是评委ID");
        assertEquals(1, mediaRecord.get("media_type"), "media_type应该是1(图片)");
        assertEquals(1024, mediaRecord.get("file_size"), "文件大小应该正确");
        assertEquals("jpg", mediaRecord.get("file_ext"), "文件扩展名应该正确");
        
        System.out.println("✓ t_media表数据验证通过");
        System.out.println("  - 文件名: " + mediaRecord.get("name"));
        System.out.println("  - 路径: " + mediaRecord.get("path"));
        System.out.println("  - 目标类型: " + mediaRecord.get("target_type"));
        System.out.println("  - 目标ID: " + mediaRecord.get("target_id"));
        System.out.println("  - 媒体类型: " + mediaRecord.get("media_type"));
        
        // 验证t_judge表数据
        System.out.println("验证t_judge表数据...");
        String judgeSql = "SELECT id, name, phone, gender, description, state FROM t_judge WHERE id = ?";
        Map<String, Object> judgeRecord = jdbcTemplate.queryForMap(judgeSql, judgeId);
        
        assertNotNull(judgeRecord, "应该找到评委记录");
        assertEquals("张三", judgeRecord.get("name"), "评委姓名应该正确");
        assertEquals("13800138000", judgeRecord.get("phone"), "评委电话应该正确");
        assertEquals(1, judgeRecord.get("gender"), "评委性别应该正确");
        assertTrue(judgeRecord.get("description").toString().contains("10年以上"), "评委介绍应该正确");
        assertEquals(1, judgeRecord.get("state"), "评委状态应该正确");
        
        System.out.println("✓ t_judge表数据验证通过");
        System.out.println("  - 姓名: " + judgeRecord.get("name"));
        System.out.println("  - 电话: " + judgeRecord.get("phone"));
        System.out.println("  - 性别: " + judgeRecord.get("gender"));
        System.out.println("  - 状态: " + judgeRecord.get("state"));
        
        // 验证t_judge_tag表数据
        System.out.println("验证t_judge_tag表数据...");
        String tagSql = """
            SELECT jt.judge_id, t.name as tag_name, t.category 
            FROM t_judge_tag jt 
            JOIN t_tag t ON jt.tag_id = t.id 
            WHERE jt.judge_id = ? AND jt.state = 1
            """;
        List<Map<String, Object>> tagRecords = jdbcTemplate.queryForList(tagSql, judgeId);
        
        assertFalse(tagRecords.isEmpty(), "应该找到评委标签记录");
        assertEquals(3, tagRecords.size(), "应该有3个标签");
        
        System.out.println("✓ t_judge_tag表数据验证通过");
        for (Map<String, Object> tagRecord : tagRecords) {
            System.out.println("  - 标签: " + tagRecord.get("tag_name") + " (分类: " + tagRecord.get("category") + ")");
        }
        
        // 验证数据关联的正确性
        System.out.println("验证数据关联...");
        String associationSql = """
            SELECT 
                j.name as judge_name,
                m.name as media_name,
                m.path as media_path,
                COUNT(jt.tag_id) as tag_count
            FROM t_judge j
            LEFT JOIN t_media m ON m.target_id = j.id AND m.target_type = 1
            LEFT JOIN t_judge_tag jt ON jt.judge_id = j.id AND jt.state = 1
            WHERE j.id = ?
            GROUP BY j.id, m.id
            """;
        
        Map<String, Object> associationRecord = jdbcTemplate.queryForMap(associationSql, judgeId);
        
        assertEquals("张三", associationRecord.get("judge_name"), "评委姓名应该正确");
        assertEquals("judge_avatar.jpg", associationRecord.get("media_name"), "关联的媒体文件名应该正确");
        assertTrue(associationRecord.get("media_path").toString().contains("avatars/"), "关联的媒体路径应该正确");
        assertEquals(3L, ((Number)associationRecord.get("tag_count")).longValue(), "应该关联3个标签");
        
        System.out.println("✓ 数据关联验证通过");
        System.out.println("  - 评委: " + associationRecord.get("judge_name"));
        System.out.println("  - 头像: " + associationRecord.get("media_name"));
        System.out.println("  - 标签数量: " + associationRecord.get("tag_count"));
        
        System.out.println("=== 所有数据库数据验证通过 ===");
    }
}