刘光辉
3 小时以前 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
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
package jnpf.elnController;
 
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import jnpf.base.ActionResult;
import jnpf.base.vo.PageListVO;
import jnpf.elnEntity.formula.ElnFormulaForms;
import jnpf.elnEntity.formula.ElnFormulaVos;
import jnpf.elnFormula.FormulaFunction;
import jnpf.elnService.formula.ElnFormulaCatalogService;
import jnpf.elnService.formula.FormulaPreviewService;
import jnpf.elnService.formula.FormulaValidationService;
import jnpf.util.context.SpringContext;
import org.junit.BeforeClass;
import org.junit.Test;
import org.springframework.context.support.StaticApplicationContext;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestMapping;
 
import java.lang.reflect.Method;
import java.util.Collections;
import java.util.List;
 
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotEquals;
import static org.junit.Assert.assertSame;
 
public class ElnFormulaCatalogControllerTest {
 
    @BeforeClass
    public static void setUpSpringContext() {
        SpringContext.setApplicationContext(new StaticApplicationContext());
    }
 
    @Test
    public void exposesAllFormulaCatalogRoutes() throws Exception {
        assertEquals("/formulaCatalog",
                ElnFormulaCatalogController.class.getAnnotation(RequestMapping.class).value()[0]);
        assertGet("list", "", ElnFormulaForms.Query.class);
        assertPost("create", "", ElnFormulaForms.Create.class);
        assertPost("createDraft", "/drafts", ElnFormulaForms.CreateDraft.class);
        assertGet("detail", "/{id}", String.class);
        assertGet("templateReferences", "/{id}/templateReferences",
                String.class, ElnFormulaForms.ReferenceQuery.class);
        assertPut("updateDefinition", "/{id}", String.class, ElnFormulaForms.UpdateDefinition.class);
        assertGet("functions", "/functions");
        assertPost("validate", "/validate", ElnFormulaForms.Validate.class);
        assertPost("preview", "/preview", ElnFormulaForms.Preview.class);
        assertPost("createVersion", "/{id}/versions", String.class, ElnFormulaForms.CreateVersion.class);
        assertPut("updateVersion", "/versions/{versionId}", String.class, ElnFormulaForms.UpdateVersion.class);
        assertPost("preRelease", "/versions/{versionId}/preRelease", String.class);
        assertPost("publish", "/versions/{versionId}/publish", String.class);
        assertPost("cancel", "/versions/{versionId}/cancel", String.class, ElnFormulaForms.Reason.class);
        assertPost("switchCurrent", "/{id}/currentVersion", String.class, ElnFormulaForms.SwitchCurrent.class);
        assertPost("enable", "/{id}/enable", String.class, ElnFormulaForms.Reason.class);
        assertPost("disable", "/{id}/disable", String.class, ElnFormulaForms.Reason.class);
    }
 
    @Test
    public void wrapsPageAndForwardsTrimmedCatalogValues() {
        StubCatalog catalog = new StubCatalog();
        ElnFormulaVos.ListItem item = new ElnFormulaVos.ListItem();
        item.setId("formula-1");
        catalog.page = new Page<ElnFormulaVos.ListItem>(2, 10, 21)
                .setRecords(Collections.singletonList(item));
        StubPreview preview = new StubPreview();
        ElnFormulaCatalogController controller = new ElnFormulaCatalogController(catalog, preview);
        ElnFormulaForms.Query query = new ElnFormulaForms.Query();
        query.setCurrentPage(2);
        query.setPageSize(10);
        query.setKeyword(" 公式 ");
        query.setBizEnabled(" enabled ");
        ElnFormulaForms.Create create = new ElnFormulaForms.Create();
        create.setGongshiMingcheng(" 公式 ");
        create.setYewuYongtu(" 用途 ");
        create.setBiaodashi(" amount + 1 ");
        create.setJieguoLeixing(" DECIMAL ");
 
        ActionResult<PageListVO<ElnFormulaVos.ListItem>> result = controller.list(query);
        controller.create(create);
        controller.detail(" formula-1 ");
 
        assertEquals(Integer.valueOf(200), result.getCode());
        assertEquals("formula-1", result.getData().getList().get(0).getId());
        assertEquals(Long.valueOf(2), result.getData().getPagination().getCurrentPage());
        assertEquals(Integer.valueOf(21), result.getData().getPagination().getTotal());
        assertEquals("公式", catalog.query.getKeyword());
        assertEquals("enabled", catalog.query.getBizEnabled());
        assertEquals("公式", catalog.create.getGongshiMingcheng());
        assertEquals("amount + 1", catalog.create.getBiaodashi());
        assertEquals("DECIMAL", catalog.create.getJieguoLeixing());
        assertEquals("formula-1", catalog.detailId);
    }
 
