刘光辉
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
package jnpf.dmsService;
 
import com.fasterxml.jackson.databind.ObjectMapper;
import jnpf.dmsEntity.preview.form.DmsFilePreviewTicketRequest;
import jnpf.dmsEntity.download.form.DmsFileDownloadTicketRequest;
import jnpf.dmsEntity.print.form.DmsFilePrintTicketRequest;
import jnpf.dmsEntity.watermark.DmsWatermarkParameters;
import jnpf.exception.DataException;
import org.junit.jupiter.api.Test;
 
import java.util.Arrays;
import java.util.List;
 
import static org.junit.jupiter.api.Assertions.*;
 
class DmsWatermarkParametersTest {
    private final ObjectMapper mapper = new ObjectMapper();
 
    @Test
    void allThreeRequestsPreserveIndependentValuesLabelsOrderAndDuplicatePages() throws Exception {
        for (Class<? extends DmsWatermarkParameters> type : Arrays.asList(DmsFilePreviewTicketRequest.class,
                DmsFileDownloadTicketRequest.class, DmsFilePrintTicketRequest.class)) {
            DmsWatermarkParameters request = mapper.readValue(
                    "{\"customBarcode\":[{\"page\":5,\"barValue\":\"REC-005\",\"barText\":\"中文 {/CUN} <&>\"},"
                            + "{\"page\":4,\"barValue\":\"REC-004\",\"barText\":\"Page four\"},"
                            + "{\"page\":4,\"barValue\":\"SECOND-004\",\"barText\":\"Another label\"}]}", type);
            DmsWatermarkParameters normalized = request.normalized();
            assertEquals(List.of(5, 4, 4), normalized.getCustomBarcode().stream().map(DmsWatermarkParameters.CustomBarcode::getPage).toList());
            assertEquals("REC-005", normalized.getCustomBarcode().get(0).getBarValue());
            assertEquals("中文 {/CUN} <&>", normalized.getCustomBarcode().get(0).getBarText());
            assertEquals("SECOND-004", normalized.getCustomBarcode().get(2).getBarValue());
            assertEquals(normalized, mapper.readValue(mapper.writeValueAsString(normalized), DmsWatermarkParameters.class));
            request.getCustomBarcode().get(0).setBarText("changed after snapshot");
            request.getCustomBarcode().clear();
            assertEquals(3, normalized.getCustomBarcode().size());
            assertEquals("中文 {/CUN} <&>", normalized.getCustomBarcode().get(0).getBarText());
        }
    }
 
    @Test
    void eachEntryCanOmitPageIncludingMultipleGlobalEntriesMixedWithSpecificPages() throws Exception {
        assertNull(mapper.readValue("{}", DmsWatermarkParameters.class).normalized().getCustomBarcode());
        DmsWatermarkParameters value = mapper.readValue("{\"customBarcode\":["
                + "{\"barValue\":\"A\",\"barText\":\"All pages\"},"
                + "{\"page\":4,\"barValue\":\"B\",\"barText\":\"Only four\"},"
                + "{\"barValue\":\"C\",\"barText\":\"Also all pages\"}]}", DmsWatermarkParameters.class).normalized();
        assertEquals(3, value.getCustomBarcode().size());
        assertNull(value.getCustomBarcode().get(0).getPage());
        assertEquals(4, value.getCustomBarcode().get(1).getPage());
        assertNull(value.getCustomBarcode().get(2).getPage());
    }
 
    @Test
    void rejectsIncompleteEntriesAndInvalidPages() throws Exception {
        for (String entries : List.of("[]", "[null]", "[{}]",
                "[{\"barValue\":\"REC\"}]", "[{\"barText\":\"Label\"}]",
                "[{\"barValue\":\" \",\"barText\":\"Label\"}]",
                "[{\"barValue\":\"REC\",\"barText\":\" \"}]",
                "[{\"barValue\":\"REC\",\"barText\":\"Label\",\"page\":0}]",
                "[{\"barValue\":\"REC\",\"barText\":\"Label\",\"page\":-1}]")) {
            DmsWatermarkParameters value = mapper.readValue("{\"customBarcode\":" + entries + "}", DmsWatermarkParameters.class);
            assertThrows(DataException.class, value::normalized, entries);
        }
        for (String field : List.of("barValue", "barText")) {
            DmsWatermarkParameters tooLong = mapper.readValue("{\"customBarcode\":[{\"barValue\":\"REC\",\"barText\":\"Label\",\""
                    + field + "\":\"" + "a".repeat(2001) + "\"}]}", DmsWatermarkParameters.class);
            assertThrows(DataException.class, tooLong::normalized);
        }
    }
 
    @Test
    void refusesJacksonCoercionOfFractionalStringBooleanAndArrayPages() {
        for (String page : List.of("1.5", "\"2\"", "true", "[2]", "2147483648")) {
            assertThrows(Exception.class, () -> mapper.readValue(
                    "{\"customBarcode\":[{\"barValue\":\"REC\",\"barText\":\"Label\",\"page\":" + page + "}]}", DmsFilePreviewTicketRequest.class));
        }
    }
 
    @Test
    void printRangeIsIndependentOfWatermarkPages() throws Exception {
        DmsFilePrintTicketRequest request = mapper.readValue(
                "{\"customBarcode\":[{\"page\":5,\"barValue\":\"REC\",\"barText\":\"Label\"}],\"printPages\":\"2-3\",\"copies\":2}",
                DmsFilePrintTicketRequest.class);
        assertEquals("2-3", request.getPrintPages());
        assertEquals(2, request.getCopies());
        assertEquals(5, request.normalized().getCustomBarcode().get(0).getPage());
    }
 
    @Test
    void optionalBusinessTypesAreCopiedAndDeduplicated() throws Exception {
        assertNull(mapper.readValue("{}", DmsWatermarkParameters.class).normalized().getWatermarkBusinessTypes());
        assertEquals(List.of(), mapper.readValue("{\"watermarkBusinessTypes\":[]}",
                DmsWatermarkParameters.class).normalized().getWatermarkBusinessTypes());
        DmsWatermarkParameters request = mapper.readValue(
                "{\"watermarkBusinessTypes\":[\"RECORD\",\"REPORT\",\"RECORD\"]}",
                DmsFilePreviewTicketRequest.class);
        DmsWatermarkParameters normalized = request.normalized();
        assertEquals(List.of("RECORD", "REPORT"), normalized.getWatermarkBusinessTypes());
        request.getWatermarkBusinessTypes().clear();
        assertEquals(2, normalized.getWatermarkBusinessTypes().size());
        for (String invalid : List.of("[null]", "[\"\"]", "[\" RECORD\"]")) {
            DmsWatermarkParameters value = mapper.readValue("{\"watermarkBusinessTypes\":" + invalid + "}",
                    DmsWatermarkParameters.class);
            assertThrows(DataException.class, value::normalized);
        }
    }
}