This commit is contained in:
2026-09-11 11:51:26 +08:00
parent d60689ce02
commit d2cff49b9e
45 changed files with 569 additions and 66 deletions
@@ -0,0 +1,23 @@
package com.baiyue.iam.repository;
import com.baiyue.common.core.api.ResultCode;
import com.baiyue.common.core.exception.BizException;
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertThrows;
class CustomerCodeRepositoryTest {
@Test
void allocatesFiveDigitCodeFromOne() {
assertEquals("00001", CustomerCodeRepository.format(1));
assertEquals("99999", CustomerCodeRepository.format(99_999));
}
@Test
void rejectsAllocationAfterFiveDigitCapacityIsExhausted() {
BizException failure = assertThrows(BizException.class,
() -> CustomerCodeRepository.format(100_000));
assertEquals(ResultCode.CONFLICT, failure.getResultCode());
}
}
@@ -0,0 +1,34 @@
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 CustomerCodeSchemaContractTest {
@Test
void baselineAndUnifiedSqlInitializeCustomerCodeSequenceAtOne() throws Exception {
String baseline = new ClassPathResource("db/iam.sql")
.getContentAsString(StandardCharsets.UTF_8);
Path unifiedPath = Path.of("deploy", "sql", "头程数据库统一增量-MySQL8.sql");
if (!Files.exists(unifiedPath)) {
unifiedPath = Path.of("..", "deploy", "sql", "头程数据库统一增量-MySQL8.sql");
}
String unified = Files.readString(unifiedPath, StandardCharsets.UTF_8);
assertSequenceDefinition(baseline);
assertSequenceDefinition(unified);
}
private static void assertSequenceDefinition(String sql) {
assertThat(sql)
.contains("tenant_code VARCHAR(8) NOT NULL")
.contains("CREATE TABLE IF NOT EXISTS iam_number_sequence")
.contains("PRIMARY KEY (sequence_key)")
.contains("INSERT IGNORE INTO iam_number_sequence(sequence_key, next_value) VALUES ('CUSTOMER_CODE', 1)");
}
}
@@ -140,7 +140,7 @@ class CustomerListExportProviderServiceTest {
private IamTenant tenant(long id) {
IamTenant tenant = new IamTenant();
tenant.setId(id);
tenant.setTenantCode("TEN" + id);
tenant.setTenantCode(String.format("%05d", id));
tenant.setTenantName("柏悦物流" + id);
tenant.setLegalName("柏悦物流有限公司");
tenant.setUnifiedSocialCreditCode("91440000123456789X");
@@ -14,7 +14,9 @@ import com.baiyue.iam.mapper.IamTenantMapper;
import com.baiyue.iam.mapper.IamTenantQualificationMapper;
import com.baiyue.iam.mapper.IamTenantReviewMapper;
import com.baiyue.iam.mapper.IamUserMapper;
import com.baiyue.iam.repository.CustomerCodeRepository;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.BeforeEach;
import org.mockito.ArgumentCaptor;
import org.springframework.boot.test.mock.mockito.MockBean;
import org.springframework.test.context.junit.jupiter.SpringJUnitConfig;
@@ -42,7 +44,14 @@ class MerchantOnboardingServiceTest {
@MockBean private CustomerDimensionRuleInitializationService dimensionRuleInitialization;
@MockBean private OverseasStorageFeeInitializationService overseasStorageFeeInitialization;
@MockBean private SecurityEventOutboxService securityEvents;
@MockBean private CustomerCodeRepository customerCodes;
@Resource private MerchantOnboardingService service;
@BeforeEach
void allocateCustomerCode() {
when(customerCodes.nextCode()).thenReturn("00001");
}
@Test
void clientRegistrationCreatesOwnerAndAssignsGlobalMerchantOwnerRole() {
@@ -76,6 +85,7 @@ class MerchantOnboardingServiceTest {
assertEquals("PROFILE_REQUIRED", result.tenantStatus());
assertEquals("PENDING", result.dimensionInitializationStatus());
assertEquals("PENDING", tenant.getValue().getDimensionInitializationStatus());
assertEquals("00001", tenant.getValue().getTenantCode());
assertEquals(result.tenantId(), tenant.getValue().getId());
assertEquals("测试企业", tenant.getValue().getLegalName());
assertEquals("张三", tenant.getValue().getLegalRepresentative());
@@ -5,6 +5,7 @@ import com.baiyue.iam.entity.IamTenant;
import com.baiyue.iam.repository.ProfileResourceRepository;
import com.baiyue.iam.repository.MemberRepository;
import com.baiyue.iam.repository.TenantRepository;
import com.baiyue.iam.repository.CustomerCodeRepository;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.mock.mockito.MockBean;
import org.springframework.test.context.junit.jupiter.SpringJUnitConfig;
@@ -21,6 +22,7 @@ import static org.mockito.Mockito.when;
@SpringJUnitConfig(TenantService.class)
class TenantCustomerExportTest {
@MockBean private TenantRepository repository;
@MockBean private CustomerCodeRepository customerCodes;
@MockBean private ProfileResourceRepository profileRepository;
@MockBean private MemberRepository memberRepository;
@MockBean private AuthAccountClient authAccountClient;
@@ -34,7 +36,7 @@ class TenantCustomerExportTest {
void returnsUnmaskedCustomerRowsAndAdvancingCursor() {
IamTenant tenant = new IamTenant();
tenant.setId(101L);
tenant.setTenantCode("TEN101");
tenant.setTenantCode("00101");
tenant.setTenantName("柏悦物流");
tenant.setContactPhone("13800138000");
tenant.setContactEmail("ops@example.com");
@@ -14,6 +14,7 @@ import com.baiyue.iam.dto.TenantDtos.ResetCustomerOwnerPasswordRequest;
import com.baiyue.iam.dto.TenantDtos.CustomerImpersonationRequest;
import com.baiyue.common.security.AuthenticatedUser;
import com.baiyue.iam.repository.TenantRepository;
import com.baiyue.iam.repository.CustomerCodeRepository;
import com.baiyue.iam.repository.ProfileResourceRepository;
import com.baiyue.iam.repository.MemberRepository;
import com.baiyue.iam.mapper.IamRoleMapper;
@@ -51,6 +52,7 @@ import com.baiyue.common.core.api.ResultCode;
@TestPropertySource(properties = "baiyue.security.internal-service-token=internal-token")
class TenantServiceTest {
@MockBean private TenantRepository repository;
@MockBean private CustomerCodeRepository customerCodes;
@MockBean private ProfileResourceRepository profileRepository;
@MockBean private MemberRepository members;
@MockBean private IamRoleMapper roles;
@@ -63,6 +65,7 @@ class TenantServiceTest {
@BeforeEach
void allowUnusedAdministratorPhone() {
when(customerCodes.nextCode()).thenReturn("00001");
when(authClient.availability(eq("internal-token"), any()))
.thenReturn(com.baiyue.common.core.api.ApiResponse.success(true));
}
@@ -72,7 +75,7 @@ class TenantServiceTest {
IamTenant tenant = new IamTenant();
tenant.setId(10001L);
tenant.setTenantCode("TEN10001");
tenant.setTenantCode("10001");
tenant.setTenantName("Example Merchant");
tenant.setStatus("ACTIVE");
tenant.setLegalName("Example Merchant Ltd");
@@ -91,7 +94,7 @@ class TenantServiceTest {
var result = service.pageMerchants(1, 10, "Example", "ACTIVE");
assertEquals(1, result.total());
assertEquals("TEN10001", result.records().get(0).tenantCode());
assertEquals("10001", result.records().get(0).tenantCode());
assertEquals("Alice", result.records().get(0).contactName());
assertEquals("Sales Zhang", result.records().get(0).salesOwnerName());
assertEquals(30, result.records().get(0).paymentTermDays());
@@ -108,7 +111,7 @@ class TenantServiceTest {
review.setReviewType("REGISTER");
review.setCreatedAt(LocalDateTime.of(2026, 8, 17, 10, 27));
IamTenant tenant = merchant(10001L, "PENDING");
tenant.setTenantCode("TEN10001");
tenant.setTenantCode("10001");
tenant.setTenantName("Example Merchant");
tenant.setContactName("Alice");
tenant.setContactPhone("13800138000");
@@ -124,7 +127,7 @@ class TenantServiceTest {
assertEquals("REGISTER", result.get(0).reviewType());
assertEquals("PENDING", result.get(0).status());
assertEquals("Example Merchant", result.get(0).tenantName());
assertEquals("TEN10001", result.get(0).tenantCode());
assertEquals("10001", result.get(0).tenantCode());
assertEquals("Alice", result.get(0).contactName());
assertEquals("13800138000", result.get(0).contactPhone());
assertEquals("alice@example.com", result.get(0).contactEmail());
@@ -136,7 +139,7 @@ class TenantServiceTest {
@Test
void pageFinanceCustomersKeepsFullContactSummaryForInternalFinance() {
IamTenant tenant = merchant(10001L, "ACTIVE");
tenant.setTenantCode("TEN10001");
tenant.setTenantCode("10001");
tenant.setTenantName("Example Merchant");
tenant.setContactName("Alice");
tenant.setContactPhone("13800138000");
@@ -145,7 +148,7 @@ class TenantServiceTest {
var result = service.pageFinanceCustomers(1, 10, "Alice", "ACTIVE", null);
assertEquals("TEN10001", result.records().get(0).tenantCode());
assertEquals("10001", result.records().get(0).tenantCode());
assertEquals("Alice", result.records().get(0).contactName());
assertEquals("13800138000", result.records().get(0).contactPhone());
verify(repository).pageFinanceCustomers(1, 10, "Alice", "ACTIVE", null);
@@ -320,6 +323,7 @@ class TenantServiceTest {
9001L);
assertEquals("PROFILE_REQUIRED", created.tenant().status());
assertEquals("00001", created.tenant().tenantCode());
assertEquals("PENDING", created.tenant().dimensionInitializationStatus());
assertEquals("Bob", created.tenant().legalRepresentative());
assertEquals("基础版", created.tenant().servicePackage());
@@ -515,7 +519,7 @@ class TenantServiceTest {
private IamTenant merchant(long id, String status) {
IamTenant tenant = new IamTenant();
tenant.setId(id);
tenant.setTenantCode("TEN" + id);
tenant.setTenantCode(String.format("%05d", id));
tenant.setTenantType("MERCHANT");
tenant.setStatus(status);
tenant.setDimensionInitializationStatus("READY");