package jnpf.base.service; import cn.hutool.crypto.digest.DigestUtil; import jnpf.base.model.uploadedit.UploadEditLease; import jnpf.util.JsonUtil; import org.junit.Test; import org.springframework.data.redis.core.StringRedisTemplate; import org.springframework.data.redis.core.ValueOperations; import java.util.Collections; import static org.junit.Assert.*; import static org.mockito.Mockito.*; public class UploadEditTemporaryServiceTest { @Test @SuppressWarnings("unchecked") public void statusHonorsOwnerTenantAndExpiryWithoutLoadingForm() { UploadEditAccess access = mock(UploadEditAccess.class); StringRedisTemplate redis = mock(StringRedisTemplate.class); ValueOperations values = mock(ValueOperations.class); when(redis.opsForValue()).thenReturn(values); String leaseId = "0123456789abcdef0123456789abcdef"; String key = "upload-edit:temporary:" + DigestUtil.sha256Hex("tenant") + ":" + leaseId; UploadEditLease lease = new UploadEditLease(); lease.setTenantId("tenant"); lease.setOwnerId("owner"); lease.setLeaseId(leaseId); when(values.get(key)).thenReturn(JsonUtil.getObjectToString(Collections.singletonMap("lease", lease))); UploadEditTemporaryService service = new UploadEditTemporaryService(access, mock(DmsAuditTemporaryEditService.class), redis); assertTrue(service.canReadStatus("tenant", "owner", leaseId)); assertFalse(service.canReadStatus("tenant", "other-owner", leaseId)); assertFalse(service.canReadStatus("other-tenant", "owner", leaseId)); when(values.get(key)).thenReturn(null); assertFalse(service.canReadStatus("tenant", "owner", leaseId)); verifyNoInteractions(access); } @Test @SuppressWarnings("unchecked") public void temporaryLeaseRefreshesDownloadPermissionInsteadOfTrustingCachedGrant() { UploadEditAccess access = mock(UploadEditAccess.class); StringRedisTemplate redis = mock(StringRedisTemplate.class); ValueOperations values = mock(ValueOperations.class); when(redis.opsForValue()).thenReturn(values); String leaseId = "0123456789abcdef0123456789abcdef"; String key = "upload-edit:temporary:" + DigestUtil.sha256Hex("tenant") + ":" + leaseId; UploadEditLease lease = new UploadEditLease(); lease.setTenantId("tenant"); lease.setOwnerId("owner"); lease.setLeaseId(leaseId); lease.setAllowDownload(true); java.util.Map state = new java.util.HashMap<>(); state.put("lease", lease); state.put("context", java.util.Map.of("modelId", "model", "field", "files")); when(values.get(key)).thenReturn(JsonUtil.getObjectToString(state)); when(access.allowDownload(any())).thenReturn(false); UploadEditTemporaryService service = new UploadEditTemporaryService(access, mock(DmsAuditTemporaryEditService.class), redis); assertFalse(service.find("tenant", "owner", leaseId).isAllowDownload()); verify(access).authorizeTemporary(any(), eq("owner")); } }