feat: add recruitment fair statistics API

This commit is contained in:
2026-07-23 18:13:30 +08:00
parent 05d68d106c
commit 3f11837e94
6 changed files with 1007 additions and 0 deletions

View File

@@ -0,0 +1,116 @@
package com.ruoyi.cms.controller.cms;
import com.ruoyi.cms.domain.vo.FairStatisticsFairItem;
import com.ruoyi.cms.mapper.FairStatisticsMapper;
import com.ruoyi.common.core.domain.AjaxResult;
import org.junit.jupiter.api.Test;
import java.lang.reflect.Field;
import java.util.Arrays;
import java.util.Collections;
import java.util.Date;
import java.util.Map;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertTrue;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.ArgumentMatchers.isNull;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
class FairStatisticsControllerTest
{
@Test
void onlineSingleFairAggregatesAllRequiredMetrics() throws Exception
{
FairStatisticsMapper mapper = mock(FairStatisticsMapper.class);
when(mapper.selectOnlineFairStatistics(eq("online-100"), isNull(), isNull()))
.thenReturn(Arrays.asList(
item("online-100", 3L, 4L, 12L, 2L),
item("online-101", 2L, 5L, 8L, 3L)));
FairStatisticsController controller = controllerWith(mapper);
AjaxResult result = controller.summary("online", "online-100", null, null);
assertEquals(200, result.get(AjaxResult.CODE_TAG));
Map<String, Object> data = dataOf(result);
assertEquals("online", data.get("fairType"));
assertEquals(2, data.get("fairCount"));
assertEquals(5L, data.get("companyCount"));
assertEquals(9L, data.get("jobCount"));
assertEquals(20L, data.get("demandCount"));
assertEquals(5L, data.get("interactionCount"));
verify(mapper).selectOnlineFairStatistics("online-100", null, null);
}
@Test
void outdoorSingleFairRejectsNonNumericIdBeforeQuerying() throws Exception
{
FairStatisticsMapper mapper = mock(FairStatisticsMapper.class);
FairStatisticsController controller = controllerWith(mapper);
AjaxResult result = controller.summary("outdoor", "not-a-number", null, null);
assertEquals(500, result.get(AjaxResult.CODE_TAG));
assertEquals("户外招聘会 ID 格式不正确", result.get(AjaxResult.MSG_TAG));
}
@Test
void dateRangeUsesOutdoorMapperAndReturnsEmptyTotals() throws Exception
{
FairStatisticsMapper mapper = mock(FairStatisticsMapper.class);
when(mapper.selectOutdoorFairStatistics(isNull(), any(Date.class), any(Date.class)))
.thenReturn(Collections.emptyList());
FairStatisticsController controller = controllerWith(mapper);
AjaxResult result = controller.summary("outdoor", null, new Date(1_700_000_000_000L), new Date(1_700_086_400_000L));
assertEquals(200, result.get(AjaxResult.CODE_TAG));
Map<String, Object> data = dataOf(result);
assertEquals("outdoor", data.get("fairType"));
assertEquals(0, data.get("fairCount"));
assertEquals(0L, data.get("companyCount"));
assertEquals(0L, data.get("interactionCount"));
verify(mapper).selectOutdoorFairStatistics(isNull(), any(Date.class), any(Date.class));
}
@Test
void incompleteScopeReturnsValidationError() throws Exception
{
FairStatisticsController controller = controllerWith(mock(FairStatisticsMapper.class));
AjaxResult result = controller.summary("online", null, new Date(), null);
assertEquals(500, result.get(AjaxResult.CODE_TAG));
assertTrue(String.valueOf(result.get(AjaxResult.MSG_TAG)).contains("完整选择"));
}
private FairStatisticsFairItem item(String fairId, Long companyCount, Long jobCount,
Long demandCount, Long interactionCount)
{
FairStatisticsFairItem item = new FairStatisticsFairItem();
item.setFairId(fairId);
item.setCompanyCount(companyCount);
item.setJobCount(jobCount);
item.setDemandCount(demandCount);
item.setInteractionCount(interactionCount);
return item;
}
private FairStatisticsController controllerWith(FairStatisticsMapper mapper) throws Exception
{
FairStatisticsController controller = new FairStatisticsController();
Field field = FairStatisticsController.class.getDeclaredField("fairStatisticsMapper");
field.setAccessible(true);
field.set(controller, mapper);
return controller;
}
@SuppressWarnings("unchecked")
private Map<String, Object> dataOf(AjaxResult result)
{
return (Map<String, Object>) result.get(AjaxResult.DATA_TAG);
}
}