package jnpf.onlinedev.service; import cn.dev33.satoken.stp.StpUtil; import jnpf.base.UserInfo; import jnpf.base.entity.VisualdevEntity; import jnpf.base.entity.VisualdevReleaseEntity; import jnpf.base.model.VisualDevJsonModel; import jnpf.base.model.uploadedit.UploadEditContext; import jnpf.base.service.*; import jnpf.base.util.FlowFormDataUtil; import jnpf.exception.DataException; import jnpf.onlinedev.model.*; import jnpf.onlinedev.util.OnlinePublicUtils; import jnpf.util.*; import jnpf.util.context.RequestContext; import org.junit.jupiter.api.Test; import org.mockito.MockedStatic; import java.util.*; import static org.junit.jupiter.api.Assertions.*; import static org.mockito.Mockito.*; public class UploadTemplateServiceTest { @org.junit.jupiter.api.BeforeAll static void initializeContext() { jnpf.util.context.SpringContext.setApplicationContext(mock(org.springframework.context.ApplicationContext.class)); } @Test public void signsCanonicalSourceForCurrentUserWithoutCopying() throws Exception { try (Fixture f = new Fixture()) { Map result = f.service.select(f.query); assertEquals("source.docx", result.get("fileId")); assertEquals("模板.docx", result.get("name")); assertEquals("receipt", result.get("uploadReceipt")); assertEquals("tenant", f.proof.get("tenantId")); assertEquals("user", f.proof.get("ownerId")); assertEquals("upload-edit-source", f.proof.get("purpose")); assertFalse(f.proof.containsKey("uploadReceipt")); verify(f.access).authorizeTemporary(f.query.getContext(), "user"); verify(f.lists).getDataList(any(), argThat(p -> UploadTemplateService.MENU_ID.equals(p.getMenuId()) && p.getPageSize() == 20 && p.getCurrentPage() == 1)); } } @Test public void onlyMainDmsFileCarriesVerifiedTemplateId() throws Exception { try (Fixture f = new Fixture()) { f.query.getContext().setField("wenjian"); when(f.access.isDmsAuditTemporary(any())).thenReturn(true); Map result = f.service.select(f.query); assertEquals("template", result.get("laiyuan_muban_id")); assertEquals("template", f.proof.get("laiyuan_muban_id")); f.query.getContext().setParentField("jilu_mingxi"); assertFalse(f.service.select(f.query).containsKey("laiyuan_muban_id")); } } @Test public void rejectsInvisibleOrRemovedRecord() throws Exception { try (Fixture f = new Fixture()) { doReturn(List.of()).when(f.lists).getDataList(any(), any()); f.reject(); verifyNoInteractions(f.data); } } @Test public void rejectsFileNotInTemplateAndNonDocx() throws Exception { try (Fixture f = new Fixture()) { f.query.setFileId("other.docx"); f.reject(); f.query.setFileId("a.pdf"); f.reject(); } } @Test public void sourcePermissionDenialDoesNotReadRecords() throws Exception { try (Fixture f = new Fixture()) { f.permissions.when(() -> StpUtil.checkPermission(UploadTemplateService.MODEL_ID)).thenThrow(new DataException("denied")); f.reject(); verifyNoInteractions(f.lists, f.data); } } @Test public void targetPermissionDenialDoesNotReadTemplates() throws Exception { try (Fixture f = new Fixture()) { doThrow(new DataException("denied")).when(f.access).authorizeTemporary(any(), anyString()); f.reject(); verifyNoInteractions(f.lists, f.data); } } static class Fixture implements AutoCloseable { final VisualdevReleaseService releases = mock(VisualdevReleaseService.class); final VisualdevService models = mock(VisualdevService.class); final VisualDevListService lists = mock(VisualDevListService.class); final FlowFormDataUtil data = mock(FlowFormDataUtil.class); final UploadEditAccess access = mock(UploadEditAccess.class); final UploadTemplateService service = new UploadTemplateService(releases, models, lists, data, access); final UploadTemplateQuery query = new UploadTemplateQuery(); final MockedStatic users = mockStatic(UserProvider.class); final MockedStatic permissions = mockStatic(StpUtil.class); final MockedStatic request = mockStatic(RequestContext.class); final MockedStatic online = mockStatic(OnlinePublicUtils.class); final MockedStatic tickets = mockStatic(TicketUtil.class); Map proof; Fixture() throws Exception { UserInfo user = new UserInfo(); user.setTenantId("tenant"); user.setUserId("user"); users.when(UserProvider::getUser).thenReturn(user); users.when(UserProvider::getLoginUserId).thenReturn("user"); VisualdevReleaseEntity release = new VisualdevReleaseEntity(); VisualdevEntity model = new VisualdevEntity(); when(releases.getById(UploadTemplateService.MODEL_ID)).thenReturn(release); when(models.getReleaseInfo(UploadTemplateService.MODEL_ID)).thenReturn(model); online.when(() -> OnlinePublicUtils.getVisualJsonModel(release)).thenReturn(new VisualDevJsonModel()); when(lists.getDataList(any(), any())).thenAnswer(inv -> { PaginationModel page = inv.getArgument(1); page.setTotal(1); return List.of(Map.of("id", "template")); }); when(data.getFilePermissionDataInfo(eq(model), eq("template"), any())).thenReturn(Map.of( "wenben_mingcheng", "模板", "biz_files", List.of( Map.of("fileId", "source.docx", "name", "模板.docx", "fileSize", 12, "url", "/source", "uploadReceipt", "old"), Map.of("fileId", "a.pdf", "name", "a.pdf", "fileSize", 10, "url", "/pdf")))); tickets.when(() -> TicketUtil.createTicket(anyString(), eq(86400L))).thenAnswer(inv -> { proof = JsonUtil.getJsonToBean(inv.getArgument(0), Map.class); return "receipt"; }); query.setContext(new UploadEditContext()); query.setTemplateId("template"); query.setFileId("source.docx"); } void reject() throws Exception { try { service.select(query); fail("must reject"); } catch (DataException expected) { } assertNull(proof); } public void close() { tickets.close(); online.close(); request.close(); permissions.close(); users.close(); } } }