From 16a57a8fc6868cea9171a1119698572407a2fc03 Mon Sep 17 00:00:00 2001
From: hejianhao <15708179461@qq.com>
Date: 星期五, 28 八月 2026 15:21:46 +0800
Subject: [PATCH] fix0806: APP端去掉全部的市辖区选择
---
tcm-training-admin-backend/src/test/java/com/tcm/training/admin/app/live/service/AppLiveCourseServiceTest.java | 113 +++++++++++++++++++++++++++++++++++++++++++++++++++++++-
1 files changed, 111 insertions(+), 2 deletions(-)
diff --git a/tcm-training-admin-backend/src/test/java/com/tcm/training/admin/app/live/service/AppLiveCourseServiceTest.java b/tcm-training-admin-backend/src/test/java/com/tcm/training/admin/app/live/service/AppLiveCourseServiceTest.java
index 0defb75..193b5ad 100644
--- a/tcm-training-admin-backend/src/test/java/com/tcm/training/admin/app/live/service/AppLiveCourseServiceTest.java
+++ b/tcm-training-admin-backend/src/test/java/com/tcm/training/admin/app/live/service/AppLiveCourseServiceTest.java
@@ -3,17 +3,27 @@
import com.baomidou.mybatisplus.core.MybatisConfiguration;
import com.baomidou.mybatisplus.core.metadata.TableInfoHelper;
import com.tcm.training.admin.app.auth.service.AppAuthSessionService;
+import com.tcm.training.admin.app.live.dto.AppLiveQuizAnswerRequest;
+import com.tcm.training.admin.app.live.dto.AppLiveQuizSubmitRequest;
import com.tcm.training.admin.app.live.support.AppLiveCourseDisplaySupport;
import com.tcm.training.admin.app.live.vo.AppLiveCourseDetailVO;
+import com.tcm.training.admin.app.live.vo.AppLiveQuizSubmitResultVO;
import com.tcm.training.admin.app.live.vo.AppLiveReserveResultVO;
import com.tcm.training.admin.live.entity.Expert;
import com.tcm.training.admin.live.entity.LiveCourse;
import com.tcm.training.admin.live.entity.LiveReserve;
import com.tcm.training.admin.live.entity.LiveSession;
+import com.tcm.training.admin.live.entity.LiveSessionQuestion;
+import com.tcm.training.admin.live.entity.LiveSessionQuizRecord;
import com.tcm.training.admin.live.mapper.ExpertMapper;
import com.tcm.training.admin.live.mapper.LiveCourseMapper;
import com.tcm.training.admin.live.mapper.LiveReserveMapper;
import com.tcm.training.admin.live.mapper.LiveSessionMapper;
+import com.tcm.training.admin.live.mapper.LiveSessionQuestionMapper;
+import com.tcm.training.admin.live.mapper.LiveSessionQuizRecordMapper;
+import com.tcm.training.admin.live.mapper.LiveWatchRecordMapper;
+import com.tcm.training.admin.points.mapper.UserPointsAccountMapper;
+import com.tcm.training.admin.points.service.PointsLedgerAppService;
import org.apache.ibatis.builder.MapperBuilderAssistant;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.BeforeEach;
@@ -27,11 +37,15 @@
import java.time.LocalDateTime;
import java.util.Arrays;
import java.util.Collections;
+import java.util.List;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertNotNull;
import static org.junit.jupiter.api.Assertions.assertNull;
import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.anyLong;
+import static org.mockito.Mockito.lenient;
+import static org.mockito.Mockito.never;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
@@ -63,6 +77,21 @@
private ExpertMapper expertMapper;
@Mock
+ private LiveSessionQuestionMapper liveSessionQuestionMapper;
+
+ @Mock
+ private LiveSessionQuizRecordMapper liveSessionQuizRecordMapper;
+
+ @Mock
+ private LiveWatchRecordMapper liveWatchRecordMapper;
+
+ @Mock
+ private UserPointsAccountMapper userPointsAccountMapper;
+
+ @Mock
+ private PointsLedgerAppService pointsLedgerAppService;
+
+ @Mock
private AppAuthSessionService appAuthSessionService;
private AppLiveCourseService appLiveCourseService;
@@ -76,11 +105,20 @@
@BeforeEach
void setUp() {
AppLiveExpertService appLiveExpertService = new AppLiveExpertService(expertMapper);
+ // 详情与预约用例不关心答题和观看明细,统一返回空列表避免空指针干扰主断言。
+ lenient().when(liveSessionQuestionMapper.selectList(any())).thenReturn(Collections.emptyList());
+ lenient().when(liveSessionQuizRecordMapper.selectList(any())).thenReturn(Collections.emptyList());
+ lenient().when(liveWatchRecordMapper.selectList(any())).thenReturn(Collections.emptyList());
appLiveCourseService = new AppLiveCourseService(
liveCourseMapper,
liveSessionMapper,
liveReserveMapper,
expertMapper,
+ liveSessionQuestionMapper,
+ liveSessionQuizRecordMapper,
+ liveWatchRecordMapper,
+ userPointsAccountMapper,
+ pointsLedgerAppService,
appAuthSessionService,
new AppLiveCourseDisplaySupport(),
appLiveExpertService
@@ -145,7 +183,7 @@
assertEquals("立即查看", detailVO.getActionText());
assertEquals(Long.valueOf(201L), detailVO.getActionSessionId());
assertNull(detailVO.getCountdownTime());
- assertEquals("https://cdn.example/live.m3u8", detailVO.getVideoUrl());
+ assertNull(detailVO.getVideoUrl());
}
/**
@@ -173,7 +211,39 @@
assertEquals("ENDED", detailVO.getDisplayStatus());
assertEquals("WATCHABLE", detailVO.getActionStatus());
assertEquals(Long.valueOf(211L), detailVO.getActionSessionId());
- assertEquals("https://cdn.example/latest-ended.m3u8", detailVO.getVideoUrl());
+ assertNull(detailVO.getVideoUrl());
+ }
+
+ /**
+ * 同一直播课同一答题自然日已经获得过积分时,后续场次答对也不重复发放。
+ */
+ @Test
+ void submitQuizShouldNotAwardPointsTwiceForSameCourseSameDay() {
+ LiveCourse course = buildCourse(50L, 12L);
+ LiveSession session = buildSession(501L, 50L, LocalDateTime.now().minusMinutes(30),
+ AppLiveCourseDisplaySupport.SESSION_STATUS_LIVING);
+ List<LiveSessionQuestion> questions = Arrays.asList(
+ buildQuestion(1L, 501L, 1, "A"),
+ buildQuestion(2L, 501L, 2, "B"),
+ buildQuestion(3L, 501L, 3, "C")
+ );
+
+ when(appAuthSessionService.requireLoginUserId()).thenReturn(77L);
+ when(liveCourseMapper.selectOne(any())).thenReturn(course);
+ when(liveSessionMapper.selectOne(any())).thenReturn(session);
+ when(liveSessionQuestionMapper.selectList(any())).thenReturn(questions);
+ when(liveSessionQuizRecordMapper.selectList(any())).thenReturn(Collections.emptyList());
+ when(liveSessionQuizRecordMapper.countAwardedCourseQuizPoints(anyLong(), anyLong(), any(), any())).thenReturn(1);
+
+ AppLiveQuizSubmitResultVO resultVO = appLiveCourseService.submitQuiz(50L, 501L, buildQuizSubmitRequest());
+
+ verify(liveSessionQuizRecordMapper, never()).updateById(any(LiveSessionQuizRecord.class));
+ verify(userPointsAccountMapper, never()).update(any(), any());
+ verify(pointsLedgerAppService, never()).syncLedger();
+ assertEquals(Boolean.TRUE, resultVO.getSubmitted());
+ assertEquals(Boolean.TRUE, resultVO.getAllCorrect());
+ assertEquals(Boolean.FALSE, resultVO.getPointsAwarded());
+ assertEquals("今日该课程积分已获得", resultVO.getMessage());
}
/**
@@ -262,6 +332,45 @@
}
/**
+ * 构造直播答题题目测试数据。
+ */
+ private LiveSessionQuestion buildQuestion(Long questionId, Long sessionId, Integer sort, String correctOption) {
+ LiveSessionQuestion question = new LiveSessionQuestion();
+ question.setId(questionId);
+ question.setSessionId(sessionId);
+ question.setSort(sort);
+ question.setStem("题目" + sort);
+ question.setOptionA("选项A");
+ question.setOptionB("选项B");
+ question.setOptionC("选项C");
+ question.setCorrectOption(correctOption);
+ return question;
+ }
+
+ /**
+ * 构造三题全对的答题提交请求。
+ */
+ private AppLiveQuizSubmitRequest buildQuizSubmitRequest() {
+ AppLiveQuizSubmitRequest request = new AppLiveQuizSubmitRequest();
+ request.setAnswers(Arrays.asList(
+ buildQuizAnswer(1L, "A"),
+ buildQuizAnswer(2L, "B"),
+ buildQuizAnswer(3L, "C")
+ ));
+ return request;
+ }
+
+ /**
+ * 构造单题答题请求。
+ */
+ private AppLiveQuizAnswerRequest buildQuizAnswer(Long questionId, String chosenOption) {
+ AppLiveQuizAnswerRequest answer = new AppLiveQuizAnswerRequest();
+ answer.setQuestionId(questionId);
+ answer.setChosenOption(chosenOption);
+ return answer;
+ }
+
+ /**
* 构造启用中的专家测试数据。
*/
private Expert buildExpert(Long expertId) {
--
Gitblit v1.7.1