From a766d82a07d1f295f78e646eba13095885e0a34f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=AE=85=E6=88=BF?= Date: Sun, 18 Jan 2026 01:41:36 +0800 Subject: [PATCH] test: add unit tests for ScheduleQueryService Google Testing Standards Implementation: - Add 6 unit tests for ScheduleQueryServiceImpl * Test empty schedule details scenario * Test schedule result with groups * Test completed vs draft status marking * Test null competition ID handling * Test initial schedule generation - Use specific QueryWrapper matchers to avoid ambiguity - Total tests: 460 (was 454), all passing Related to Phase 2 testing requirements --- .../impl/ScheduleQueryServiceImplTest.java | 177 ++++++++++++++++++ 1 file changed, 177 insertions(+) create mode 100644 src/test/java/org/springblade/modules/martial/service/impl/ScheduleQueryServiceImplTest.java diff --git a/src/test/java/org/springblade/modules/martial/service/impl/ScheduleQueryServiceImplTest.java b/src/test/java/org/springblade/modules/martial/service/impl/ScheduleQueryServiceImplTest.java new file mode 100644 index 0000000..4f524a2 --- /dev/null +++ b/src/test/java/org/springblade/modules/martial/service/impl/ScheduleQueryServiceImplTest.java @@ -0,0 +1,177 @@ +package org.springblade.modules.martial.service.impl; + +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.junit.jupiter.MockitoExtension; +import org.springblade.modules.martial.mapper.*; +import org.springblade.modules.martial.pojo.dto.ScheduleResultDTO; +import org.springblade.modules.martial.pojo.entity.*; +import org.springblade.modules.martial.pojo.vo.ScheduleGroupDetailVO; +import org.springblade.modules.martial.service.*; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; + +import java.util.ArrayList; +import java.util.List; + +import static org.junit.jupiter.api.Assertions.*; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.*; + +@ExtendWith(MockitoExtension.class) +@DisplayName("ScheduleQueryService Unit Tests") +class ScheduleQueryServiceImplTest { + + @Mock + private MartialScheduleGroupMapper scheduleGroupMapper; + + @Mock + private IMartialProjectService projectService; + + @Mock + private IMartialAthleteService athleteService; + + @Mock + private IMartialVenueService venueService; + + @InjectMocks + private ScheduleQueryServiceImpl scheduleQueryService; + + @Test + @DisplayName("Should return empty result when no schedule details") + void shouldReturnEmptyResultWhenNoDetails() { + Long competitionId = 1L; + when(scheduleGroupMapper.selectScheduleGroupDetails(competitionId)).thenReturn(new ArrayList<>()); + when(projectService.list(any(com.baomidou.mybatisplus.core.conditions.query.QueryWrapper.class))).thenReturn(new ArrayList<>()); + + ScheduleResultDTO result = scheduleQueryService.getScheduleResult(competitionId); + + assertNotNull(result); + assertTrue(result.getIsDraft()); + assertFalse(result.getIsCompleted()); + verify(scheduleGroupMapper).selectScheduleGroupDetails(competitionId); + } + + @Test + @DisplayName("Should return schedule result with groups") + void shouldReturnScheduleResultWithGroups() { + Long competitionId = 1L; + List details = createMockScheduleDetails(); + + when(scheduleGroupMapper.selectScheduleGroupDetails(competitionId)).thenReturn(details); + + ScheduleResultDTO result = scheduleQueryService.getScheduleResult(competitionId); + + assertNotNull(result); + assertNotNull(result.getCompetitionGroups()); + verify(scheduleGroupMapper).selectScheduleGroupDetails(competitionId); + } + + @Test + @DisplayName("Should mark result as completed when status is completed") + void shouldMarkResultAsCompletedWhenStatusIsCompleted() { + Long competitionId = 1L; + List details = createMockScheduleDetails(); + details.get(0).setScheduleStatus("completed"); + + when(scheduleGroupMapper.selectScheduleGroupDetails(competitionId)).thenReturn(details); + + ScheduleResultDTO result = scheduleQueryService.getScheduleResult(competitionId); + + assertNotNull(result); + assertFalse(result.getIsDraft()); + assertTrue(result.getIsCompleted()); + } + + @Test + @DisplayName("Should mark result as draft when status is not completed") + void shouldMarkResultAsDraftWhenStatusIsNotCompleted() { + Long competitionId = 1L; + List details = createMockScheduleDetails(); + details.get(0).setScheduleStatus("draft"); + + when(scheduleGroupMapper.selectScheduleGroupDetails(competitionId)).thenReturn(details); + + ScheduleResultDTO result = scheduleQueryService.getScheduleResult(competitionId); + + assertNotNull(result); + assertTrue(result.getIsDraft()); + assertFalse(result.getIsCompleted()); + } + + @Test + @DisplayName("Should handle null competition ID") + void shouldHandleNullCompetitionId() { + when(scheduleGroupMapper.selectScheduleGroupDetails(null)).thenReturn(new ArrayList<>()); + when(projectService.list(any(com.baomidou.mybatisplus.core.conditions.query.QueryWrapper.class))).thenReturn(new ArrayList<>()); + + ScheduleResultDTO result = scheduleQueryService.getScheduleResult(null); + + assertNotNull(result); + } + + @Test + @DisplayName("Should generate initial schedule when no details exist") + void shouldGenerateInitialScheduleWhenNoDetailsExist() { + Long competitionId = 1L; + when(scheduleGroupMapper.selectScheduleGroupDetails(competitionId)).thenReturn(new ArrayList<>()); + when(projectService.list(any(com.baomidou.mybatisplus.core.conditions.query.QueryWrapper.class))).thenReturn(createMockProjects()); + when(athleteService.list(any(com.baomidou.mybatisplus.core.conditions.query.QueryWrapper.class))).thenReturn(createMockAthletes()); + when(venueService.list(any(com.baomidou.mybatisplus.core.conditions.query.QueryWrapper.class))).thenReturn(createMockVenues()); + + ScheduleResultDTO result = scheduleQueryService.getScheduleResult(competitionId); + + assertNotNull(result); + assertTrue(result.getIsDraft()); + verify(projectService).list(any(com.baomidou.mybatisplus.core.conditions.query.QueryWrapper.class)); + verify(athleteService).list(any(com.baomidou.mybatisplus.core.conditions.query.QueryWrapper.class)); + } + + private List createMockScheduleDetails() { + List details = new ArrayList<>(); + ScheduleGroupDetailVO detail = new ScheduleGroupDetailVO(); + detail.setGroupId(1L); + detail.setGroupName("Test Group"); + detail.setVenueId(10L); + detail.setVenueName("Test Venue"); + detail.setParticipantId(100L); + detail.setPlayerName("Test Player"); + detail.setOrganization("Test Org"); + detail.setDisplayOrder(1); + detail.setProjectType(1); + detail.setScheduleStatus("draft"); + details.add(detail); + return details; + } + + private List createMockProjects() { + List projects = new ArrayList<>(); + MartialProject project = new MartialProject(); + project.setId(1L); + project.setProjectName("Test Project"); + project.setType(1); + projects.add(project); + return projects; + } + + private List createMockAthletes() { + List athletes = new ArrayList<>(); + MartialAthlete athlete = new MartialAthlete(); + athlete.setId(1L); + athlete.setPlayerName("Test Athlete"); + athlete.setProjectId(1L); + athletes.add(athlete); + return athletes; + } + + private List createMockVenues() { + List venues = new ArrayList<>(); + MartialVenue venue = new MartialVenue(); + venue.setId(1L); + venue.setVenueName("Test Venue"); + venues.add(venue); + return venues; + } +}