    @Test
    public void wrapsTemplateReferencePageAndForwardsTrimmedQuery() {
        StubCatalog catalog = new StubCatalog();
        ElnFormulaVos.ReferenceSummary item = new ElnFormulaVos.ReferenceSummary();
        item.setTemplateId("template-21");
        catalog.referencePage = new Page<ElnFormulaVos.ReferenceSummary>(2, 20, 41)
                .setRecords(Collections.singletonList(item));
        ElnFormulaCatalogController controller = new ElnFormulaCatalogController(
                catalog, new StubPreview());
        ElnFormulaForms.ReferenceQuery query = new ElnFormulaForms.ReferenceQuery();
        query.setCurrentPage(2);
        query.setPageSize(20);
        query.setKeyword(" 模板 ");
 
        ActionResult<PageListVO<ElnFormulaVos.ReferenceSummary>> result =
                controller.templateReferences(" formula-1 ", query);
 
        assertEquals(Integer.valueOf(200), result.getCode());
        assertEquals("template-21", result.getData().getList().get(0).getTemplateId());
        assertEquals(Long.valueOf(2), result.getData().getPagination().getCurrentPage());
        assertEquals(Integer.valueOf(41), result.getData().getPagination().getTotal());
        assertEquals("formula-1", catalog.referenceFormulaId);
        assertEquals("模板", catalog.referenceQuery.getKeyword());
    }
 
    @Test
    public void rejectsInvalidTemplateReferencePaginationBeforeCallingService() {
        StubCatalog catalog = new StubCatalog();
        ElnFormulaCatalogController controller = new ElnFormulaCatalogController(
                catalog, new StubPreview());
        ElnFormulaForms.ReferenceQuery query = new ElnFormulaForms.ReferenceQuery();
        query.setCurrentPage(0);
 
        ActionResult<PageListVO<ElnFormulaVos.ReferenceSummary>> result =
                controller.templateReferences("formula-1", query);
 
        assertNotEquals(Integer.valueOf(200), result.getCode());
        assertEquals(0, catalog.calls);
    }
 
    @Test
    public void delegatesDraftCreationWithTrimmedDefinitionAndParameterValues() {
        StubCatalog catalog = new StubCatalog();
        ElnFormulaCatalogController controller = new ElnFormulaCatalogController(catalog, new StubPreview());
        ElnFormulaForms.CreateDraft draft = new ElnFormulaForms.CreateDraft();
        draft.setGongshiMingcheng(" 草稿公式 ");
        ElnFormulaForms.Parameter parameter = new ElnFormulaForms.Parameter();
        parameter.setCanshuMingcheng(" 样品量 ");
        parameter.setShujuLeixing(" DECIMAL ");
        draft.setParameters(Collections.singletonList(parameter));
 
        controller.createDraft(draft);
 
        assertEquals("草稿公式", catalog.createDraft.getGongshiMingcheng());
        assertEquals("样品量", catalog.createDraft.getParameters().get(0).getCanshuMingcheng());
        assertEquals("DECIMAL", catalog.createDraft.getParameters().get(0).getShujuLeixing());
    }
 
    @Test
    public void delegatesStatelessEndpointsAndTrimsSlotCodes() {
        StubCatalog catalog = new StubCatalog();
        StubPreview preview = new StubPreview();
        ElnFormulaCatalogController controller = new ElnFormulaCatalogController(catalog, preview);
        ElnFormulaForms.Validate validate = new ElnFormulaForms.Validate();
        validate.setBiaodashi(" amount ");
        validate.setJieguoLeixing(" DECIMAL ");
        ElnFormulaForms.Parameter slot = new ElnFormulaForms.Parameter();
        slot.setCanshuBianma(" amount ");
        slot.setCanshuMingcheng(" 金额 ");
        slot.setShujuLeixing(" DECIMAL ");
        validate.setParameters(Collections.singletonList(slot));
        ElnFormulaForms.Preview previewForm = new ElnFormulaForms.Preview();
        previewForm.setBiaodashi(" true ");
        previewForm.setJieguoLeixing(" BOOLEAN ");
 
        controller.functions();
        controller.validate(validate);
        controller.preview(previewForm);
 
        assertEquals(1, preview.functionCalls);
        assertSame(validate, preview.validationForm);
        assertSame(previewForm, preview.previewForm);
        assertEquals("amount", slot.getCanshuBianma());
        assertEquals("金额", slot.getCanshuMingcheng());
        assertEquals("DECIMAL", slot.getShujuLeixing());
        assertEquals("amount", validate.getBiaodashi());
        assertEquals("BOOLEAN", previewForm.getJieguoLeixing());
        assertEquals(0, catalog.calls);
    }
 
