优化
This commit is contained in:
+64
@@ -0,0 +1,64 @@
|
||||
package com.baiyue.iam.repository;
|
||||
|
||||
import org.junit.jupiter.api.Test;
|
||||
import org.springframework.core.io.ClassPathResource;
|
||||
|
||||
import java.nio.charset.StandardCharsets;
|
||||
import java.nio.file.Files;
|
||||
import java.nio.file.Path;
|
||||
|
||||
import static org.assertj.core.api.Assertions.assertThat;
|
||||
|
||||
class CustomerDimensionInitializationSqlContractTest {
|
||||
@Test
|
||||
void latestIamSqlContainsStatusAndDurableTask() throws Exception {
|
||||
String sql = new ClassPathResource("db/iam.sql").getContentAsString(StandardCharsets.UTF_8);
|
||||
assertContract(sql);
|
||||
}
|
||||
|
||||
@Test
|
||||
void idempotentStandaloneAndUnifiedSqlContainTheSameTaskContract() throws Exception {
|
||||
String standalone = new ClassPathResource("db/customer-dimension-initialization-task.sql")
|
||||
.getContentAsString(StandardCharsets.UTF_8);
|
||||
Path direct = Path.of("deploy", "sql", "头程数据库统一增量-MySQL8.sql");
|
||||
Path unifiedPath = Files.exists(direct) ? direct
|
||||
: Path.of("..", "deploy", "sql", "头程数据库统一增量-MySQL8.sql");
|
||||
String unified = Files.readString(unifiedPath, StandardCharsets.UTF_8);
|
||||
|
||||
assertContract(standalone);
|
||||
assertContract(unified);
|
||||
assertThat(standalone).contains("information_schema.columns", "CREATE TABLE IF NOT EXISTS");
|
||||
assertThat(unified).contains("information_schema.columns", "CREATE TABLE IF NOT EXISTS");
|
||||
}
|
||||
|
||||
@Test
|
||||
void schedulerRetryBudgetHasSafeOverridableDefaultsInAllDomesticProfiles() throws Exception {
|
||||
String application = new ClassPathResource("application.yml").getContentAsString(StandardCharsets.UTF_8);
|
||||
assertSchedulerConfig(application);
|
||||
for (String profile : new String[] {"local", "cn"}) {
|
||||
Path direct = Path.of("config", "nacos", profile, "iam-service.yml");
|
||||
Path config = Files.exists(direct) ? direct
|
||||
: Path.of("..", "config", "nacos", profile, "iam-service.yml");
|
||||
assertSchedulerConfig(Files.readString(config, StandardCharsets.UTF_8));
|
||||
}
|
||||
}
|
||||
|
||||
private static void assertContract(String sql) {
|
||||
assertThat(sql)
|
||||
.contains("dimension_initialization_status")
|
||||
.contains("iam_customer_dimension_initialization_task")
|
||||
.contains("initialization_key")
|
||||
.contains("attempt_count")
|
||||
.contains("next_retry_at")
|
||||
.contains("lease_until")
|
||||
.contains("last_error_code")
|
||||
.contains("task_version");
|
||||
}
|
||||
|
||||
private static void assertSchedulerConfig(String yaml) {
|
||||
assertThat(yaml)
|
||||
.contains("customer-dimension-initialization:")
|
||||
.contains("${CUSTOMER_DIMENSION_INITIALIZATION_FIXED_DELAY_MS:5000}")
|
||||
.contains("${CUSTOMER_DIMENSION_INITIALIZATION_MAX_ATTEMPTS:12}");
|
||||
}
|
||||
}
|
||||
+4
-3
@@ -20,6 +20,7 @@ import static org.junit.jupiter.api.Assertions.assertFalse;
|
||||
import static org.junit.jupiter.api.Assertions.assertTrue;
|
||||
import static org.mockito.ArgumentMatchers.any;
|
||||
import static org.mockito.ArgumentMatchers.anyLong;
|
||||
import static org.mockito.ArgumentMatchers.anyInt;
|
||||
import static org.mockito.ArgumentMatchers.anyString;
|
||||
import static org.mockito.Mockito.never;
|
||||
import static org.mockito.Mockito.verify;
|
||||
@@ -47,7 +48,7 @@ class CustomerDimensionInitializationRelayTest {
|
||||
relay.deliver(10001L);
|
||||
|
||||
verify(repository).markReady(task, workerId(), 91L);
|
||||
verify(repository, never()).recordFailure(any(), anyString(), anyLong(), any(), anyString(),
|
||||
verify(repository, never()).recordFailure(any(), anyString(), anyInt(), any(), anyString(),
|
||||
anyString(), any(Boolean.class));
|
||||
}
|
||||
|
||||
@@ -60,7 +61,7 @@ class CustomerDimensionInitializationRelayTest {
|
||||
relay.deliver(10001L);
|
||||
|
||||
ArgumentCaptor<Boolean> exhausted = ArgumentCaptor.forClass(Boolean.class);
|
||||
verify(repository).recordFailure(any(), anyString(), anyLong(), any(), anyString(),
|
||||
verify(repository).recordFailure(any(), anyString(), anyInt(), any(), anyString(),
|
||||
anyString(), exhausted.capture());
|
||||
assertFalse(exhausted.getValue());
|
||||
}
|
||||
@@ -75,7 +76,7 @@ class CustomerDimensionInitializationRelayTest {
|
||||
relay.deliver(10001L);
|
||||
|
||||
ArgumentCaptor<Boolean> exhausted = ArgumentCaptor.forClass(Boolean.class);
|
||||
verify(repository).recordFailure(any(), anyString(), anyLong(), any(), anyString(),
|
||||
verify(repository).recordFailure(any(), anyString(), anyInt(), any(), anyString(),
|
||||
anyString(), exhausted.capture());
|
||||
assertTrue(exhausted.getValue());
|
||||
verify(repository, never()).markReady(any(), anyString(), any());
|
||||
|
||||
@@ -74,6 +74,8 @@ class MerchantOnboardingServiceTest {
|
||||
"INITIAL_AUTHORIZATION");
|
||||
|
||||
assertEquals("PROFILE_REQUIRED", result.tenantStatus());
|
||||
assertEquals("PENDING", result.dimensionInitializationStatus());
|
||||
assertEquals("PENDING", tenant.getValue().getDimensionInitializationStatus());
|
||||
assertEquals(result.tenantId(), tenant.getValue().getId());
|
||||
assertEquals("测试企业", tenant.getValue().getLegalName());
|
||||
assertEquals("张三", tenant.getValue().getLegalRepresentative());
|
||||
@@ -122,7 +124,7 @@ class MerchantOnboardingServiceTest {
|
||||
}
|
||||
|
||||
@Test
|
||||
void clientRegistrationFailsWhenFourDefaultBoxDimensionsCannotBeInitialized() {
|
||||
void clientRegistrationFailsWhenDurableInitializationIntentCannotBePersisted() {
|
||||
IamRole ownerRole = new IamRole();
|
||||
ownerRole.setId(4000100L);
|
||||
ownerRole.setTenantId(0L);
|
||||
@@ -199,4 +201,3 @@ class MerchantOnboardingServiceTest {
|
||||
verify(tenants, never()).deleteById((java.io.Serializable) any());
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -313,6 +313,7 @@ class TenantServiceTest {
|
||||
9001L);
|
||||
|
||||
assertEquals("PROFILE_REQUIRED", created.tenant().status());
|
||||
assertEquals("PENDING", created.tenant().dimensionInitializationStatus());
|
||||
assertEquals("Bob", created.tenant().legalRepresentative());
|
||||
assertEquals("基础版", created.tenant().servicePackage());
|
||||
assertEquals("13800138000", created.administratorUsername());
|
||||
@@ -326,7 +327,7 @@ class TenantServiceTest {
|
||||
}
|
||||
|
||||
@Test
|
||||
void platformRegistrationFailsWhenFourDefaultBoxDimensionsCannotBeInitialized() {
|
||||
void platformRegistrationFailsWhenDurableInitializationIntentCannotBePersisted() {
|
||||
doThrow(new BizException(ResultCode.SERVICE_UNAVAILABLE, "初始化失败"))
|
||||
.when(dimensionRuleInitialization).initialize(any(Long.class), any(Long.class));
|
||||
|
||||
@@ -491,12 +492,26 @@ class TenantServiceTest {
|
||||
assertEquals(true, withQualification.eligible());
|
||||
}
|
||||
|
||||
@Test
|
||||
void activeCustomerCannotOrderUntilDefaultDimensionsAreReady() {
|
||||
IamTenant tenant = merchant(10001L, "ACTIVE");
|
||||
tenant.setDimensionInitializationStatus("FAILED");
|
||||
when(repository.findTenant(10001L)).thenReturn(tenant);
|
||||
|
||||
var result = service.orderEligibility(10001L);
|
||||
|
||||
assertEquals(false, result.eligible());
|
||||
assertEquals("Customer default dimensions are not ready", result.reason());
|
||||
verify(profileRepository, never()).findQualifications(10001L);
|
||||
}
|
||||
|
||||
private IamTenant merchant(long id, String status) {
|
||||
IamTenant tenant = new IamTenant();
|
||||
tenant.setId(id);
|
||||
tenant.setTenantCode("TEN" + id);
|
||||
tenant.setTenantType("MERCHANT");
|
||||
tenant.setStatus(status);
|
||||
tenant.setDimensionInitializationStatus("READY");
|
||||
tenant.setTenantName("Example Merchant");
|
||||
tenant.setLegalName("Example Merchant Ltd");
|
||||
tenant.setUnifiedSocialCreditCode("91330100EXAMPLE001");
|
||||
@@ -529,4 +544,3 @@ class TenantServiceTest {
|
||||
return review;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user