fix(file): allow standalone legal-person ID upload
This commit is contained in:
+13
@@ -8,6 +8,19 @@ import java.nio.file.Path;
|
||||
import static org.assertj.core.api.Assertions.assertThat;
|
||||
|
||||
class QualificationAndOrderFileOpenApiContractTest {
|
||||
@Test
|
||||
void legalPersonIdHasADedicatedSingleFileContractWithErrorMetadata() throws Exception {
|
||||
String yaml = Files.readString(Path.of(
|
||||
"src/main/resources/openapi/qualification-required-package-v1.yaml"));
|
||||
|
||||
assertThat(yaml)
|
||||
.contains("/api/merchant/v1/files/qualifications:")
|
||||
.contains("enum: [LEGAL_PERSON_ID, FREIGHT_FORWARDER_CERTIFICATE, BANK_ACCOUNT_LICENSE]")
|
||||
.contains("merchant:qualification:upload", "maxLength: 5242880")
|
||||
.contains("name: replace", "requestId:", "traceId:")
|
||||
.doesNotContain("enum: [BUSINESS_LICENSE, LEGAL_PERSON_ID, FREIGHT_FORWARDER_CERTIFICATE, BANK_ACCOUNT_LICENSE]");
|
||||
}
|
||||
|
||||
@Test
|
||||
void qualificationPackageRequiresOnlyTheBusinessLicenseFile() throws Exception {
|
||||
String yaml = Files.readString(Path.of(
|
||||
|
||||
@@ -96,6 +96,16 @@ class QualificationFileContractTest {
|
||||
assertEquals("hasAuthority('platform:customer:list')", method.getAnnotation(PreAuthorize.class).value());
|
||||
}
|
||||
|
||||
@Test
|
||||
void merchantSingleQualificationUploadRequiresTheUploadPermission() throws Exception {
|
||||
var method = QualificationFileController.class.getDeclaredMethod(
|
||||
"upload", AuthenticatedUser.class, org.springframework.web.multipart.MultipartFile.class,
|
||||
String.class, String.class, LocalDate.class, boolean.class);
|
||||
|
||||
assertEquals("hasAuthority('merchant:qualification:upload')",
|
||||
method.getAnnotation(PreAuthorize.class).value());
|
||||
}
|
||||
|
||||
@Test
|
||||
void platformQualificationRejectsCustomerScopedPlatformToken() {
|
||||
var storage = mock(LocalQualificationStorage.class);
|
||||
@@ -219,7 +229,7 @@ class QualificationFileContractTest {
|
||||
}
|
||||
|
||||
@Test
|
||||
void merchantUploadForwardsItsQualificationTypeAndCleansTheReplacedFile() {
|
||||
void merchantLegalPersonIdReplacementUsesTheAuthenticatedTenantAndCleansTheReplacedFile() {
|
||||
var storage = mock(LocalQualificationStorage.class);
|
||||
var iamClient = mock(IamQualificationClient.class);
|
||||
var controller = merchantController(storage, iamClient);
|
||||
@@ -230,15 +240,30 @@ class QualificationFileContractTest {
|
||||
when(iamClient.submit(eq("internal-token"), any())).thenReturn(ApiResponse.success(
|
||||
new IamQualificationClient.QualificationResponse(31L, null, "PROFILE_REQUIRED", oldUrl)));
|
||||
|
||||
controller.upload(merchantUser(), file, "FREIGHT_FORWARDER_CERTIFICATE", null, LocalDate.of(2030, 1, 1), true);
|
||||
controller.upload(merchantUser(), file, "LEGAL_PERSON_ID", null, LocalDate.of(2030, 1, 1), true);
|
||||
|
||||
var requestCaptor = org.mockito.ArgumentCaptor.forClass(IamQualificationClient.QualificationRequest.class);
|
||||
verify(iamClient).submit(eq("internal-token"), requestCaptor.capture());
|
||||
verify(storage).deleteByDocumentUrl(10001L, oldUrl);
|
||||
assertEquals("FREIGHT_FORWARDER_CERTIFICATE", requestCaptor.getValue().qualificationType());
|
||||
assertEquals(10001L, requestCaptor.getValue().tenantId());
|
||||
assertEquals("LEGAL_PERSON_ID", requestCaptor.getValue().qualificationType());
|
||||
assertTrue(requestCaptor.getValue().replace());
|
||||
}
|
||||
|
||||
@Test
|
||||
void merchantQualificationRejectsAPlatformIdentityBeforeWritingTheFile() {
|
||||
var storage = mock(LocalQualificationStorage.class);
|
||||
var iamClient = mock(IamQualificationClient.class);
|
||||
var controller = merchantController(storage, iamClient);
|
||||
var file = new MockMultipartFile("file", "legal-person.pdf", "application/pdf", "%PDF-1.4".getBytes());
|
||||
|
||||
assertThrows(BizException.class,
|
||||
() -> controller.upload(platformUser(), file, "LEGAL_PERSON_ID", null, null, true));
|
||||
|
||||
verify(storage, never()).store(any(Long.class), any());
|
||||
verify(iamClient, never()).submit(any(), any());
|
||||
}
|
||||
|
||||
@Test
|
||||
void merchantUploadRejectsMissingOrUnsupportedTypesBeforeWritingTheFile() {
|
||||
var storage = mock(LocalQualificationStorage.class);
|
||||
@@ -258,7 +283,7 @@ class QualificationFileContractTest {
|
||||
@Test
|
||||
void everyOptionalQualificationTypeIsAcceptedAndForwarded() {
|
||||
for (String qualificationType : Set.of(
|
||||
"FREIGHT_FORWARDER_CERTIFICATE", "BANK_ACCOUNT_LICENSE")) {
|
||||
"LEGAL_PERSON_ID", "FREIGHT_FORWARDER_CERTIFICATE", "BANK_ACCOUNT_LICENSE")) {
|
||||
var storage = mock(LocalQualificationStorage.class);
|
||||
var iamClient = mock(IamQualificationClient.class);
|
||||
var controller = merchantController(storage, iamClient);
|
||||
@@ -277,19 +302,17 @@ class QualificationFileContractTest {
|
||||
}
|
||||
|
||||
@Test
|
||||
void legacySingleUploadRejectsBothRequiredTypesBeforeWritingTheFile() {
|
||||
for (String qualificationType : Set.of("BUSINESS_LICENSE", "LEGAL_PERSON_ID")) {
|
||||
var storage = mock(LocalQualificationStorage.class);
|
||||
var iamClient = mock(IamQualificationClient.class);
|
||||
var controller = merchantController(storage, iamClient);
|
||||
var file = new MockMultipartFile("file", "qualification.pdf", "application/pdf", "%PDF-1.4".getBytes());
|
||||
void singleUploadStillRejectsTheBusinessLicenseBeforeWritingTheFile() {
|
||||
var storage = mock(LocalQualificationStorage.class);
|
||||
var iamClient = mock(IamQualificationClient.class);
|
||||
var controller = merchantController(storage, iamClient);
|
||||
var file = new MockMultipartFile("file", "qualification.pdf", "application/pdf", "%PDF-1.4".getBytes());
|
||||
|
||||
assertThrows(BizException.class,
|
||||
() -> controller.upload(merchantUser(), file, qualificationType, null, null, false));
|
||||
assertThrows(BizException.class,
|
||||
() -> controller.upload(merchantUser(), file, "BUSINESS_LICENSE", null, null, false));
|
||||
|
||||
verify(storage, never()).store(any(Long.class), any());
|
||||
verify(iamClient, never()).submit(any(), any());
|
||||
}
|
||||
verify(storage, never()).store(any(Long.class), any());
|
||||
verify(iamClient, never()).submit(any(), any());
|
||||
}
|
||||
|
||||
private PlatformQualificationFileController platformController(
|
||||
|
||||
Reference in New Issue
Block a user