    @Test
    public void delegatesLifecycleWithoutDuplicatingServicePermissions() {
        StubCatalog catalog = new StubCatalog();
        ElnFormulaCatalogController controller = new ElnFormulaCatalogController(catalog, new StubPreview());
        ElnFormulaForms.Reason reason = new ElnFormulaForms.Reason();
        reason.setReason(" 变更 ");
        ElnFormulaForms.SwitchCurrent current = new ElnFormulaForms.SwitchCurrent();
        current.setVersionId(" version-2 ");
        current.setReason(" 切换 ");
 
        controller.preRelease(" version-1 ");
        controller.publish(" version-1 ");
        controller.cancel(" version-1 ", reason);
        controller.switchCurrent(" formula-1 ", current);
        controller.enable(" formula-1 ", reason);
        controller.disable(" formula-1 ", reason);
 
        assertEquals("version-1", catalog.preRelease);
        assertEquals("version-1", catalog.publish);
        assertEquals("version-1:变更", catalog.cancel);
        assertEquals("formula-1:version-2:切换", catalog.current);
        assertEquals("formula-1:变更", catalog.enable);
        assertEquals("formula-1:变更", catalog.disable);
    }
 
    private static void assertGet(String name, String path, Class<?>... types) throws Exception {
        Method method = ElnFormulaCatalogController.class.getMethod(name, types);
        assertEquals(path, first(method.getAnnotation(GetMapping.class).value()));
    }
 
    private static void assertPost(String name, String path, Class<?>... types) throws Exception {
        Method method = ElnFormulaCatalogController.class.getMethod(name, types);
        assertEquals(path, first(method.getAnnotation(PostMapping.class).value()));
    }
 
    private static void assertPut(String name, String path, Class<?>... types) throws Exception {
        Method method = ElnFormulaCatalogController.class.getMethod(name, types);
        assertEquals(path, first(method.getAnnotation(PutMapping.class).value()));
    }
 
    private static String first(String[] paths) {
        return paths.length == 0 ? "" : paths[0];
    }
 
    private static final class StubPreview implements FormulaPreviewService {
        private int functionCalls;
        private ElnFormulaForms.Validate validationForm;
        private ElnFormulaForms.Preview previewForm;
 
        @Override
        public List<FormulaFunction> functions() {
            functionCalls++;
            return Collections.emptyList();
        }
 
        @Override
        public FormulaValidationService.ValidationResult validate(ElnFormulaForms.Validate form) {
            validationForm = form;
            return new FormulaValidationService.ValidationResult(
                    Collections.emptyList(), "latex", null);
        }
 
        @Override
        public ElnFormulaVos.Preview preview(ElnFormulaForms.Preview form) {
            previewForm = form;
            return new ElnFormulaVos.Preview();
        }
    }
 
    private static final class StubCatalog implements ElnFormulaCatalogService {
        private int calls;
        private IPage<ElnFormulaVos.ListItem> page = new Page<>();
        private IPage<ElnFormulaVos.ReferenceSummary> referencePage = new Page<>();
        private ElnFormulaForms.Query query;
        private ElnFormulaForms.ReferenceQuery referenceQuery;
        private String referenceFormulaId;
        private ElnFormulaForms.Create create;
        private ElnFormulaForms.CreateDraft createDraft;
        private String detailId;
        private String preRelease;
        private String publish;
        private String cancel;
        private String current;
        private String enable;
        private String disable;
 
        @Override public ElnFormulaVos.Detail create(ElnFormulaForms.Create form) {
            calls++; create = form; return new ElnFormulaVos.Detail();
        }
        @Override public ElnFormulaVos.Detail createDraft(ElnFormulaForms.CreateDraft form) {
            calls++; createDraft = form; return new ElnFormulaVos.Detail();
        }
        @Override public ElnFormulaVos.Detail updateDefinition(String formulaId,
                ElnFormulaForms.UpdateDefinition form) {
            calls++; return new ElnFormulaVos.Detail();
        }
        @Override public IPage<ElnFormulaVos.ListItem> page(ElnFormulaForms.Query query) {
            calls++; this.query = query; return page;
        }
        @Override public ElnFormulaVos.Detail detail(String formulaId) {
            calls++; detailId = formulaId; return new ElnFormulaVos.Detail();
        }
        @Override public IPage<ElnFormulaVos.ReferenceSummary> pageTemplateReferences(
                String formulaId, ElnFormulaForms.ReferenceQuery query) {
            calls++;
            referenceFormulaId = formulaId;
            referenceQuery = query;
            return referencePage;
        }
        @Override public ElnFormulaVos.Version createVersion(String formulaId,
                ElnFormulaForms.CreateVersion form) {
            calls++; return new ElnFormulaVos.Version();
        }
        @Override public ElnFormulaVos.Version updateDraft(String versionId,
                ElnFormulaForms.UpdateVersion form) {
            calls++; return new ElnFormulaVos.Version();
        }
        @Override public void preRelease(String versionId) { calls++; preRelease = versionId; }
        @Override public void publish(String versionId) { calls++; publish = versionId; }
        @Override public void cancel(String versionId, String reason) {
            calls++; cancel = versionId + ":" + reason;
        }
        @Override public void switchCurrent(String formulaId, String versionId, String reason) {
            calls++; current = formulaId + ":" + versionId + ":" + reason;
        }
        @Override public void enable(String formulaId, String reason) {
            calls++; enable = formulaId + ":" + reason;
        }
        @Override public void disable(String formulaId, String reason) {
            calls++; disable = formulaId + ":" + reason;
        }
    }
}