package jnpf.bizcommon.onlyoffice.service.impl; import jnpf.base.UserInfo; import jnpf.bizcommon.onlyoffice.entity.DmsPrintRenderItem; import jnpf.bizcommon.onlyoffice.entity.DmsPrintRenderRequest; import jnpf.bizcommon.onlyoffice.entity.OnlyOfficeProperties; import jnpf.dmsEntity.preview.model.DmsFilePreviewTicket; import jnpf.exception.DataException; import org.junit.Test; import java.util.ArrayList; import java.util.List; import java.util.UUID; import static org.junit.Assert.assertArrayEquals; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertSame; public class DmsOnlyOfficePrintServiceTest { private static final UUID VERSION_ID = UUID.fromString("018f0000-0000-7000-8000-000000000702"); @Test public void keepsLegacySingleRenderRequestCompatible() { Fixture fixture = fixture(); fixture.composer.result = new byte[]{9}; DmsPrintRenderRequest request = new DmsPrintRenderRequest(); request.setFileVersionId(VERSION_ID); request.setFileName("quality.docx"); request.setAccessTicket("ticket-1"); assertArrayEquals(new byte[]{9}, fixture.service.render(request, fixture.user)); assertEquals(List.of("ticket-1"), fixture.renderer.accessTickets); assertEquals(1, fixture.composer.tickets.size()); } @Test public void rendersStableSourceOnceAndComposesBatchTicketsInRequestOrder() { Fixture fixture = fixture(); DmsFilePreviewTicket first = new DmsFilePreviewTicket(); DmsFilePreviewTicket second = new DmsFilePreviewTicket(); DmsFilePreviewTicket sourceTicket = new DmsFilePreviewTicket(); fixture.validator.results.addAll(List.of(first, second, sourceTicket)); fixture.composer.result = new byte[]{1, 2}; DmsPrintRenderRequest request = new DmsPrintRenderRequest(); request.setSource(item("ticket-source")); request.setItems(List.of(item("ticket-1"), item("ticket-2"))); assertArrayEquals(new byte[]{1, 2}, fixture.service.render(request, fixture.user)); assertEquals(List.of("ticket-1", "ticket-2", "ticket-source"), fixture.validator.accessTickets); assertEquals(List.of("ticket-source"), fixture.renderer.accessTickets); assertSame(sourceTicket, fixture.renderer.ticket); assertSame(first, fixture.composer.tickets.get(0)); assertSame(second, fixture.composer.tickets.get(1)); } @Test(expected = DataException.class) public void rejectsSourceFromAnotherFileVersion() { Fixture fixture = fixture(); DmsPrintRenderRequest request = new DmsPrintRenderRequest(); DmsPrintRenderItem source = item("ticket-source"); source.setFileVersionId(UUID.fromString("018f0000-0000-7000-8000-000000000703")); request.setSource(source); request.setItems(List.of(item("ticket-1"))); fixture.service.render(request, fixture.user); } @Test(expected = DataException.class) public void rejectsReusedTicketInBatch() { Fixture fixture = fixture(); DmsPrintRenderRequest request = new DmsPrintRenderRequest(); request.setItems(List.of(item("same-ticket"), item("same-ticket"))); fixture.service.render(request, fixture.user); } @Test public void appliesAuthorizedPageSubsetToBatchTicket() { Fixture fixture = fixture(); DmsFilePreviewTicket ticket = new DmsFilePreviewTicket(); ticket.setPrintPages("1-120"); fixture.validator.results.add(ticket); DmsPrintRenderItem item = item("ticket-1"); item.setPrintPages("101-120"); DmsPrintRenderRequest request = new DmsPrintRenderRequest(); request.setItems(List.of(item)); fixture.service.render(request, fixture.user); assertEquals("101-120", fixture.composer.tickets.get(0).getPrintPages()); } @Test(expected = DataException.class) public void rejectsPageSubsetOutsideTicketAuthorization() { Fixture fixture = fixture(); DmsFilePreviewTicket ticket = new DmsFilePreviewTicket(); ticket.setPrintPages("1-10"); fixture.validator.results.add(ticket); DmsPrintRenderItem item = item("ticket-1"); item.setPrintPages("10-11"); DmsPrintRenderRequest request = new DmsPrintRenderRequest(); request.setItems(List.of(item)); fixture.service.render(request, fixture.user); } private Fixture fixture() { FakeValidator validator = new FakeValidator(); FakeRenderer renderer = new FakeRenderer(); FakeComposer composer = new FakeComposer(); UserInfo user = new UserInfo(); user.setTenantId("tenant-1"); user.setUserId("user-1"); return new Fixture(new DmsOnlyOfficePrintService(validator, renderer, composer, new OnlyOfficeProperties()), validator, renderer, composer, user); } private DmsPrintRenderItem item(String ticket) { DmsPrintRenderItem item = new DmsPrintRenderItem(); item.setFileVersionId(VERSION_ID); item.setFileName("quality.docx"); item.setAccessTicket(ticket); return item; } private static class FakeValidator extends DmsOnlyOfficePrintTicketValidator { private final List accessTickets = new ArrayList<>(); private final List results = new ArrayList<>(); FakeValidator() { super(ticket -> null); } @Override public DmsFilePreviewTicket validate(DmsPrintRenderItem request, UserInfo user) { accessTickets.add(request.getAccessTicket()); return results.isEmpty() ? new DmsFilePreviewTicket() : results.remove(0); } } private static class FakeRenderer extends OnlyOfficeDmsPrintRenderer { private final List accessTickets = new ArrayList<>(); private DmsFilePreviewTicket ticket; FakeRenderer() { super(new OnlyOfficeProperties()); } @Override public byte[] renderBase(DmsFilePreviewTicket ticket, String accessTicket) { this.ticket = ticket; accessTickets.add(accessTicket); return new byte[]{1}; } } private static class FakeComposer extends DmsOnlyOfficePrintPdfComposer { private List tickets; private byte[] result = new byte[]{1}; FakeComposer() { super(new OnlyOfficeProperties()); } @Override public byte[] compose(byte[] basePdf, List copies) { tickets = new ArrayList<>(copies); return result; } } private static class Fixture { private final DmsOnlyOfficePrintService service; private final FakeValidator validator; private final FakeRenderer renderer; private final FakeComposer composer; private final UserInfo user; private Fixture(DmsOnlyOfficePrintService service, FakeValidator validator, FakeRenderer renderer, FakeComposer composer, UserInfo user) { this.service = service; this.validator = validator; this.renderer = renderer; this.composer = composer; this.user = user; } } }