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<String,Object> 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<String,Object> 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<UserProvider> users = mockStatic(UserProvider.class);
|
final MockedStatic<StpUtil> permissions = mockStatic(StpUtil.class);
|
final MockedStatic<RequestContext> request = mockStatic(RequestContext.class);
|
final MockedStatic<OnlinePublicUtils> online = mockStatic(OnlinePublicUtils.class);
|
final MockedStatic<TicketUtil> 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(); }
|
}
|
}
|