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 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); } } }