package com.pangu.integration; import com.pangu.common.core.page.TableDataInfo; import com.pangu.member.domain.dto.MemberDTO; import com.pangu.member.domain.entity.Member; import com.pangu.member.domain.vo.MemberVO; import com.pangu.member.service.IMemberService; import com.pangu.school.domain.dto.SchoolQueryDTO; import com.pangu.school.domain.vo.SchoolTreeVO; import com.pangu.school.domain.vo.SchoolVO; import com.pangu.school.service.ISchoolService; import com.pangu.student.domain.dto.StudentDTO; import com.pangu.student.domain.vo.StudentVO; import com.pangu.student.service.IStudentService; import com.pangu.application.domain.dto.ApplicationDTO; import com.pangu.application.domain.vo.ApplicationVO; import com.pangu.application.service.IApplicationService; import com.pangu.base.service.IRegionService; import org.junit.jupiter.api.*; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.transaction.annotation.Transactional; import java.util.Arrays; import java.util.List; import static org.junit.jupiter.api.Assertions.*; /** * 模块集成测试类 * 测试跨模块功能和业务流程 * * @author 湖北新华业务中台研发团队 */ @SpringBootTest @Transactional @TestMethodOrder(MethodOrderer.OrderAnnotation.class) public class ModuleIntegrationTest { @Autowired private ISchoolService schoolService; @Autowired private IMemberService memberService; @Autowired private IStudentService studentService; @Autowired private IApplicationService applicationService; @Autowired private IRegionService regionService; // ========== 学校-学生集成测试 ========== /** * 测试学校树查询并筛选学生 */ @Test @Order(1) public void testSchoolTreeAndStudentFilter() { // 1. 获取学校树 List tree = schoolService.selectSchoolTree(111L); assertNotNull(tree); assertTrue(tree.size() > 0); // 2. 根据学校ID筛选学生 SchoolTreeVO school = tree.get(0); StudentDTO query = new StudentDTO(); query.setSchoolId(school.getId()); query.setPageNum(1); query.setPageSize(10); TableDataInfo result = studentService.selectStudentList(query); assertNotNull(result); } /** * 测试学校年级班级筛选学生 */ @Test @Order(2) public void testSchoolGradeClassFilter() { // 按年级筛选 StudentDTO gradeQuery = new StudentDTO(); gradeQuery.setSchoolGradeId(1L); gradeQuery.setPageNum(1); gradeQuery.setPageSize(10); TableDataInfo gradeResult = studentService.selectStudentList(gradeQuery); assertNotNull(gradeResult); // 按班级筛选 StudentDTO classQuery = new StudentDTO(); classQuery.setSchoolClassId(1L); classQuery.setPageNum(1); classQuery.setPageSize(10); TableDataInfo classResult = studentService.selectStudentList(classQuery); assertNotNull(classResult); } // ========== 会员-学生集成测试 ========== /** * 测试会员绑定学生完整流程 */ @Test @Order(3) public void testMemberStudentBindingFlow() { // 1. 创建家长会员 MemberDTO memberDTO = new MemberDTO(); memberDTO.setPhone("13811111111"); memberDTO.setNickname("集成测试家长"); memberDTO.setIdentityType("1"); int memberResult = memberService.insertMember(memberDTO); assertEquals(1, memberResult); // 2. 获取会员ID Member member = memberService.getMemberByPhone("13811111111"); assertNotNull(member); Long memberId = member.getMemberId(); // 3. 创建学生 StudentDTO studentDTO = new StudentDTO(); studentDTO.setStudentName("集成测试学生"); studentDTO.setStudentNo("INT_TEST_001"); studentDTO.setGender("1"); studentDTO.setRegionId(111L); studentDTO.setSchoolId(1L); studentDTO.setSchoolGradeId(1L); studentDTO.setSchoolClassId(1L); int studentResult = studentService.insertStudent(studentDTO); assertEquals(1, studentResult); // 4. 查询学生获取ID StudentDTO query = new StudentDTO(); query.setStudentNo("INT_TEST_001"); query.setPageNum(1); query.setPageSize(10); TableDataInfo queryResult = studentService.selectStudentList(query); @SuppressWarnings("unchecked") List students = (List) queryResult.getRows(); Long studentId = students.get(0).getStudentId(); // 5. 绑定学生到会员 int bindResult = memberService.bindStudent(memberId, studentId); assertEquals(1, bindResult); // 6. 验证绑定关系 MemberVO memberVO = memberService.getMemberById(memberId); assertNotNull(memberVO); assertNotNull(memberVO.getStudents()); assertTrue(memberVO.getStudents().size() > 0); // 7. 验证学生的会员绑定 List boundStudents = studentService.selectStudentVOsByMemberId(memberId); assertNotNull(boundStudents); assertTrue(boundStudents.size() > 0); } /** * 测试教师只能绑定本校学生 */ @Test @Order(4) public void testTeacherBindStudentRestriction() { // 1. 创建教师会员(学校ID=1) MemberDTO teacherDTO = new MemberDTO(); teacherDTO.setPhone("13822222222"); teacherDTO.setNickname("集成测试教师"); teacherDTO.setIdentityType("2"); teacherDTO.setRegionId(111L); teacherDTO.setSchoolId(1L); teacherDTO.setSchoolGradeId(1L); teacherDTO.setSchoolClassId(1L); memberService.insertMember(teacherDTO); Member teacher = memberService.getMemberByPhone("13822222222"); assertNotNull(teacher); // 2. 创建本校学生 StudentDTO studentDTO = new StudentDTO(); studentDTO.setStudentName("本校学生"); studentDTO.setStudentNo("SAME_SCHOOL_001"); studentDTO.setGender("1"); studentDTO.setRegionId(111L); studentDTO.setSchoolId(1L); // 同一学校 studentDTO.setSchoolGradeId(1L); studentDTO.setSchoolClassId(1L); studentService.insertStudent(studentDTO); // 3. 获取学生ID StudentDTO query = new StudentDTO(); query.setStudentNo("SAME_SCHOOL_001"); query.setPageNum(1); query.setPageSize(10); TableDataInfo result = studentService.selectStudentList(query); @SuppressWarnings("unchecked") List students = (List) result.getRows(); Long studentId = students.get(0).getStudentId(); // 4. 验证学生在教师学校 boolean inSchool = studentService.isStudentInSchool(studentId, teacher.getSchoolId()); assertTrue(inSchool); // 5. 绑定应该成功 int bindResult = memberService.bindStudent(teacher.getMemberId(), studentId); assertEquals(1, bindResult); } /** * 测试解绑学生后可以删除会员 */ @Test @Order(5) public void testUnbindThenDeleteMember() { // 1. 创建会员 MemberDTO memberDTO = new MemberDTO(); memberDTO.setPhone("13833333333"); memberDTO.setNickname("待删除会员"); memberDTO.setIdentityType("1"); memberService.insertMember(memberDTO); Member member = memberService.getMemberByPhone("13833333333"); Long memberId = member.getMemberId(); // 2. 创建并绑定学生 StudentDTO studentDTO = new StudentDTO(); studentDTO.setStudentName("待解绑学生"); studentDTO.setStudentNo("UNBIND_DELETE_001"); studentDTO.setGender("1"); studentDTO.setRegionId(111L); studentDTO.setSchoolId(1L); studentDTO.setSchoolGradeId(1L); studentDTO.setSchoolClassId(1L); studentDTO.setMemberId(memberId); studentService.insertStudent(studentDTO); // 3. 验证有绑定学生,不能删除 assertFalse(memberService.checkCanDelete(memberId)); // 4. 获取学生ID并解绑 StudentDTO query = new StudentDTO(); query.setStudentNo("UNBIND_DELETE_001"); query.setPageNum(1); query.setPageSize(10); TableDataInfo result = studentService.selectStudentList(query); @SuppressWarnings("unchecked") List students = (List) result.getRows(); Long studentId = students.get(0).getStudentId(); memberService.unbindStudent(memberId, studentId); // 5. 验证解绑后可以删除 assertTrue(memberService.checkCanDelete(memberId)); // 6. 删除会员 int deleteResult = memberService.deleteMember(memberId); assertEquals(1, deleteResult); } // ========== 区域-学校-学生链路测试 ========== /** * 测试区域路径查询功能 */ @Test @Order(6) public void testRegionPathQuery() { // 测试区域路径查询 Long regionId = regionService.getRegionIdByPath("湖北省-武汉市-武昌区"); // 如果测试数据存在该区域,应该返回ID // 否则返回null // 这里只验证方法不报错 assertDoesNotThrow(() -> regionService.getRegionIdByPath("湖北省-武汉市-武昌区")); } /** * 测试学校名称查询功能 */ @Test @Order(7) public void testSchoolNameQuery() { // 测试按名称和区域查询学校 Long schoolId = schoolService.getSchoolIdByName("武汉市第一中学", 111L); // 验证方法不报错 assertDoesNotThrow(() -> schoolService.getSchoolIdByName("武汉市第一中学", 111L)); } // ========== 应用管理集成测试 ========== /** * 测试应用完整生命周期 */ @Test @Order(8) public void testApplicationLifecycle() { // 1. 创建应用 ApplicationDTO createDTO = new ApplicationDTO(); createDTO.setAppName("集成测试应用"); createDTO.setContactPerson("测试人员"); createDTO.setContactPhone("13800138000"); createDTO.setApiIds(Arrays.asList(1L, 2L, 3L)); ApplicationVO created = applicationService.insertApplication(createDTO); assertNotNull(created); assertNotNull(created.getAppCode()); assertNotNull(created.getAppSecret()); Long appId = created.getAppId(); // 2. 查询应用 ApplicationVO queried = applicationService.getApplicationById(appId); assertNotNull(queried); assertEquals("集成测试应用", queried.getAppName()); assertEquals(3, queried.getApiList().size()); // 3. 修改应用 ApplicationDTO updateDTO = new ApplicationDTO(); updateDTO.setAppId(appId); updateDTO.setAppName("集成测试应用(已修改)"); updateDTO.setContactPerson("新测试人员"); updateDTO.setContactPhone("13900139000"); updateDTO.setApiIds(Arrays.asList(4L, 5L, 6L)); int updateResult = applicationService.updateApplication(updateDTO); assertEquals(1, updateResult); // 4. 验证修改 ApplicationVO updated = applicationService.getApplicationById(appId); assertEquals("集成测试应用(已修改)", updated.getAppName()); assertEquals(3, updated.getApiList().size()); // 5. 重置密钥 String oldSecret = updated.getAppSecret(); String newSecret = applicationService.resetSecret(appId); assertNotEquals(oldSecret, newSecret); assertEquals(32, newSecret.length()); // 6. 删除应用 int deleteResult = applicationService.deleteApplication(appId); assertEquals(1, deleteResult); // 7. 验证已删除 ApplicationVO deleted = applicationService.getApplicationById(appId); assertNull(deleted); } // ========== 批量导入相关集成测试 ========== /** * 测试会员自动创建功能 */ @Test @Order(9) public void testGetOrCreateMemberByPhone() { String phone = "13899999999"; // 1. 第一次调用应该创建会员 Long memberId1 = memberService.getOrCreateMemberByPhone(phone); assertNotNull(memberId1); // 2. 第二次调用应该返回同一个会员 Long memberId2 = memberService.getOrCreateMemberByPhone(phone); assertEquals(memberId1, memberId2); // 3. 验证会员数据 Member member = memberService.getMemberByPhone(phone); assertNotNull(member); assertEquals(phone, member.getPhone()); assertNotNull(member.getMemberCode()); assertNotNull(member.getNickname()); } /** * 测试学校年级班级查询链路 */ @Test @Order(10) public void testSchoolGradeClassQueryChain() { // 1. 按区域查询学校 SchoolQueryDTO schoolQuery = new SchoolQueryDTO(); schoolQuery.setRegionId(111L); List schools = schoolService.selectSchoolList(schoolQuery); assertNotNull(schools); if (!schools.isEmpty()) { Long schoolId = schools.get(0).getSchoolId(); // 2. 查询学校树获取年级 List tree = schoolService.selectSchoolTree(111L); SchoolTreeVO schoolTree = tree.stream() .filter(s -> s.getId().equals(schoolId)) .findFirst() .orElse(null); if (schoolTree != null && schoolTree.getChildren() != null && !schoolTree.getChildren().isEmpty()) { SchoolTreeVO grade = schoolTree.getChildren().get(0); Long schoolGradeId = grade.getSchoolGradeId(); // 3. 验证可以获取年级下的班级 if (grade.getChildren() != null && !grade.getChildren().isEmpty()) { SchoolTreeVO clazz = grade.getChildren().get(0); Long schoolClassId = clazz.getSchoolClassId(); assertNotNull(schoolClassId); } } } } // ========== 数据权限集成测试 ========== /** * 测试查询参数中的数据权限字段 */ @Test @Order(11) public void testDataScopeParams() { // 测试DTO的params字段 StudentDTO dto = new StudentDTO(); assertNotNull(dto.getParams()); assertTrue(dto.getParams() instanceof java.util.Map); MemberDTO memberDTO = new MemberDTO(); assertNotNull(memberDTO.getParams()); SchoolQueryDTO schoolDTO = new SchoolQueryDTO(); assertNotNull(schoolDTO.getParams()); } // ========== 统计查询集成测试 ========== /** * 测试学校相关统计 */ @Test @Order(12) public void testSchoolStatistics() { // 测试学校学生数量统计 int studentCount = studentService.countBySchoolId(1L); assertTrue(studentCount >= 0); // 测试年级学生数量统计 int gradeCount = studentService.countBySchoolGradeId(1L); assertTrue(gradeCount >= 0); // 测试班级学生数量统计 int classCount = studentService.countBySchoolClassId(1L); assertTrue(classCount >= 0); } /** * 测试会员统计 */ @Test @Order(13) public void testMemberStatistics() { // 测试会员绑定学生数量 int studentCount = studentService.countByMemberId(1L); assertTrue(studentCount >= 0); } }