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<String> accessTickets = new ArrayList<>();
|
private final List<DmsFilePreviewTicket> 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<String> 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<DmsFilePreviewTicket> tickets;
|
private byte[] result = new byte[]{1};
|
|
FakeComposer() {
|
super(new OnlyOfficeProperties());
|
}
|
|
@Override
|
public byte[] compose(byte[] basePdf, List<DmsFilePreviewTicket> 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;
|
}
|
}
|
}
|