新增e2e测试脚本,修复部分问题

This commit was merged in pull request #51.
This commit is contained in:
2026-07-22 20:00:13 +08:00
parent 53d1ce6fb2
commit 4c07ec5455
105 changed files with 21700 additions and 318 deletions
@@ -0,0 +1,174 @@
-- ============================================
-- E2E 测试种子数据
-- 描述: Gym 业务模块测试用初始化数据
-- 注意: 使用 INSERT ... ON CONFLICT DO NOTHING 确保幂等性
-- ID 从 100 开始避免与已有数据冲突
-- ============================================
-- ============================================
-- 1. 测试教练(sys_user + user_role
-- 密码均为 Test@123
-- bcrypt: $2a$12$nZ1EMUpZQljbnEdIKzH72eHlDJKUmHmHppnTTVth/SlHs5VpSAr8C
-- ============================================
INSERT INTO sys_user (id, username, password, email, phone, nickname, status, create_by, update_by, created_at, updated_at)
VALUES
(100, 'coach_e2e_01', '$2a$12$nZ1EMUpZQljbnEdIKzH72eHlDJKUmHmHppnTTVth/SlHs5VpSAr8C', 'coach_e2e_01@test.com', '13900139100', 'E2E测试教练-张', 1, 'system', 'system', NOW(), NOW()),
(101, 'coach_e2e_02', '$2a$12$nZ1EMUpZQljbnEdIKzH72eHlDJKUmHmHppnTTVth/SlHs5VpSAr8C', 'coach_e2e_02@test.com', '13900139101', 'E2E测试教练-李', 1, 'system', 'system', NOW(), NOW())
ON CONFLICT (username) DO UPDATE SET
password = EXCLUDED.password,
status = EXCLUDED.status;
-- 分配教练角色(role_id=5
INSERT INTO user_role (user_id, role_id, created_by, created_at)
VALUES
(100, 5, 'system', NOW()),
(101, 5, 'system', NOW())
ON CONFLICT (user_id, role_id) DO NOTHING;
-- ============================================
-- 2. 团课类型(group_course_type
-- ============================================
INSERT INTO group_course_type (id, type_name, base_difficulty, description, category, create_by, update_by, created_at, updated_at)
VALUES
(100, '瑜伽', 3, '通过呼吸调控与体式练习,提升身体柔韧性与心灵平静', '柔韧与平衡类', 'system', 'system', NOW(), NOW()),
(101, '动感单车', 5, '伴随动感音乐进行室内骑行,高效燃脂释放压力', '基础有氧与热身', 'system', 'system', NOW(), NOW()),
(102, '搏击操', 6, '融合拳击、踢腿动作的有氧运动,宣泄压力同时高效塑形', '高强度与爆发力', 'system', 'system', NOW(), NOW()),
(103, '普拉提', 4, '注重核心肌群控制与脊柱对齐,有效改善体态预防运动损伤', '柔韧与平衡类', 'system', 'system', NOW(), NOW())
ON CONFLICT (id) DO UPDATE SET
type_name = EXCLUDED.type_name,
base_difficulty = EXCLUDED.base_difficulty,
description = EXCLUDED.description,
category = EXCLUDED.category;
-- ============================================
-- 3. 课程标签(course_label
-- ============================================
INSERT INTO course_label (id, label_name, color, description, create_by, update_by, created_at, updated_at)
VALUES
(100, '燃脂', '#ff4d4f', '高效燃烧卡路里,助力减脂', 'system', 'system', NOW(), NOW()),
(101, '塑形', '#722ed1', '注重体型塑造与线条雕刻', 'system', 'system', NOW(), NOW()),
(102, '减压', '#52c41a', '放松身心,缓解压力', 'system', 'system', NOW(), NOW()),
(103, '核心训练', '#1890ff', '强化核心肌群,改善身体稳定性', 'system', 'system', NOW(), NOW()),
(104, '初学者友好', '#faad14', '适合健身初学者,动作简单易学', 'system', 'system', NOW(), NOW()),
(105, '高阶挑战', '#f5222d', '适合高级学员,强度和技巧要求较高', 'system', 'system', NOW(), NOW())
ON CONFLICT (id) DO UPDATE SET
label_name = EXCLUDED.label_name,
color = EXCLUDED.color,
description = EXCLUDED.description;
-- ============================================
-- 4. 类型-标签关联(course_type_label
-- ============================================
-- 瑜伽: 减压 + 初学者友好 + 核心训练
INSERT INTO course_type_label (type_id, label_id, create_by, update_by, created_at, updated_at)
SELECT 100, 102, 'system', 'system', NOW(), NOW()
WHERE NOT EXISTS (SELECT 1 FROM course_type_label WHERE type_id = 100 AND label_id = 102);
INSERT INTO course_type_label (type_id, label_id, create_by, update_by, created_at, updated_at)
SELECT 100, 104, 'system', 'system', NOW(), NOW()
WHERE NOT EXISTS (SELECT 1 FROM course_type_label WHERE type_id = 100 AND label_id = 104);
INSERT INTO course_type_label (type_id, label_id, create_by, update_by, created_at, updated_at)
SELECT 100, 103, 'system', 'system', NOW(), NOW()
WHERE NOT EXISTS (SELECT 1 FROM course_type_label WHERE type_id = 100 AND label_id = 103);
-- 动感单车: 燃脂 + 高阶挑战
INSERT INTO course_type_label (type_id, label_id, create_by, update_by, created_at, updated_at)
SELECT 101, 100, 'system', 'system', NOW(), NOW()
WHERE NOT EXISTS (SELECT 1 FROM course_type_label WHERE type_id = 101 AND label_id = 100);
INSERT INTO course_type_label (type_id, label_id, create_by, update_by, created_at, updated_at)
SELECT 101, 105, 'system', 'system', NOW(), NOW()
WHERE NOT EXISTS (SELECT 1 FROM course_type_label WHERE type_id = 101 AND label_id = 105);
-- 搏击操: 燃脂 + 塑形 + 高阶挑战
INSERT INTO course_type_label (type_id, label_id, create_by, update_by, created_at, updated_at)
SELECT 102, 100, 'system', 'system', NOW(), NOW()
WHERE NOT EXISTS (SELECT 1 FROM course_type_label WHERE type_id = 102 AND label_id = 100);
INSERT INTO course_type_label (type_id, label_id, create_by, update_by, created_at, updated_at)
SELECT 102, 101, 'system', 'system', NOW(), NOW()
WHERE NOT EXISTS (SELECT 1 FROM course_type_label WHERE type_id = 102 AND label_id = 101);
INSERT INTO course_type_label (type_id, label_id, create_by, update_by, created_at, updated_at)
SELECT 102, 105, 'system', 'system', NOW(), NOW()
WHERE NOT EXISTS (SELECT 1 FROM course_type_label WHERE type_id = 102 AND label_id = 105);
-- 普拉提: 核心训练 + 塑形 + 初学者友好
INSERT INTO course_type_label (type_id, label_id, create_by, update_by, created_at, updated_at)
SELECT 103, 103, 'system', 'system', NOW(), NOW()
WHERE NOT EXISTS (SELECT 1 FROM course_type_label WHERE type_id = 103 AND label_id = 103);
INSERT INTO course_type_label (type_id, label_id, create_by, update_by, created_at, updated_at)
SELECT 103, 101, 'system', 'system', NOW(), NOW()
WHERE NOT EXISTS (SELECT 1 FROM course_type_label WHERE type_id = 103 AND label_id = 101);
INSERT INTO course_type_label (type_id, label_id, create_by, update_by, created_at, updated_at)
SELECT 103, 104, 'system', 'system', NOW(), NOW()
WHERE NOT EXISTS (SELECT 1 FROM course_type_label WHERE type_id = 103 AND label_id = 104);
-- ============================================
-- 5. 团课课程(group_course
-- 4节课,未来日期,不同时间段和地点
-- ============================================
-- 晨间瑜伽 | A教室 | 明天 08:00-09:00 | 教练100
INSERT INTO group_course (id, course_name, coach_id, course_type, start_time, end_time, max_members, current_members, status, location, cover_image, description, stored_value_amount, create_by, update_by, created_at, updated_at)
SELECT 100, '晨间瑜伽', 100, 100, '2026-07-23 08:00:00'::TIMESTAMP, '2026-07-23 09:00:00'::TIMESTAMP, 20, 5, '0', 'A教室', '/static/course/e2e_yoga.jpg', 'E2E测试-晨间瑜伽课程,温和唤醒身体', 88.00, 'system', 'system', NOW(), NOW()
WHERE NOT EXISTS (SELECT 1 FROM group_course WHERE id = 100);
-- 动感燃脂 | 单车房 | 后天 19:00-20:00 | 教练101
INSERT INTO group_course (id, course_name, coach_id, course_type, start_time, end_time, max_members, current_members, status, location, cover_image, description, stored_value_amount, create_by, update_by, created_at, updated_at)
SELECT 101, '动感燃脂', 101, 101, '2026-07-24 19:00:00'::TIMESTAMP, '2026-07-24 20:00:00'::TIMESTAMP, 25, 10, '0', '单车房', '/static/course/e2e_spin.jpg', 'E2E测试-动感单车燃脂课程', 68.00, 'system', 'system', NOW(), NOW()
WHERE NOT EXISTS (SELECT 1 FROM group_course WHERE id = 101);
-- 有氧搏击 | B教室 | 大后天 10:00-11:00 | 教练100
INSERT INTO group_course (id, course_name, coach_id, course_type, start_time, end_time, max_members, current_members, status, location, cover_image, description, stored_value_amount, create_by, update_by, created_at, updated_at)
SELECT 102, '有氧搏击', 100, 102, '2026-07-25 10:00:00'::TIMESTAMP, '2026-07-25 11:00:00'::TIMESTAMP, 20, 8, '0', 'B教室', '/static/course/e2e_boxing.jpg', 'E2E测试-有氧搏击操课程', 68.00, 'system', 'system', NOW(), NOW()
WHERE NOT EXISTS (SELECT 1 FROM group_course WHERE id = 102);
-- 普拉提入门 | 瑜伽房 | 4天后 14:00-15:00 | 教练101
INSERT INTO group_course (id, course_name, coach_id, course_type, start_time, end_time, max_members, current_members, status, location, cover_image, description, stored_value_amount, create_by, update_by, created_at, updated_at)
SELECT 103, '普拉提入门', 101, 103, '2026-07-26 14:00:00'::TIMESTAMP, '2026-07-26 15:00:00'::TIMESTAMP, 15, 3, '0', '瑜伽房', '/static/course/e2e_pilates.jpg', 'E2E测试-普拉提入门课程,适合初学者', 108.00, 'system', 'system', NOW(), NOW()
WHERE NOT EXISTS (SELECT 1 FROM group_course WHERE id = 103);
-- ============================================
-- 6. 测试会员(member_user
-- 包含 miniapp_openid 用于微信登录模拟
-- ============================================
INSERT INTO member_user (id, member_no, nickname, phone, gender, miniapp_open_id, created_at, updated_at)
VALUES
(100, 'MEM-E2E-001', '测试会员一', '13900139200', 1, 'o_test_member_e2e_001', NOW(), NOW()),
(101, 'MEM-E2E-002', '测试会员二', '13900139201', 2, 'o_test_member_e2e_002', NOW(), NOW())
ON CONFLICT (member_no) DO UPDATE SET
nickname = EXCLUDED.nickname,
phone = EXCLUDED.phone,
gender = EXCLUDED.gender,
miniapp_open_id = EXCLUDED.miniapp_open_id;
-- ============================================
-- 7. 签到记录(sign_in_record
-- 为测试会员创建几条签到历史
-- ============================================
INSERT INTO sign_in_record (id, member_id, sign_in_time, sign_in_type, sign_in_status, source, created_at, updated_at)
VALUES
(100, 100, '2026-07-22 08:30:00'::TIMESTAMP, 'QR_CODE', 'SUCCESS', 'MINI_PROGRAM', NOW(), NOW()),
(101, 101, '2026-07-22 09:00:00'::TIMESTAMP, 'QR_CODE', 'SUCCESS', 'MINI_PROGRAM', NOW(), NOW()),
(102, 100, '2026-07-22 18:00:00'::TIMESTAMP, 'MANUAL', 'SUCCESS', 'PC_BACKEND', NOW(), NOW())
ON CONFLICT (id) DO NOTHING;
-- ============================================
-- 8. 重置序列值,避免后续插入冲突
-- ============================================
SELECT setval('sys_user_id_seq', GREATEST(COALESCE((SELECT MAX(id) FROM sys_user), 1), 101));
SELECT setval('group_course_type_id_seq', GREATEST(COALESCE((SELECT MAX(id) FROM group_course_type), 1), 103));
SELECT setval('course_label_id_seq', GREATEST(COALESCE((SELECT MAX(id) FROM course_label), 1), 105));
SELECT setval('group_course_id_seq', GREATEST(COALESCE((SELECT MAX(id) FROM group_course), 1), 103));
SELECT setval('member_user_id_seq', GREATEST(COALESCE((SELECT MAX(id) FROM member_user), 1), 101));
SELECT setval('sign_in_record_id_seq', GREATEST(COALESCE((SELECT MAX(id) FROM sign_in_record), 1), 102));