刘光辉
7 小时以前 06f314545ac3514d7ce28939920866ae8188d31c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
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(); }
    }
}