Merge branch 'feat/open-mp-login' into feat/open-mp-login-07

This commit is contained in:
2026-10-23 15:37:21 +08:00
2 changed files with 46 additions and 16 deletions
@@ -39,12 +39,12 @@ import org.springframework.stereotype.Component;
* 判据是生效快照指针,不是「最新提交状态」展示缓存——重新提交认证会把展示缓存
* 变成「审核中」,照它判定会让司机一提交就接不了单。生效快照只在审核通过时切换。
* <p>
* 两个开关默认开启,可关掉以回退到不校验认证的行为:
* 两个开关默认关闭,接单不校验认证;显式置 true 恢复拦截:
* <pre>
* transport:
* certification:
* vehicle-gate-enabled: false
* driver-gate-enabled: false
* vehicle-gate-enabled: true
* driver-gate-enabled: true
* </pre>
*
* @author Chill
@@ -57,14 +57,14 @@ public class CertificationGate {
/**
* 车辆认证门槛开关
*/
@Value("${transport.certification.vehicle-gate-enabled:true}")
private boolean vehicleGateEnabled = true;
@Value("${transport.certification.vehicle-gate-enabled:false}")
private boolean vehicleGateEnabled = false;
/**
* 司机认证门槛开关
*/
@Value("${transport.certification.driver-gate-enabled:true}")
private boolean driverGateEnabled = true;
@Value("${transport.certification.driver-gate-enabled:false}")
private boolean driverGateEnabled = false;
/**
* 判定车辆是否可用
@@ -11,6 +11,8 @@ import static org.junit.jupiter.api.Assertions.assertTrue;
/**
* 认证可用性门槛测试。
* <p>
* 开关默认关闭:未认证的司机与车辆都可接单;只有显式置 true 才按生效快照校验。
* <p>
* 关键场景:已认证的车被重新提交认证后仍可接单——判定必须走生效快照,
* 而重新提交会把「最新提交状态」变成「审核中」。
*/
@@ -26,14 +28,33 @@ class CertificationGateTest {
// ------------------------------------------------------------ 开关
@Test
@DisplayName("门槛默认开启")
void enabledByDefault() {
assertTrue(gate.isVehicleGateEnabled());
assertTrue(gate.isDriverGateEnabled());
@DisplayName("门槛默认关闭")
void disabledByDefault() {
assertFalse(gate.isVehicleGateEnabled());
assertFalse(gate.isDriverGateEnabled());
}
@Test
@DisplayName("关闭后不因未认证而拦截(便于快速回退)")
@DisplayName("默认关闭:未认证的司机与车辆都不拦")
void disabledByDefaultLetsUncertifiedThrough() {
assertTrue(gate.isVehicleAvailable(Boolean.TRUE, null));
assertTrue(gate.isDriverAvailable(null));
}
@Test
@DisplayName("显式置 true:未认证的司机与车辆重新被拒")
void explicitlyEnabledRejectsUncertified() {
gate.setVehicleGateEnabled(true);
gate.setDriverGateEnabled(true);
assertFalse(gate.isDriverAvailable(null));
assertFalse(gate.isVehicleAvailable(Boolean.TRUE, null));
assertTrue(gate.driverUnavailableReason().contains("认证"));
assertTrue(gate.vehicleUnavailableReason(Boolean.TRUE, null).contains("认证"));
}
@Test
@DisplayName("显式关闭后不因未认证而拦截(配置回退路径)")
void disabledLetsEveryoneThrough() {
gate.setVehicleGateEnabled(false);
gate.setDriverGateEnabled(false);
@@ -45,28 +66,32 @@ class CertificationGateTest {
// ------------------------------------------------------------ 车辆
@Test
@DisplayName("车辆:有生效快照即可用(核心:重新提交不影响可用性)")
@DisplayName("车辆:开启门槛时有生效快照即可用(核心:重新提交不影响可用性)")
void vehicleWithEffectiveSnapshotIsAvailable() {
gate.setVehicleGateEnabled(true);
assertTrue(gate.isVehicleAvailable(Boolean.TRUE, 7001L));
}
@Test
@DisplayName("车辆:重新提交后【状态变成审核中】但仍有生效快照 → 仍可用")
void resubmittedVehicleStaysAvailable() {
gate.setVehicleGateEnabled(true);
// 展示缓存变成「审核中」,但 effective_cert_record_id 仍指着上一次通过的记录。
assertTrue(gate.isVehicleAvailable(Boolean.TRUE, 7001L),
"已认证的车重新提交后必须仍可接单,否则司机一提交就停工");
}
@Test
@DisplayName("车辆:从未认证(无生效快照)被拒绝")
@DisplayName("车辆:开启门槛时从未认证(无生效快照)被拒绝")
void vehicleWithoutEffectiveSnapshotIsRejected() {
gate.setVehicleGateEnabled(true);
assertFalse(gate.isVehicleAvailable(Boolean.TRUE, null));
}
@Test
@DisplayName("车辆:停用状态优先于认证——停用的车即便有生效快照也不可用")
void disabledVehicleIsRejectedEvenIfCertified() {
gate.setVehicleGateEnabled(true);
assertFalse(gate.isVehicleAvailable(Boolean.FALSE, 7001L),
"启用/停用是运营状态,认证门槛只叠加不覆盖");
assertFalse(gate.isVehicleAvailable(null, 7001L));
@@ -75,20 +100,23 @@ class CertificationGateTest {
// ------------------------------------------------------------ 司机
@Test
@DisplayName("司机:有生效快照即可用")
@DisplayName("司机:开启门槛时有生效快照即可用")
void driverWithEffectiveSnapshotIsAvailable() {
gate.setDriverGateEnabled(true);
assertTrue(gate.isDriverAvailable(9001L));
}
@Test
@DisplayName("司机:从未认证被拒绝")
@DisplayName("司机:开启门槛时从未认证被拒绝")
void driverWithoutEffectiveSnapshotIsRejected() {
gate.setDriverGateEnabled(true);
assertFalse(gate.isDriverAvailable(null));
}
@Test
@DisplayName("司机门槛可单独关闭")
void driverGateCanBeDisabledIndependently() {
gate.setVehicleGateEnabled(true);
gate.setDriverGateEnabled(false);
assertTrue(gate.isDriverAvailable(null), "司机门槛关闭时不应拦截");
assertFalse(gate.isVehicleAvailable(Boolean.TRUE, null), "车辆门槛不受影响");
@@ -99,6 +127,7 @@ class CertificationGateTest {
@Test
@DisplayName("停用与未认证分开报:前者让人去启用车辆,后者才让人去认证")
void unavailableReasonsDistinguishDisabledFromUncertified() {
gate.setVehicleGateEnabled(true);
String disabled = gate.vehicleUnavailableReason(Boolean.FALSE, 7001L);
assertTrue(disabled.contains("停用"), disabled);
assertFalse(disabled.contains("认证审核"), "已认证的车被停用,不该报成认证没通过");
@@ -111,6 +140,7 @@ class CertificationGateTest {
@Test
@DisplayName("可用时没有原因;两种不可用文案都不泄露内部字段名")
void availableHasNoReasonAndTextIsReadable() {
gate.setVehicleGateEnabled(true);
assertNull(gate.vehicleUnavailableReason(Boolean.TRUE, 7001L));
assertFalse(gate.vehicleUnavailableReason(Boolean.TRUE, null).contains("effective_cert_record_id"));
assertFalse(gate.vehicleUnavailableReason(Boolean.FALSE, null).contains("effective_cert_record_id"));