test(e2e-recon): E2E 场景对账表(32 项:31 项有真实覆盖、1 项被裁定取代)+ 补 /me/status.localEligibilityStatus 零断言缺口
- 对账表写入收尾计划 Task 2.1 节:首页 11 / 本地资格 11 / 权限 10 逐项映射到
E2E 用例与后端集成测试;原始清单取自 commit ae1bd2b 占位文件头
- 发现并补齐 1 处缺口:/me/status 的 localEligibilityStatus/localEligibilityType
此前零断言(实现存在但从未被测)→ 新增 MeStatusLocalEligibilityGuardTest 2 用例
- 首页 #10(counselingEnabled flag 控制入口)登记为被 2026-09-19 产品裁定取代(死配置移除)
- 实测:MeStatusLocalEligibilityGuardTest 2/2 绿(离线容器 3:19)
This commit is contained in:
+77
@@ -0,0 +1,77 @@
|
||||
package com.danyang.match.platform.auth;
|
||||
|
||||
import com.danyang.match.platform.auth.service.AuthService;
|
||||
import com.danyang.match.platform.local_eligibility.entity.LocalEligibility;
|
||||
import com.danyang.match.platform.local_eligibility.mapper.LocalEligibilityMapper;
|
||||
import com.danyang.match.platform.user.entity.User;
|
||||
import com.danyang.match.platform.user.mapper.UserMapper;
|
||||
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.boot.test.mock.mockito.MockBean;
|
||||
import org.springframework.data.redis.core.StringRedisTemplate;
|
||||
import org.springframework.test.context.ActiveProfiles;
|
||||
import org.springframework.transaction.annotation.Transactional;
|
||||
|
||||
import java.util.Map;
|
||||
import java.util.UUID;
|
||||
|
||||
import static org.junit.jupiter.api.Assertions.assertEquals;
|
||||
|
||||
/**
|
||||
* E2E 场景对账补缺(2026-09-19):`/me/status` 必须返回 `localEligibilityStatus`。
|
||||
*
|
||||
* <p>原始场景清单(Phase 23 占位文件头,「本地资格 11 项」第 6 项)在对账中发现
|
||||
* <b>零断言覆盖</b> —— 实现存在({@code AuthService#getMeStatus} 组装
|
||||
* {@code localEligibilityStatus / localEligibilityType / localEligibilityVerifiedAt},
|
||||
* 未声明时回 {@code not_declared}),但 E2E 与后端测试都从未断言过该字段。
|
||||
* 本守卫把该字段从「碰巧返回」变成「被声明的契约」:
|
||||
* 若后人重构 {@code getMeStatus} 时丢掉本地资格组装,这里会红。
|
||||
*/
|
||||
@SpringBootTest
|
||||
@ActiveProfiles("test")
|
||||
@Transactional
|
||||
class MeStatusLocalEligibilityGuardTest {
|
||||
|
||||
@MockBean
|
||||
private StringRedisTemplate stringRedisTemplate;
|
||||
|
||||
@Autowired private AuthService authService;
|
||||
@Autowired private UserMapper userMapper;
|
||||
@Autowired private LocalEligibilityMapper localEligibilityMapper;
|
||||
|
||||
private User newUser() {
|
||||
User user = new User();
|
||||
user.setId(UUID.randomUUID().toString());
|
||||
user.setWechatOpenid("openid-" + UUID.randomUUID());
|
||||
user.setAccountStatus("normal");
|
||||
userMapper.insert(user);
|
||||
return user;
|
||||
}
|
||||
|
||||
@Test
|
||||
@DisplayName("未声明本地资格的用户:/me/status 显式返回 not_declared")
|
||||
void notDeclaredUserGetsNotDeclaredStatus() {
|
||||
User user = newUser();
|
||||
Map<String, Object> status = authService.getMeStatus(user.getId());
|
||||
assertEquals("not_declared", status.get("localEligibilityStatus"),
|
||||
"未声明时 /me/status 必须显式返回 not_declared,而不是缺省该键");
|
||||
}
|
||||
|
||||
@Test
|
||||
@DisplayName("已声明本地资格的用户:/me/status 回读真实核验状态与类型")
|
||||
void declaredUserGetsRealStatus() {
|
||||
User user = newUser();
|
||||
LocalEligibility el = new LocalEligibility();
|
||||
el.setUserId(user.getId());
|
||||
el.setEligibilityType("household_registration");
|
||||
el.setVerificationStatus("declared");
|
||||
localEligibilityMapper.insert(el);
|
||||
|
||||
Map<String, Object> status = authService.getMeStatus(user.getId());
|
||||
assertEquals("declared", status.get("localEligibilityStatus"),
|
||||
"/me/status 必须回读 user_local_eligibilities 的真实状态");
|
||||
assertEquals("household_registration", status.get("localEligibilityType"));
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user