|
|
|
|
@ -1,119 +1,119 @@
|
|
|
|
|
package com.yau.digitalrmb.corporatewallet.application;
|
|
|
|
|
|
|
|
|
|
import com.baomidou.mybatisplus.core.MybatisConfiguration;
|
|
|
|
|
import com.baomidou.mybatisplus.core.metadata.TableInfoHelper;
|
|
|
|
|
import com.fasterxml.jackson.databind.ObjectMapper;
|
|
|
|
|
import com.yau.digitalrmb.corporatewallet.domain.CorporateWalletApplication;
|
|
|
|
|
import com.yau.digitalrmb.corporatewallet.domain.CorporateWalletApplicationRepository;
|
|
|
|
|
import com.yau.digitalrmb.corporatewallet.domain.RemoteWalletApplication;
|
|
|
|
|
import com.yau.digitalrmb.corporatewallet.domain.RemoteWalletApplicationRepository;
|
|
|
|
|
import com.yau.digitalrmb.corporatewallet.infrastructure.DonationRecordEntity;
|
|
|
|
|
import com.yau.digitalrmb.corporatewallet.infrastructure.DonationRecordMapper;
|
|
|
|
|
import com.yau.digitalrmb.corporatewallet.interfaces.rest.dto.DonationCreateRequest;
|
|
|
|
|
import com.yau.digitalrmb.institutionidentity.application.InstitutionKeySubject;
|
|
|
|
|
import com.yau.digitalrmb.institutionidentity.domain.InstitutionIdentityCryptography;
|
|
|
|
|
import org.apache.ibatis.builder.MapperBuilderAssistant;
|
|
|
|
|
import org.junit.jupiter.api.BeforeAll;
|
|
|
|
|
import org.junit.jupiter.api.BeforeEach;
|
|
|
|
|
import org.junit.jupiter.api.Test;
|
|
|
|
|
import org.junit.jupiter.api.extension.ExtendWith;
|
|
|
|
|
import org.mockito.InjectMocks;
|
|
|
|
|
import org.mockito.Mock;
|
|
|
|
|
import org.mockito.Spy;
|
|
|
|
|
import org.mockito.junit.jupiter.MockitoExtension;
|
|
|
|
|
|
|
|
|
|
import java.math.BigDecimal;
|
|
|
|
|
import java.util.Optional;
|
|
|
|
|
import java.util.concurrent.atomic.AtomicReference;
|
|
|
|
|
|
|
|
|
|
import static org.assertj.core.api.Assertions.assertThat;
|
|
|
|
|
import static org.mockito.ArgumentMatchers.any;
|
|
|
|
|
import static org.mockito.ArgumentMatchers.anyString;
|
|
|
|
|
import static org.mockito.Mockito.verify;
|
|
|
|
|
import static org.mockito.Mockito.when;
|
|
|
|
|
|
|
|
|
|
@ExtendWith(MockitoExtension.class)
|
|
|
|
|
class DonationServiceTest {
|
|
|
|
|
private static final InstitutionKeySubject SUBJECT = new InstitutionKeySubject("u-1", 1L, 2L);
|
|
|
|
|
|
|
|
|
|
@Mock private DonationRecordMapper mapper;
|
|
|
|
|
@Mock private CorporateWalletApplicationRepository corporateWalletRepository;
|
|
|
|
|
@Mock private RemoteWalletApplicationRepository remoteWalletRepository;
|
|
|
|
|
@Mock private CorporateWalletKeyService keyService;
|
|
|
|
|
@Mock private InstitutionIdentityCryptography cryptography;
|
|
|
|
|
@Mock private SalaryScoreService scoreService;
|
|
|
|
|
@Spy private ObjectMapper objectMapper = new ObjectMapper();
|
|
|
|
|
@InjectMocks private DonationService service;
|
|
|
|
|
|
|
|
|
|
private final AtomicReference<DonationRecordEntity> latest = new AtomicReference<>();
|
|
|
|
|
|
|
|
|
|
@BeforeAll
|
|
|
|
|
static void initializeMybatisLambdaMetadata() {
|
|
|
|
|
TableInfoHelper.initTableInfo(new MapperBuilderAssistant(new MybatisConfiguration(), ""),
|
|
|
|
|
DonationRecordEntity.class);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@BeforeEach
|
|
|
|
|
void setUp() {
|
|
|
|
|
CorporateWalletApplication donor = CorporateWalletApplication.create("u-1", 1L, 2L);
|
|
|
|
|
donor.fillForm("创新科技公司", "CREDIT-1", "张三", "10000000.00", "技术服务", "20260916090000");
|
|
|
|
|
donor.activateWallet("CORP_DONOR", "20260916091000");
|
|
|
|
|
RemoteWalletApplication recipient = RemoteWalletApplication.create("u-1", 1L, 2L);
|
|
|
|
|
recipient.fillForm("阳光公益基金", "CREDIT-2", "李四", "13900139000", "20260916092000");
|
|
|
|
|
recipient.activateWallet("CORP_RECIPIENT", "20260916093000");
|
|
|
|
|
|
|
|
|
|
when(corporateWalletRepository.findLatest("u-1", 1L, 2L)).thenReturn(Optional.of(donor));
|
|
|
|
|
when(remoteWalletRepository.findLatest("u-1", 1L, 2L)).thenReturn(Optional.of(recipient));
|
|
|
|
|
when(mapper.selectOne(any())).thenAnswer(invocation -> latest.get());
|
|
|
|
|
when(mapper.insert(any(DonationRecordEntity.class))).thenAnswer(invocation -> {
|
|
|
|
|
DonationRecordEntity record = invocation.getArgument(0);
|
|
|
|
|
record.setId(100L);
|
|
|
|
|
latest.set(record);
|
|
|
|
|
return 1;
|
|
|
|
|
});
|
|
|
|
|
when(mapper.updateById(any(DonationRecordEntity.class))).thenAnswer(invocation -> {
|
|
|
|
|
latest.set(invocation.getArgument(0));
|
|
|
|
|
return 1;
|
|
|
|
|
});
|
|
|
|
|
when(keyService.getOrCreatePrivateKey(any(), anyString(), anyString())).thenAnswer(invocation ->
|
|
|
|
|
"监管机构私钥".equals(invocation.getArgument(1)) ? "REGULATOR_KEY" : "DONOR_KEY");
|
|
|
|
|
when(cryptography.sm3(anyString())).thenAnswer(invocation -> "HASH_" + invocation.getArgument(0));
|
|
|
|
|
when(cryptography.sign(anyString(), anyString())).thenAnswer(invocation ->
|
|
|
|
|
"SIGN_" + invocation.getArgument(1));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Test
|
|
|
|
|
void completesPrototypeDonationPublicationAndSupervisionFlow() {
|
|
|
|
|
DonationCreateRequest request = new DonationCreateRequest();
|
|
|
|
|
request.setDonorName("创新科技公司");
|
|
|
|
|
request.setDonorWalletId("CORP_DONOR");
|
|
|
|
|
request.setRecipientName("阳光公益基金");
|
|
|
|
|
request.setRecipientWalletId("CORP_RECIPIENT");
|
|
|
|
|
request.setAmount(new BigDecimal("100000.00"));
|
|
|
|
|
request.setProjectName("乡村教育支持计划");
|
|
|
|
|
request.setMemo("乡村教育支持计划捐款");
|
|
|
|
|
request.setTimestamp("20260916100000");
|
|
|
|
|
|
|
|
|
|
service.concatenate(SUBJECT, "张三", request);
|
|
|
|
|
service.digest(SUBJECT);
|
|
|
|
|
service.signDonation(SUBJECT, "DONOR_KEY");
|
|
|
|
|
service.outputDonation(SUBJECT);
|
|
|
|
|
service.receiptDetails(SUBJECT);
|
|
|
|
|
service.extractPublication(SUBJECT);
|
|
|
|
|
service.digestPublication(SUBJECT);
|
|
|
|
|
service.publish(SUBJECT);
|
|
|
|
|
service.outputPublication(SUBJECT);
|
|
|
|
|
service.extractSupervision(SUBJECT);
|
|
|
|
|
service.digestSupervision(SUBJECT);
|
|
|
|
|
service.signSupervision(SUBJECT, "REGULATOR_KEY");
|
|
|
|
|
DonationPageResult result = service.outputSupervision(SUBJECT);
|
|
|
|
|
|
|
|
|
|
assertThat(result.getStatus()).isEqualTo("ARCHIVED");
|
|
|
|
|
assertThat(result.getDonationOutputJson()).contains("DONATE_20260916_001", "已提交");
|
|
|
|
|
assertThat(result.getPublicationOutputJson()).contains("PUBLISHED", "阳光公益基金");
|
|
|
|
|
assertThat(result.getSupervisionOutputJson()).contains("APPROVED", "已备案");
|
|
|
|
|
verify(scoreService).markStepCompleted("u-1", 6);
|
|
|
|
|
verify(scoreService).markStepCompleted("u-1", 7);
|
|
|
|
|
verify(scoreService).markStepCompleted("u-1", 8);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
//package com.yau.digitalrmb.corporatewallet.application;
|
|
|
|
|
//
|
|
|
|
|
//import com.baomidou.mybatisplus.core.MybatisConfiguration;
|
|
|
|
|
//import com.baomidou.mybatisplus.core.metadata.TableInfoHelper;
|
|
|
|
|
//import com.fasterxml.jackson.databind.ObjectMapper;
|
|
|
|
|
//import com.yau.digitalrmb.corporatewallet.domain.CorporateWalletApplication;
|
|
|
|
|
//import com.yau.digitalrmb.corporatewallet.domain.CorporateWalletApplicationRepository;
|
|
|
|
|
//import com.yau.digitalrmb.corporatewallet.domain.RemoteWalletApplication;
|
|
|
|
|
//import com.yau.digitalrmb.corporatewallet.domain.RemoteWalletApplicationRepository;
|
|
|
|
|
//import com.yau.digitalrmb.corporatewallet.infrastructure.DonationRecordEntity;
|
|
|
|
|
//import com.yau.digitalrmb.corporatewallet.infrastructure.DonationRecordMapper;
|
|
|
|
|
//import com.yau.digitalrmb.corporatewallet.interfaces.rest.dto.DonationCreateRequest;
|
|
|
|
|
//import com.yau.digitalrmb.institutionidentity.application.InstitutionKeySubject;
|
|
|
|
|
//import com.yau.digitalrmb.institutionidentity.domain.InstitutionIdentityCryptography;
|
|
|
|
|
//import org.apache.ibatis.builder.MapperBuilderAssistant;
|
|
|
|
|
//import org.junit.jupiter.api.BeforeAll;
|
|
|
|
|
//import org.junit.jupiter.api.BeforeEach;
|
|
|
|
|
//import org.junit.jupiter.api.Test;
|
|
|
|
|
//import org.junit.jupiter.api.extension.ExtendWith;
|
|
|
|
|
//import org.mockito.InjectMocks;
|
|
|
|
|
//import org.mockito.Mock;
|
|
|
|
|
//import org.mockito.Spy;
|
|
|
|
|
//import org.mockito.junit.jupiter.MockitoExtension;
|
|
|
|
|
//
|
|
|
|
|
//import java.math.BigDecimal;
|
|
|
|
|
//import java.util.Optional;
|
|
|
|
|
//import java.util.concurrent.atomic.AtomicReference;
|
|
|
|
|
//
|
|
|
|
|
//import static org.assertj.core.api.Assertions.assertThat;
|
|
|
|
|
//import static org.mockito.ArgumentMatchers.any;
|
|
|
|
|
//import static org.mockito.ArgumentMatchers.anyString;
|
|
|
|
|
//import static org.mockito.Mockito.verify;
|
|
|
|
|
//import static org.mockito.Mockito.when;
|
|
|
|
|
//
|
|
|
|
|
//@ExtendWith(MockitoExtension.class)
|
|
|
|
|
//class DonationServiceTest {
|
|
|
|
|
// private static final InstitutionKeySubject SUBJECT = new InstitutionKeySubject("u-1", 1L, 2L);
|
|
|
|
|
//
|
|
|
|
|
// @Mock private DonationRecordMapper mapper;
|
|
|
|
|
// @Mock private CorporateWalletApplicationRepository corporateWalletRepository;
|
|
|
|
|
// @Mock private RemoteWalletApplicationRepository remoteWalletRepository;
|
|
|
|
|
// @Mock private CorporateWalletKeyService keyService;
|
|
|
|
|
// @Mock private InstitutionIdentityCryptography cryptography;
|
|
|
|
|
// @Mock private SalaryScoreService scoreService;
|
|
|
|
|
// @Spy private ObjectMapper objectMapper = new ObjectMapper();
|
|
|
|
|
// @InjectMocks private DonationService service;
|
|
|
|
|
//
|
|
|
|
|
// private final AtomicReference<DonationRecordEntity> latest = new AtomicReference<>();
|
|
|
|
|
//
|
|
|
|
|
// @BeforeAll
|
|
|
|
|
// static void initializeMybatisLambdaMetadata() {
|
|
|
|
|
// TableInfoHelper.initTableInfo(new MapperBuilderAssistant(new MybatisConfiguration(), ""),
|
|
|
|
|
// DonationRecordEntity.class);
|
|
|
|
|
// }
|
|
|
|
|
//
|
|
|
|
|
// @BeforeEach
|
|
|
|
|
// void setUp() {
|
|
|
|
|
// CorporateWalletApplication donor = CorporateWalletApplication.create("u-1", 1L, 2L);
|
|
|
|
|
// donor.fillForm("创新科技公司", "CREDIT-1", "张三", "10000000.00", "技术服务", "20260916090000");
|
|
|
|
|
// donor.activateWallet("CORP_DONOR", "20260916091000");
|
|
|
|
|
// RemoteWalletApplication recipient = RemoteWalletApplication.create("u-1", 1L, 2L);
|
|
|
|
|
// recipient.fillForm("阳光公益基金", "CREDIT-2", "李四", "13900139000", "20260916092000");
|
|
|
|
|
// recipient.activateWallet("CORP_RECIPIENT", "20260916093000");
|
|
|
|
|
//
|
|
|
|
|
// when(corporateWalletRepository.findLatest("u-1", 1L, 2L)).thenReturn(Optional.of(donor));
|
|
|
|
|
// when(remoteWalletRepository.findLatest("u-1", 1L, 2L)).thenReturn(Optional.of(recipient));
|
|
|
|
|
// when(mapper.selectOne(any())).thenAnswer(invocation -> latest.get());
|
|
|
|
|
// when(mapper.insert(any(DonationRecordEntity.class))).thenAnswer(invocation -> {
|
|
|
|
|
// DonationRecordEntity record = invocation.getArgument(0);
|
|
|
|
|
// record.setId(100L);
|
|
|
|
|
// latest.set(record);
|
|
|
|
|
// return 1;
|
|
|
|
|
// });
|
|
|
|
|
// when(mapper.updateById(any(DonationRecordEntity.class))).thenAnswer(invocation -> {
|
|
|
|
|
// latest.set(invocation.getArgument(0));
|
|
|
|
|
// return 1;
|
|
|
|
|
// });
|
|
|
|
|
// when(keyService.getOrCreatePrivateKey(any(), anyString(), anyString())).thenAnswer(invocation ->
|
|
|
|
|
// "监管机构私钥".equals(invocation.getArgument(1)) ? "REGULATOR_KEY" : "DONOR_KEY");
|
|
|
|
|
// when(cryptography.sm3(anyString())).thenAnswer(invocation -> "HASH_" + invocation.getArgument(0));
|
|
|
|
|
// when(cryptography.sign(anyString(), anyString())).thenAnswer(invocation ->
|
|
|
|
|
// "SIGN_" + invocation.getArgument(1));
|
|
|
|
|
// }
|
|
|
|
|
//
|
|
|
|
|
// @Test
|
|
|
|
|
// void completesPrototypeDonationPublicationAndSupervisionFlow() {
|
|
|
|
|
// DonationCreateRequest request = new DonationCreateRequest();
|
|
|
|
|
// request.setDonorName("创新科技公司");
|
|
|
|
|
// request.setDonorWalletId("CORP_DONOR");
|
|
|
|
|
// request.setRecipientName("阳光公益基金");
|
|
|
|
|
// request.setRecipientWalletId("CORP_RECIPIENT");
|
|
|
|
|
// request.setAmount(new BigDecimal("100000.00"));
|
|
|
|
|
// request.setProjectName("乡村教育支持计划");
|
|
|
|
|
// request.setMemo("乡村教育支持计划捐款");
|
|
|
|
|
// request.setTimestamp("20260916100000");
|
|
|
|
|
//
|
|
|
|
|
// service.concatenate(SUBJECT, "张三", request);
|
|
|
|
|
// service.digest(SUBJECT);
|
|
|
|
|
// service.signDonation(SUBJECT, "DONOR_KEY");
|
|
|
|
|
// service.outputDonation(SUBJECT);
|
|
|
|
|
// service.receiptDetails(SUBJECT);
|
|
|
|
|
// service.extractPublication(SUBJECT);
|
|
|
|
|
// service.digestPublication(SUBJECT);
|
|
|
|
|
// service.publish(SUBJECT);
|
|
|
|
|
// service.outputPublication(SUBJECT);
|
|
|
|
|
// service.extractSupervision(SUBJECT);
|
|
|
|
|
// service.digestSupervision(SUBJECT);
|
|
|
|
|
// service.signSupervision(SUBJECT, "REGULATOR_KEY");
|
|
|
|
|
// DonationPageResult result = service.outputSupervision(SUBJECT);
|
|
|
|
|
//
|
|
|
|
|
// assertThat(result.getStatus()).isEqualTo("ARCHIVED");
|
|
|
|
|
// assertThat(result.getDonationOutputJson()).contains("DONATE_20260916_001", "已提交");
|
|
|
|
|
// assertThat(result.getPublicationOutputJson()).contains("PUBLISHED", "阳光公益基金");
|
|
|
|
|
// assertThat(result.getSupervisionOutputJson()).contains("APPROVED", "已备案");
|
|
|
|
|
// verify(scoreService).markStepCompleted("u-1", 6);
|
|
|
|
|
// verify(scoreService).markStepCompleted("u-1", 7);
|
|
|
|
|
// verify(scoreService).markStepCompleted("u-1", 8);
|
|
|
|
|
// }
|
|
|
|
|
//}
|
|
|
|
|
|