package com.tourguide.modules.user.service; import com.tourguide.modules.operation.entity.OperationCity; import com.tourguide.modules.operation.entity.OperationScenicSpot; import com.tourguide.modules.operation.mapper.OperationCityMapper; import com.tourguide.modules.operation.mapper.OperationScenicSpotMapper; import com.tourguide.modules.user.dto.GuideScenicConfigResponse; import com.tourguide.modules.user.entity.GuideScenicConfig; import com.tourguide.modules.user.entity.GuideUser; import com.tourguide.modules.user.mapper.GuideAutoDisableConfigMapper; import com.tourguide.modules.user.mapper.GuideApplicationMapper; import com.tourguide.modules.user.mapper.GuideScenicConfigMapper; import com.tourguide.modules.user.mapper.GuideTeamMapper; import com.tourguide.modules.user.mapper.GuideTeamScenicConfigMapper; import com.tourguide.modules.user.mapper.GuideUserMapper; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.mockito.ArgumentCaptor; import org.springframework.security.crypto.password.PasswordEncoder; import java.util.Collections; import java.util.List; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatThrownBy; import static org.mockito.ArgumentMatchers.any; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.never; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; class GuideUserScenicConfigServiceTest { private GuideUserMapper userMapper; private GuideScenicConfigMapper scenicConfigMapper; private GuideTeamScenicConfigMapper teamScenicConfigMapper; private OperationScenicSpotMapper scenicSpotMapper; private OperationCityMapper cityMapper; private GuideUserService service; @BeforeEach void setUp() { userMapper = mock(GuideUserMapper.class); scenicConfigMapper = mock(GuideScenicConfigMapper.class); teamScenicConfigMapper = mock(GuideTeamScenicConfigMapper.class); scenicSpotMapper = mock(OperationScenicSpotMapper.class); cityMapper = mock(OperationCityMapper.class); service = new GuideUserService( userMapper, mock(GuideTeamMapper.class), mock(GuideApplicationMapper.class), teamScenicConfigMapper, scenicConfigMapper, mock(GuideAutoDisableConfigMapper.class), scenicSpotMapper, cityMapper, mock(PasswordEncoder.class)); GuideUser guide = new GuideUser(); guide.setId(12L); when(userMapper.selectById(12L)).thenReturn(guide); } @Test void addScenicConfigShouldUseEnabledOperationScenicData() { OperationScenicSpot scenicSpot = new OperationScenicSpot(); scenicSpot.setId(21L); scenicSpot.setScenicName("青城山景区"); scenicSpot.setCityId(31L); scenicSpot.setStatus(1); when(scenicSpotMapper.selectById(21L)).thenReturn(scenicSpot); OperationCity city = new OperationCity(); city.setId(31L); city.setCityName("成都市"); when(cityMapper.selectById(31L)).thenReturn(city); when(scenicConfigMapper.selectList(any())).thenAnswer(invocation -> { GuideScenicConfig saved = new GuideScenicConfig(); saved.setId(41L); saved.setGuideId(12L); saved.setScenicName("青城山景区"); saved.setCityName("成都市"); return Collections.singletonList(saved); }); List result = service.addScenicConfig(12L, 21L); ArgumentCaptor captor = ArgumentCaptor.forClass(GuideScenicConfig.class); verify(scenicConfigMapper).upsert(captor.capture()); assertThat(captor.getValue().getGuideId()).isEqualTo(12L); assertThat(captor.getValue().getScenicName()).isEqualTo("青城山景区"); assertThat(captor.getValue().getCityName()).isEqualTo("成都市"); assertThat(result).hasSize(1); } @Test void addScenicConfigShouldRejectDisabledScenicSpot() { OperationScenicSpot scenicSpot = new OperationScenicSpot(); scenicSpot.setId(21L); scenicSpot.setStatus(0); when(scenicSpotMapper.selectById(21L)).thenReturn(scenicSpot); assertThatThrownBy(() -> service.addScenicConfig(12L, 21L)) .hasMessage("景区不存在或未启用"); verify(scenicConfigMapper, never()).upsert(any(GuideScenicConfig.class)); } @Test void addScenicConfigShouldRejectScenicOutsideGuidesTeam() { GuideUser guide = new GuideUser(); guide.setId(12L); guide.setTeamId(51L); when(userMapper.selectById(12L)).thenReturn(guide); OperationScenicSpot scenicSpot = new OperationScenicSpot(); scenicSpot.setId(21L); scenicSpot.setScenicName("青城山景区"); scenicSpot.setCityId(31L); scenicSpot.setStatus(1); when(scenicSpotMapper.selectById(21L)).thenReturn(scenicSpot); OperationCity city = new OperationCity(); city.setId(31L); city.setCityName("成都市"); when(cityMapper.selectById(31L)).thenReturn(city); assertThatThrownBy(() -> service.addScenicConfig(12L, 21L)) .isInstanceOf(com.tourguide.common.exception.BusinessException.class) .hasMessage("只能配置所属讲解队下的景区"); verify(scenicConfigMapper, never()).upsert(any(GuideScenicConfig.class)); } @Test void deleteScenicConfigShouldRejectAnotherGuidesConfig() { GuideScenicConfig config = new GuideScenicConfig(); config.setId(41L); config.setGuideId(99L); when(scenicConfigMapper.selectById(41L)).thenReturn(config); assertThatThrownBy(() -> service.deleteScenicConfig(12L, 41L)) .hasMessage("导游景区配置不存在"); verify(scenicConfigMapper, never()).deleteById(41L); } }