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:
WorkBuddy
2026-09-19 18:58:07 +08:00
parent e9b99d020b
commit 28cf25756a
2 changed files with 131 additions and 0 deletions
@@ -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"));
}
}