优化
This commit is contained in:
@@ -0,0 +1,116 @@
|
||||
package com.baiyue.auth.service;
|
||||
|
||||
import com.baiyue.auth.client.IamOnboardingClient;
|
||||
import com.baiyue.auth.dto.MerchantRegisterRequest;
|
||||
import com.baiyue.auth.entity.AuthAccount;
|
||||
import com.baiyue.auth.repository.AuthAccountRepository;
|
||||
import com.baiyue.common.core.api.ApiResponse;
|
||||
import org.junit.jupiter.api.Test;
|
||||
import org.mockito.ArgumentCaptor;
|
||||
import org.springframework.security.crypto.password.PasswordEncoder;
|
||||
import org.springframework.test.util.ReflectionTestUtils;
|
||||
import org.springframework.transaction.support.TransactionSynchronization;
|
||||
import org.springframework.transaction.support.TransactionSynchronizationManager;
|
||||
|
||||
import static org.junit.jupiter.api.Assertions.assertThrows;
|
||||
import static org.junit.jupiter.api.Assertions.assertEquals;
|
||||
import static org.mockito.ArgumentMatchers.any;
|
||||
import static org.mockito.ArgumentMatchers.eq;
|
||||
import static org.mockito.Mockito.doThrow;
|
||||
import static org.mockito.Mockito.mock;
|
||||
import static org.mockito.Mockito.verify;
|
||||
import static org.mockito.Mockito.when;
|
||||
|
||||
class MerchantRegistrationServiceTest {
|
||||
@Test
|
||||
void registeredAuthAccountUsesTheOwnerIdentityReturnedByIamOnboarding() {
|
||||
AuthAccountRepository accounts = mock(AuthAccountRepository.class);
|
||||
PasswordEncoder encoder = mock(PasswordEncoder.class);
|
||||
IamOnboardingClient onboarding = mock(IamOnboardingClient.class);
|
||||
MerchantRegistrationService service = new MerchantRegistrationService();
|
||||
ReflectionTestUtils.setField(service, "accountRepository", accounts);
|
||||
ReflectionTestUtils.setField(service, "passwordEncoder", encoder);
|
||||
ReflectionTestUtils.setField(service, "onboardingClient", onboarding);
|
||||
ReflectionTestUtils.setField(service, "internalToken", "internal-token");
|
||||
when(encoder.encode("Password123")).thenReturn("encoded-password");
|
||||
when(onboarding.register(eq("internal-token"), any())).thenReturn(ApiResponse.success(
|
||||
new IamOnboardingClient.OnboardingResponse(10001L, 30001L, "PROFILE_REQUIRED")));
|
||||
|
||||
var result = service.register(new MerchantRegisterRequest(
|
||||
"registered_owner", "Password123", "注册人", "测试企业", "张三",
|
||||
"13800138000", "owner@example.com", "CN", "深圳市宝安区"));
|
||||
|
||||
ArgumentCaptor<IamOnboardingClient.OnboardingRequest> onboardingRequest =
|
||||
ArgumentCaptor.forClass(IamOnboardingClient.OnboardingRequest.class);
|
||||
ArgumentCaptor<AuthAccount> storedAccount = ArgumentCaptor.forClass(AuthAccount.class);
|
||||
verify(onboarding).register(eq("internal-token"), onboardingRequest.capture());
|
||||
verify(accounts).insert(storedAccount.capture());
|
||||
|
||||
assertEquals(onboardingRequest.getValue().authUserId(), storedAccount.getValue().getId());
|
||||
assertEquals(result.accountId(), storedAccount.getValue().getId());
|
||||
assertEquals(10001L, storedAccount.getValue().getDefaultTenantId());
|
||||
assertEquals(10001L, storedAccount.getValue().getOperatorTenantId());
|
||||
assertEquals(30001L, storedAccount.getValue().getDefaultMembershipId());
|
||||
assertEquals("MERCHANT", storedAccount.getValue().getDefaultAppCode());
|
||||
assertEquals("ACTIVE", storedAccount.getValue().getAccountStatus());
|
||||
assertEquals("encoded-password", storedAccount.getValue().getPasswordHash());
|
||||
assertEquals("LOGIN_AND_COMPLETE_QUALIFICATIONS", result.nextStep());
|
||||
}
|
||||
|
||||
@Test
|
||||
void failedAuthInsertCompensatesTheIamRegistration() {
|
||||
AuthAccountRepository accounts = mock(AuthAccountRepository.class);
|
||||
PasswordEncoder encoder = mock(PasswordEncoder.class);
|
||||
IamOnboardingClient onboarding = mock(IamOnboardingClient.class);
|
||||
MerchantRegistrationService service = new MerchantRegistrationService();
|
||||
ReflectionTestUtils.setField(service, "accountRepository", accounts);
|
||||
ReflectionTestUtils.setField(service, "passwordEncoder", encoder);
|
||||
ReflectionTestUtils.setField(service, "onboardingClient", onboarding);
|
||||
ReflectionTestUtils.setField(service, "internalToken", "internal-token");
|
||||
when(encoder.encode("Password123")).thenReturn("encoded-password");
|
||||
when(onboarding.register(eq("internal-token"), any())).thenReturn(ApiResponse.success(
|
||||
new IamOnboardingClient.OnboardingResponse(10001L, 30001L, "PROFILE_REQUIRED")));
|
||||
when(onboarding.compensate(eq("internal-token"), any())).thenReturn(ApiResponse.success(null));
|
||||
doThrow(new IllegalStateException("auth database unavailable")).when(accounts).insert(any());
|
||||
|
||||
assertThrows(IllegalStateException.class, () -> service.register(new MerchantRegisterRequest(
|
||||
"failed_owner", "Password123", "注册人", "测试企业", "张三",
|
||||
"13800138000", "owner@example.com", "CN", "深圳市宝安区")));
|
||||
|
||||
ArgumentCaptor<IamOnboardingClient.OnboardingRequest> onboardingRequest =
|
||||
ArgumentCaptor.forClass(IamOnboardingClient.OnboardingRequest.class);
|
||||
ArgumentCaptor<Long> compensationUserId = ArgumentCaptor.forClass(Long.class);
|
||||
verify(onboarding).register(eq("internal-token"), onboardingRequest.capture());
|
||||
verify(onboarding).compensate(eq("internal-token"), compensationUserId.capture());
|
||||
assertEquals(onboardingRequest.getValue().authUserId(), compensationUserId.getValue());
|
||||
}
|
||||
|
||||
@Test
|
||||
void rolledBackAuthTransactionCompensatesAfterTheLocalTransactionCompletes() {
|
||||
AuthAccountRepository accounts = mock(AuthAccountRepository.class);
|
||||
PasswordEncoder encoder = mock(PasswordEncoder.class);
|
||||
IamOnboardingClient onboarding = mock(IamOnboardingClient.class);
|
||||
MerchantRegistrationService service = new MerchantRegistrationService();
|
||||
ReflectionTestUtils.setField(service, "accountRepository", accounts);
|
||||
ReflectionTestUtils.setField(service, "passwordEncoder", encoder);
|
||||
ReflectionTestUtils.setField(service, "onboardingClient", onboarding);
|
||||
ReflectionTestUtils.setField(service, "internalToken", "internal-token");
|
||||
when(encoder.encode("Password123")).thenReturn("encoded-password");
|
||||
when(onboarding.register(eq("internal-token"), any())).thenReturn(ApiResponse.success(
|
||||
new IamOnboardingClient.OnboardingResponse(10001L, 30001L, "PROFILE_REQUIRED")));
|
||||
when(onboarding.compensate(eq("internal-token"), any())).thenReturn(ApiResponse.success(null));
|
||||
|
||||
TransactionSynchronizationManager.initSynchronization();
|
||||
try {
|
||||
service.register(new MerchantRegisterRequest(
|
||||
"rollback_owner", "Password123", "注册人", "测试企业", "张三",
|
||||
"13800138000", "owner@example.com", "CN", "深圳市宝安区"));
|
||||
var synchronizations = TransactionSynchronizationManager.getSynchronizations();
|
||||
assertEquals(1, synchronizations.size());
|
||||
synchronizations.get(0).afterCompletion(TransactionSynchronization.STATUS_ROLLED_BACK);
|
||||
verify(onboarding).compensate(eq("internal-token"), any());
|
||||
} finally {
|
||||
TransactionSynchronizationManager.clearSynchronization();
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user