This commit is contained in:
2026-08-26 13:58:33 +08:00
parent fc0a6ea7ca
commit 4398e8b347
78 changed files with 920 additions and 1549 deletions
@@ -35,14 +35,22 @@ class InternalBusinessFileControllerTest {
}
@Test void zeroTenantDownloadReturnsOwnedContentWithoutCaching() {
when(service.download(0L, "LOADING_CUSTOMS_DOCUMENT", "51", 91L))
when(service.download(0L, "LOADING_CUSTOMS_DECLARATION", "51", 91L))
.thenReturn(new InternalBusinessFileService.Download("declaration.pdf", "application/pdf", new byte[]{1, 2}));
var response = controller.download("internal-token", 0L, "LOADING_CUSTOMS_DOCUMENT", "51", 91L);
var response = controller.download("internal-token", 0L, "LOADING_CUSTOMS_DECLARATION", "51", 91L);
assertThat(response.getBody()).containsExactly(1, 2);
assertThat(response.getHeaders().getCacheControl()).contains("no-store");
verify(service).download(0L, "LOADING_CUSTOMS_DOCUMENT", "51", 91L);
verify(service).download(0L, "LOADING_CUSTOMS_DECLARATION", "51", 91L);
}
@Test void exactOwnershipCompensationDeleteRemainsBehindInternalToken() {
var response = controller.delete("internal-token", 7L, 0L,
"CONTAINER_DELIVERY_ORDER", "41", 91L);
assertThat(response.successful()).isTrue();
verify(service).delete(0L, "CONTAINER_DELIVERY_ORDER", "41", 91L, 7L);
}
@Test void rejectsInvalidTokenAndNegativeTenantBeforeServiceAccess() {
@@ -47,7 +47,7 @@ class InternalBusinessFileServiceTest {
});
var clearance = service.upload(0L, "CONTAINER_CLEARANCE_DOCUMENT", "41", 7L, file);
var customs = service.upload(0L, "LOADING_CUSTOMS_DOCUMENT", "51", 7L, file);
var customs = service.upload(0L, "LOADING_CUSTOMS_DECLARATION", "51", 7L, file);
var deliveryOrder = service.upload(0L, "CONTAINER_DELIVERY_ORDER", "41", 7L, file);
var pickupOrder = service.upload(0L, "CONTAINER_PICKUP_ORDER", "41", 7L, file);
var unloadPhoto = service.upload(11L, "OVERSEAS_UNLOAD_PHOTO", "51", 7L, file);
@@ -57,7 +57,7 @@ class InternalBusinessFileServiceTest {
InternalBusinessFileService.Metadata::businessId).containsExactly(0L, "CONTAINER_CLEARANCE_DOCUMENT", "41");
assertThat(customs).extracting(InternalBusinessFileService.Metadata::tenantId,
InternalBusinessFileService.Metadata::businessType,
InternalBusinessFileService.Metadata::businessId).containsExactly(0L, "LOADING_CUSTOMS_DOCUMENT", "51");
InternalBusinessFileService.Metadata::businessId).containsExactly(0L, "LOADING_CUSTOMS_DECLARATION", "51");
assertThat(deliveryOrder.businessType()).isEqualTo("CONTAINER_DELIVERY_ORDER");
assertThat(pickupOrder.businessType()).isEqualTo("CONTAINER_PICKUP_ORDER");
assertThat(unloadPhoto).extracting(InternalBusinessFileService.Metadata::tenantId,
@@ -119,22 +119,47 @@ class InternalBusinessFileServiceTest {
@Test void platformMetadataAndDownloadRequireExactCompositeOwnership() {
FileObjectEntity value = new FileObjectEntity(); value.setId(91L); value.setTenantId(0L);
value.setBusinessType("LOADING_CUSTOMS_DOCUMENT"); value.setBusinessId("51");
value.setBusinessType("LOADING_CUSTOMS_DECLARATION"); value.setBusinessId("51");
value.setOriginalName("declaration.pdf"); value.setObjectKey("business-files/0/51/declaration.pdf");
value.setContentType("application/pdf"); value.setSha256("c".repeat(64)); value.setSizeBytes(8L);
when(files.selectOne(any())).thenReturn(value, value, null, null, null);
when(storage.read(value.getObjectKey())).thenReturn("document".getBytes());
assertThat(service.metadata(0L, "LOADING_CUSTOMS_DOCUMENT", "51", 91L).fileName())
assertThat(service.metadata(0L, "LOADING_CUSTOMS_DECLARATION", "51", 91L).fileName())
.isEqualTo("declaration.pdf");
assertThat(service.download(0L, "LOADING_CUSTOMS_DOCUMENT", "51", 91L).content())
assertThat(service.download(0L, "LOADING_CUSTOMS_DECLARATION", "51", 91L).content())
.isEqualTo("document".getBytes());
assertThatThrownBy(() -> service.metadata(0L, "CONTAINER_CLEARANCE_DOCUMENT", "51", 91L))
.isInstanceOf(BizException.class).hasMessageContaining("归属不匹配");
assertThatThrownBy(() -> service.metadata(0L, "LOADING_CUSTOMS_DOCUMENT", "52", 91L))
assertThatThrownBy(() -> service.metadata(0L, "LOADING_CUSTOMS_DECLARATION", "52", 91L))
.isInstanceOf(BizException.class).hasMessageContaining("归属不匹配");
assertThatThrownBy(() -> service.metadata(0L, "LOADING_CUSTOMS_DOCUMENT", "51", 92L))
assertThatThrownBy(() -> service.metadata(0L, "LOADING_CUSTOMS_DECLARATION", "51", 92L))
.isInstanceOf(BizException.class).hasMessageContaining("归属不匹配");
verify(storage).read(value.getObjectKey());
}
@Test void compensationDeleteRequiresExactOwnershipAndLogicallyVoidsBeforeStorageCleanup() {
FileObjectEntity value = new FileObjectEntity();
value.setId(91L); value.setTenantId(0L); value.setBusinessType("CONTAINER_DELIVERY_ORDER");
value.setBusinessId("41"); value.setStatus("ACTIVE"); value.setDeleted(false); value.setVersion(0);
value.setObjectKey("business-files/0/41/do.pdf");
when(files.selectOne(any())).thenReturn(value);
when(files.voidOwned(0L, "CONTAINER_DELIVERY_ORDER", "41", 91L, 0, 7L)).thenReturn(1);
when(storage.delete(value.getObjectKey())).thenReturn(true);
service.delete(0L, "CONTAINER_DELIVERY_ORDER", "41", 91L, 7L);
verify(files).voidOwned(0L, "CONTAINER_DELIVERY_ORDER", "41", 91L, 0, 7L);
verify(storage).delete(value.getObjectKey());
}
@Test void compensationMapperUsesExactCompositeOwnershipAndOptimisticVersion() throws Exception {
String sql = String.join(" ", FileObjectMapper.class.getMethod("voidOwned", long.class,
String.class, String.class, long.class, int.class, long.class)
.getAnnotation(org.apache.ibatis.annotations.Update.class).value());
assertThat(sql)
.contains("id=#{fileId}", "tenant_id=#{tenantId}", "business_type=#{businessType}")
.contains("business_id=#{businessId}", "status='ACTIVE'", "deleted=0", "version=#{version}")
.contains("status='VOID'", "deleted=1", "version=version+1");
}
}