|
|
@@ -0,0 +1,391 @@
|
|
|
+package com.njuzr.eaibackend.service;
|
|
|
+
|
|
|
+import com.njuzr.eaibackend.enums.AssignmentCompletionStatus;
|
|
|
+import com.njuzr.eaibackend.mapper.AssignmentMapper;
|
|
|
+import com.njuzr.eaibackend.mapper.StudentAssignmentMapper;
|
|
|
+import com.njuzr.eaibackend.po.Assignment;
|
|
|
+import com.njuzr.eaibackend.po.Engagement;
|
|
|
+import com.njuzr.eaibackend.vo.ExamTimeVO;
|
|
|
+import lombok.extern.slf4j.Slf4j;
|
|
|
+import org.junit.jupiter.api.BeforeEach;
|
|
|
+import org.junit.jupiter.api.DisplayName;
|
|
|
+import org.junit.jupiter.api.Test;
|
|
|
+import org.springframework.beans.factory.annotation.Autowired;
|
|
|
+import org.springframework.boot.test.context.SpringBootTest;
|
|
|
+import org.springframework.data.redis.core.RedisTemplate;
|
|
|
+import org.springframework.test.context.ActiveProfiles;
|
|
|
+
|
|
|
+import java.util.concurrent.TimeUnit;
|
|
|
+
|
|
|
+import static org.junit.jupiter.api.Assertions.*;
|
|
|
+
|
|
|
+@Slf4j
|
|
|
+@ActiveProfiles("dev")
|
|
|
+@SpringBootTest
|
|
|
+public class ExamTimerServiceTest {
|
|
|
+
|
|
|
+ private static final String TEST_TIMER_KEY_PREFIX = "exam:timer:";
|
|
|
+ private static final String TEST_SUBMITTED_KEY_PREFIX = "exam:submitted:";
|
|
|
+
|
|
|
+ @Autowired
|
|
|
+ private ExamTimerService examTimerService;
|
|
|
+
|
|
|
+ @Autowired
|
|
|
+ private RedisTemplate<String, Object> redisTemplate;
|
|
|
+
|
|
|
+ @Autowired
|
|
|
+ private AssignmentMapper assignmentMapper;
|
|
|
+
|
|
|
+ @Autowired
|
|
|
+ private StudentAssignmentMapper studentAssignmentMapper;
|
|
|
+
|
|
|
+ private Long testAssignmentId;
|
|
|
+ private Long testStudentId;
|
|
|
+
|
|
|
+ @BeforeEach
|
|
|
+ void setUp() {
|
|
|
+ testAssignmentId = 114L;
|
|
|
+ testStudentId = 1L;
|
|
|
+
|
|
|
+ String timerKey1 = TEST_TIMER_KEY_PREFIX + testAssignmentId + ":" + testStudentId;
|
|
|
+ String submittedKey1 = TEST_SUBMITTED_KEY_PREFIX + testAssignmentId + ":" + testStudentId;
|
|
|
+ String timerKey2 = TEST_TIMER_KEY_PREFIX + testAssignmentId + ":2";
|
|
|
+ String submittedKey2 = TEST_SUBMITTED_KEY_PREFIX + testAssignmentId + ":2";
|
|
|
+ String timerKey3 = TEST_TIMER_KEY_PREFIX + "115:" + testStudentId;
|
|
|
+ String submittedKey3 = TEST_SUBMITTED_KEY_PREFIX + "115:" + testStudentId;
|
|
|
+
|
|
|
+ redisTemplate.delete(timerKey1);
|
|
|
+ redisTemplate.delete(submittedKey1);
|
|
|
+ redisTemplate.delete(timerKey2);
|
|
|
+ redisTemplate.delete(submittedKey2);
|
|
|
+ redisTemplate.delete(timerKey3);
|
|
|
+ redisTemplate.delete(submittedKey3);
|
|
|
+
|
|
|
+ Engagement eng1 = studentAssignmentMapper.findEngagementByStudentIdAndAssignmentId(testStudentId, testAssignmentId);
|
|
|
+ if (eng1 != null) {
|
|
|
+ eng1.setSubmitted(false);
|
|
|
+ studentAssignmentMapper.updateById(eng1);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ @Test
|
|
|
+ @DisplayName("测试1: 开始考试计时 - 应在Redis中创建key")
|
|
|
+ void testStartExamTimer_ShouldCreateRedisKey() {
|
|
|
+ String key = TEST_TIMER_KEY_PREFIX + testAssignmentId + ":" + testStudentId;
|
|
|
+ redisTemplate.delete(key);
|
|
|
+
|
|
|
+ examTimerService.startExamTimer(testStudentId, testAssignmentId, 60);
|
|
|
+
|
|
|
+ assertTrue(Boolean.TRUE.equals(redisTemplate.hasKey(key)),
|
|
|
+ "考试计时器key应该存在");
|
|
|
+ log.info("测试1通过: 开始考试计时成功创建Redis key");
|
|
|
+ }
|
|
|
+
|
|
|
+ @Test
|
|
|
+ @DisplayName("测试2: 开始考试计时 - key应设置正确的TTL")
|
|
|
+ void testStartExamTimer_ShouldSetCorrectTTL() throws InterruptedException {
|
|
|
+ String key = TEST_TIMER_KEY_PREFIX + testAssignmentId + ":" + testStudentId;
|
|
|
+ redisTemplate.delete(key);
|
|
|
+
|
|
|
+ int duration = 5;
|
|
|
+ examTimerService.startExamTimer(testStudentId, testAssignmentId, duration);
|
|
|
+
|
|
|
+ Long ttl = redisTemplate.getExpire(key, TimeUnit.MINUTES);
|
|
|
+ assertNotNull(ttl, "TTL应该存在");
|
|
|
+ assertTrue(ttl > 0 && ttl <= duration + 5,
|
|
|
+ "TTL应该在(duration, duration+5]范围内");
|
|
|
+ log.info("测试2通过: TTL设置正确,实际TTL={}分钟", ttl);
|
|
|
+ }
|
|
|
+
|
|
|
+ @Test
|
|
|
+ @DisplayName("测试3: 开始考试计时 - 重复调用应跳过不报错")
|
|
|
+ void testStartExamTimer_DuplicateCall_ShouldSkip() {
|
|
|
+ String key = TEST_TIMER_KEY_PREFIX + testAssignmentId + ":" + testStudentId;
|
|
|
+ redisTemplate.delete(key);
|
|
|
+
|
|
|
+ examTimerService.startExamTimer(testStudentId, testAssignmentId, 60);
|
|
|
+ examTimerService.startExamTimer(testStudentId, testAssignmentId, 60);
|
|
|
+
|
|
|
+ assertTrue(Boolean.TRUE.equals(redisTemplate.hasKey(key)),
|
|
|
+ "计时器key应该仍然存在");
|
|
|
+ log.info("测试3通过: 重复调用未报错");
|
|
|
+ }
|
|
|
+
|
|
|
+ @Test
|
|
|
+ @DisplayName("测试4: 交卷删除计时器 - 应删除Redis timer key并创建submitted key")
|
|
|
+ void testSubmitExam_ShouldDeleteTimerKeyAndCreateSubmittedKey() {
|
|
|
+ String timerKey = TEST_TIMER_KEY_PREFIX + testAssignmentId + ":" + testStudentId;
|
|
|
+ String submittedKey = TEST_SUBMITTED_KEY_PREFIX + testAssignmentId + ":" + testStudentId;
|
|
|
+ redisTemplate.delete(timerKey);
|
|
|
+ redisTemplate.delete(submittedKey);
|
|
|
+
|
|
|
+ examTimerService.startExamTimer(testStudentId, testAssignmentId, 60);
|
|
|
+ assertTrue(Boolean.TRUE.equals(redisTemplate.hasKey(timerKey)),
|
|
|
+ "前置条件: 计时器key应存在");
|
|
|
+
|
|
|
+ examTimerService.submitExam(testStudentId, testAssignmentId);
|
|
|
+
|
|
|
+ assertFalse(Boolean.TRUE.equals(redisTemplate.hasKey(timerKey)),
|
|
|
+ "交卷后计时器key应该被删除");
|
|
|
+ assertTrue(Boolean.TRUE.equals(redisTemplate.hasKey(submittedKey)),
|
|
|
+ "交卷后submitted key应该存在");
|
|
|
+ log.info("测试4通过: 交卷成功删除timer key并创建submitted key");
|
|
|
+ }
|
|
|
+
|
|
|
+ @Test
|
|
|
+ @DisplayName("测试5: 检查是否已交卷 - 未交卷返回false")
|
|
|
+ void testIsExamSubmitted_NotSubmitted_ShouldReturnFalse() {
|
|
|
+ String timerKey = TEST_TIMER_KEY_PREFIX + testAssignmentId + ":" + testStudentId;
|
|
|
+ redisTemplate.delete(timerKey);
|
|
|
+
|
|
|
+ examTimerService.startExamTimer(testStudentId, testAssignmentId, 60);
|
|
|
+
|
|
|
+ assertFalse(examTimerService.isExamSubmitted(testStudentId, testAssignmentId),
|
|
|
+ "未交卷时应该返回false");
|
|
|
+ log.info("测试5通过: 未交卷返回false");
|
|
|
+ }
|
|
|
+
|
|
|
+ @Test
|
|
|
+ @DisplayName("测试6: 检查是否已交卷 - 已交卷返回true")
|
|
|
+ void testIsExamSubmitted_Submitted_ShouldReturnTrue() {
|
|
|
+ String timerKey = TEST_TIMER_KEY_PREFIX + testAssignmentId + ":" + testStudentId;
|
|
|
+ String submittedKey = TEST_SUBMITTED_KEY_PREFIX + testAssignmentId + ":" + testStudentId;
|
|
|
+ redisTemplate.delete(timerKey);
|
|
|
+ redisTemplate.delete(submittedKey);
|
|
|
+
|
|
|
+ examTimerService.startExamTimer(testStudentId, testAssignmentId, 60);
|
|
|
+ examTimerService.submitExam(testStudentId, testAssignmentId);
|
|
|
+
|
|
|
+ assertTrue(examTimerService.isExamSubmitted(testStudentId, testAssignmentId),
|
|
|
+ "已交卷后应该返回true");
|
|
|
+ log.info("测试6通过: 已交卷返回true");
|
|
|
+ }
|
|
|
+
|
|
|
+ @Test
|
|
|
+ @DisplayName("测试7: 检查是否已交卷 - submitted key存在时返回true")
|
|
|
+ void testIsExamSubmitted_SubmittedKeyExist_ShouldReturnTrue() {
|
|
|
+ String submittedKey = TEST_SUBMITTED_KEY_PREFIX + testAssignmentId + ":" + testStudentId;
|
|
|
+ redisTemplate.delete(submittedKey);
|
|
|
+ redisTemplate.opsForValue().set(submittedKey, "1", 1, TimeUnit.MINUTES);
|
|
|
+
|
|
|
+ assertTrue(examTimerService.isExamSubmitted(testStudentId, testAssignmentId),
|
|
|
+ "submitted key存在时应该返回true");
|
|
|
+ log.info("测试7通过: submitted key存在返回true");
|
|
|
+ }
|
|
|
+
|
|
|
+ @Test
|
|
|
+ @DisplayName("测试8: 交卷后无法再次开启计时器")
|
|
|
+ void testStartExamTimer_AfterSubmit_ShouldSkip() {
|
|
|
+ String timerKey = TEST_TIMER_KEY_PREFIX + testAssignmentId + ":" + testStudentId;
|
|
|
+ String submittedKey = TEST_SUBMITTED_KEY_PREFIX + testAssignmentId + ":" + testStudentId;
|
|
|
+ redisTemplate.delete(timerKey);
|
|
|
+ redisTemplate.delete(submittedKey);
|
|
|
+
|
|
|
+ examTimerService.startExamTimer(testStudentId, testAssignmentId, 60);
|
|
|
+
|
|
|
+ Engagement engagement = studentAssignmentMapper.findEngagementByStudentIdAndAssignmentId(testStudentId, testAssignmentId);
|
|
|
+ if (engagement == null) {
|
|
|
+ engagement = new Engagement();
|
|
|
+ engagement.setAssignmentId(testAssignmentId);
|
|
|
+ engagement.setStudentId(testStudentId);
|
|
|
+ engagement.setVersion(1);
|
|
|
+ engagement.setStatus(AssignmentCompletionStatus.NOT_SUBMITTED);
|
|
|
+ engagement.setSubmitted(true);
|
|
|
+ studentAssignmentMapper.insert(engagement);
|
|
|
+ } else {
|
|
|
+ engagement.setSubmitted(true);
|
|
|
+ studentAssignmentMapper.updateById(engagement);
|
|
|
+ }
|
|
|
+
|
|
|
+ examTimerService.startExamTimer(testStudentId, testAssignmentId, 60);
|
|
|
+
|
|
|
+ assertFalse(Boolean.TRUE.equals(redisTemplate.hasKey(timerKey)),
|
|
|
+ "交卷后再次启动计时应该被跳过");
|
|
|
+ log.info("测试8通过: 交卷后无法再次开启计时器");
|
|
|
+
|
|
|
+ engagement.setSubmitted(false);
|
|
|
+ studentAssignmentMapper.updateById(engagement);
|
|
|
+ }
|
|
|
+
|
|
|
+ @Test
|
|
|
+ @DisplayName("测试9: 不同学生应有独立的计时器")
|
|
|
+ void testStartExamTimer_DifferentStudents_ShouldHaveIndependentTimers() {
|
|
|
+ Long studentId1 = 1L;
|
|
|
+ Long studentId2 = 2L;
|
|
|
+ String timerKey1 = TEST_TIMER_KEY_PREFIX + testAssignmentId + ":" + studentId1;
|
|
|
+ String timerKey2 = TEST_TIMER_KEY_PREFIX + testAssignmentId + ":" + studentId2;
|
|
|
+ String submittedKey1 = TEST_SUBMITTED_KEY_PREFIX + testAssignmentId + ":" + studentId1;
|
|
|
+ String submittedKey2 = TEST_SUBMITTED_KEY_PREFIX + testAssignmentId + ":" + studentId2;
|
|
|
+ redisTemplate.delete(timerKey1);
|
|
|
+ redisTemplate.delete(timerKey2);
|
|
|
+ redisTemplate.delete(submittedKey1);
|
|
|
+ redisTemplate.delete(submittedKey2);
|
|
|
+
|
|
|
+ examTimerService.startExamTimer(studentId1, testAssignmentId, 60);
|
|
|
+ examTimerService.startExamTimer(studentId2, testAssignmentId, 60);
|
|
|
+
|
|
|
+ assertTrue(Boolean.TRUE.equals(redisTemplate.hasKey(timerKey1)),
|
|
|
+ "学生1的计时器应存在");
|
|
|
+ assertTrue(Boolean.TRUE.equals(redisTemplate.hasKey(timerKey2)),
|
|
|
+ "学生2的计时器应存在");
|
|
|
+
|
|
|
+ examTimerService.submitExam(studentId1, testAssignmentId);
|
|
|
+
|
|
|
+ assertFalse(Boolean.TRUE.equals(redisTemplate.hasKey(timerKey1)),
|
|
|
+ "学生1交卷后其计时器应删除");
|
|
|
+ assertTrue(Boolean.TRUE.equals(redisTemplate.hasKey(timerKey2)),
|
|
|
+ "学生1交卷不应影响学生2的计时器");
|
|
|
+ log.info("测试9通过: 不同学生计时器相互独立");
|
|
|
+
|
|
|
+ redisTemplate.delete(timerKey2);
|
|
|
+ redisTemplate.delete(submittedKey2);
|
|
|
+ }
|
|
|
+
|
|
|
+ @Test
|
|
|
+ @DisplayName("测试10: 不同作业应有独立的计时器")
|
|
|
+ void testStartExamTimer_DifferentAssignments_ShouldHaveIndependentTimers() {
|
|
|
+ Long assignmentId1 = 114L;
|
|
|
+ Long assignmentId2 = 115L;
|
|
|
+ String timerKey1 = TEST_TIMER_KEY_PREFIX + assignmentId1 + ":" + testStudentId;
|
|
|
+ String timerKey2 = TEST_TIMER_KEY_PREFIX + assignmentId2 + ":" + testStudentId;
|
|
|
+ String submittedKey1 = TEST_SUBMITTED_KEY_PREFIX + assignmentId1 + ":" + testStudentId;
|
|
|
+ String submittedKey2 = TEST_SUBMITTED_KEY_PREFIX + assignmentId2 + ":" + testStudentId;
|
|
|
+ redisTemplate.delete(timerKey1);
|
|
|
+ redisTemplate.delete(timerKey2);
|
|
|
+ redisTemplate.delete(submittedKey1);
|
|
|
+ redisTemplate.delete(submittedKey2);
|
|
|
+
|
|
|
+ examTimerService.startExamTimer(testStudentId, assignmentId1, 60);
|
|
|
+ examTimerService.startExamTimer(testStudentId, assignmentId2, 60);
|
|
|
+
|
|
|
+ assertTrue(Boolean.TRUE.equals(redisTemplate.hasKey(timerKey1)),
|
|
|
+ "作业1的计时器应存在");
|
|
|
+ assertTrue(Boolean.TRUE.equals(redisTemplate.hasKey(timerKey2)),
|
|
|
+ "作业2的计时器应存在");
|
|
|
+
|
|
|
+ examTimerService.submitExam(testStudentId, assignmentId1);
|
|
|
+
|
|
|
+ assertFalse(Boolean.TRUE.equals(redisTemplate.hasKey(timerKey1)),
|
|
|
+ "作业1交卷后其计时器应删除");
|
|
|
+ assertTrue(Boolean.TRUE.equals(redisTemplate.hasKey(timerKey2)),
|
|
|
+ "作业1交卷不应影响作业2的计时器");
|
|
|
+ log.info("测试10通过: 不同作业计时器相互独立");
|
|
|
+ }
|
|
|
+
|
|
|
+ @Test
|
|
|
+ @DisplayName("测试11: 获取考试时间信息 - 未参加考试")
|
|
|
+ void testGetExamTimeInfo_NotParticipated_ShouldReturnFullDuration() {
|
|
|
+ Assignment assignment = assignmentMapper.selectById(testAssignmentId);
|
|
|
+ if (assignment == null) {
|
|
|
+ log.warn("跳过测试11: 作业{}不存在", testAssignmentId);
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ if (!Boolean.TRUE.equals(assignment.getExamMode())) {
|
|
|
+ assignment.setExamMode(true);
|
|
|
+ assignment.setExamDuration(60);
|
|
|
+ assignmentMapper.updateById(assignment);
|
|
|
+ }
|
|
|
+
|
|
|
+ String timerKey = TEST_TIMER_KEY_PREFIX + testAssignmentId + ":" + testStudentId;
|
|
|
+ String submittedKey = TEST_SUBMITTED_KEY_PREFIX + testAssignmentId + ":" + testStudentId;
|
|
|
+ redisTemplate.delete(timerKey);
|
|
|
+ redisTemplate.delete(submittedKey);
|
|
|
+
|
|
|
+ Engagement engagement = studentAssignmentMapper.findEngagementByStudentIdAndAssignmentId(testStudentId, testAssignmentId);
|
|
|
+ if (engagement != null) {
|
|
|
+ engagement.setSubmitted(false);
|
|
|
+ studentAssignmentMapper.updateById(engagement);
|
|
|
+ }
|
|
|
+
|
|
|
+ ExamTimeVO result = examTimerService.getExamTimeInfo(testStudentId, testAssignmentId);
|
|
|
+
|
|
|
+ assertNotNull(result, "结果不应为null");
|
|
|
+ assertEquals(60 * 60, result.getRemainingSeconds(), "未参加时应返回完整时长");
|
|
|
+ assertFalse(result.getSubmitted(), "submitted应为false");
|
|
|
+ assertEquals(60, result.getExamDuration(), "examDuration应为60分钟");
|
|
|
+ log.info("测试11通过: 未参加考试返回完整时长,remainingSeconds={}", result.getRemainingSeconds());
|
|
|
+ }
|
|
|
+
|
|
|
+ @Test
|
|
|
+ @DisplayName("测试12: 获取考试时间信息 - 正在考试中")
|
|
|
+ void testGetExamTimeInfo_InProgress_ShouldReturnRemainingTime() throws InterruptedException {
|
|
|
+ Assignment assignment = assignmentMapper.selectById(testAssignmentId);
|
|
|
+ if (assignment == null) {
|
|
|
+ log.warn("跳过测试12: 作业{}不存在", testAssignmentId);
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ if (!Boolean.TRUE.equals(assignment.getExamMode())) {
|
|
|
+ assignment.setExamMode(true);
|
|
|
+ assignment.setExamDuration(5);
|
|
|
+ assignmentMapper.updateById(assignment);
|
|
|
+ }
|
|
|
+
|
|
|
+ String timerKey = TEST_TIMER_KEY_PREFIX + testAssignmentId + ":" + testStudentId;
|
|
|
+ String submittedKey = TEST_SUBMITTED_KEY_PREFIX + testAssignmentId + ":" + testStudentId;
|
|
|
+ redisTemplate.delete(timerKey);
|
|
|
+ redisTemplate.delete(submittedKey);
|
|
|
+
|
|
|
+ examTimerService.startExamTimer(testStudentId, testAssignmentId, 5);
|
|
|
+
|
|
|
+ Thread.sleep(1000);
|
|
|
+
|
|
|
+ ExamTimeVO result = examTimerService.getExamTimeInfo(testStudentId, testAssignmentId);
|
|
|
+
|
|
|
+ assertNotNull(result, "结果不应为null");
|
|
|
+ assertTrue(result.getRemainingSeconds() > 0 && result.getRemainingSeconds() <= 5 * 60,
|
|
|
+ "正在考试时应返回剩余时间,remainingSeconds=" + result.getRemainingSeconds());
|
|
|
+ assertFalse(result.getSubmitted(), "submitted应为false");
|
|
|
+ assertNotNull(result.getExamStartTime(), "examStartTime不应为null");
|
|
|
+ assertNotNull(result.getExamEndTime(), "examEndTime不应为null");
|
|
|
+ log.info("测试12通过: 正在考试中返回剩余时间,remainingSeconds={}", result.getRemainingSeconds());
|
|
|
+ }
|
|
|
+
|
|
|
+ @Test
|
|
|
+ @DisplayName("测试13: 获取考试时间信息 - 已交卷")
|
|
|
+ void testGetExamTimeInfo_Submitted_ShouldReturnZero() {
|
|
|
+ Assignment assignment = assignmentMapper.selectById(testAssignmentId);
|
|
|
+ if (assignment == null) {
|
|
|
+ log.warn("跳过测试13: 作业{}不存在", testAssignmentId);
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ if (!Boolean.TRUE.equals(assignment.getExamMode())) {
|
|
|
+ assignment.setExamMode(true);
|
|
|
+ assignment.setExamDuration(60);
|
|
|
+ assignmentMapper.updateById(assignment);
|
|
|
+ }
|
|
|
+
|
|
|
+ String timerKey = TEST_TIMER_KEY_PREFIX + testAssignmentId + ":" + testStudentId;
|
|
|
+ String submittedKey = TEST_SUBMITTED_KEY_PREFIX + testAssignmentId + ":" + testStudentId;
|
|
|
+ redisTemplate.delete(timerKey);
|
|
|
+ redisTemplate.delete(submittedKey);
|
|
|
+ redisTemplate.opsForValue().set(submittedKey, "1", 1, TimeUnit.MINUTES);
|
|
|
+
|
|
|
+ Engagement engagement = studentAssignmentMapper.findEngagementByStudentIdAndAssignmentId(testStudentId, testAssignmentId);
|
|
|
+ if (engagement == null) {
|
|
|
+ engagement = new Engagement();
|
|
|
+ engagement.setAssignmentId(testAssignmentId);
|
|
|
+ engagement.setStudentId(testStudentId);
|
|
|
+ engagement.setVersion(1);
|
|
|
+ engagement.setStatus(AssignmentCompletionStatus.SUBMITTED);
|
|
|
+ engagement.setSubmitted(true);
|
|
|
+ studentAssignmentMapper.insert(engagement);
|
|
|
+ } else {
|
|
|
+ engagement.setSubmitted(true);
|
|
|
+ engagement.setStatus(AssignmentCompletionStatus.SUBMITTED);
|
|
|
+ studentAssignmentMapper.updateById(engagement);
|
|
|
+ }
|
|
|
+
|
|
|
+ ExamTimeVO result = examTimerService.getExamTimeInfo(testStudentId, testAssignmentId);
|
|
|
+
|
|
|
+ assertNotNull(result, "结果不应为null");
|
|
|
+ assertEquals(0L, result.getRemainingSeconds(), "已交卷时remainingSeconds应为0");
|
|
|
+ assertTrue(result.getSubmitted(), "submitted应为true");
|
|
|
+ log.info("测试13通过: 已交卷返回remainingSeconds=0");
|
|
|
+
|
|
|
+ if (engagement != null) {
|
|
|
+ engagement.setSubmitted(false);
|
|
|
+ engagement.setStatus(AssignmentCompletionStatus.NOT_SUBMITTED);
|
|
|
+ studentAssignmentMapper.updateById(engagement);
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|