Skip to content

Commit

Permalink
[PRDP-258] Updated unit tests
Browse files Browse the repository at this point in the history
  • Loading branch information
svariant committed Nov 30, 2023
1 parent f94789a commit 7874e3e
Show file tree
Hide file tree
Showing 2 changed files with 88 additions and 53 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
import it.gov.pagopa.receipt.pdf.generator.exception.ReceiptNotFoundException;
import it.gov.pagopa.receipt.pdf.generator.model.PdfGeneration;
import it.gov.pagopa.receipt.pdf.generator.service.GenerateReceiptPdfService;
import it.gov.pagopa.receipt.pdf.generator.service.impl.ReceiptCosmosServiceImpl;
import lombok.SneakyThrows;
import org.apache.http.HttpStatus;
import org.junit.jupiter.api.BeforeEach;
Expand Down Expand Up @@ -55,7 +56,7 @@ void setUp() {
requeueMessageMock = (OutputBinding<String>) spy(OutputBinding.class);
executionContextMock = mock(ExecutionContext.class);

sut = spy(new GenerateReceiptPdf(generateReceiptPdfServiceMock, receiptCosmosClientMock));
sut = spy(new GenerateReceiptPdf(generateReceiptPdfServiceMock, new ReceiptCosmosServiceImpl(receiptCosmosClientMock)));
}

@Test
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,25 +6,27 @@
import com.microsoft.azure.functions.OutputBinding;
import it.gov.pagopa.receipt.pdf.generator.client.impl.ReceiptQueueClientImpl;
import it.gov.pagopa.receipt.pdf.generator.entity.event.BizEvent;
import it.gov.pagopa.receipt.pdf.generator.entity.receipt.Receipt;
import it.gov.pagopa.receipt.pdf.generator.entity.receipt.ReceiptError;
import it.gov.pagopa.receipt.pdf.generator.entity.receipt.enumeration.ReceiptErrorStatusType;
import it.gov.pagopa.receipt.pdf.generator.entity.receipt.enumeration.ReceiptStatusType;
import it.gov.pagopa.receipt.pdf.generator.exception.Aes256Exception;
import it.gov.pagopa.receipt.pdf.generator.exception.ReceiptNotFoundException;
import it.gov.pagopa.receipt.pdf.generator.service.ReceiptCosmosService;
import it.gov.pagopa.receipt.pdf.generator.service.impl.ReceiptCosmosServiceImpl;
import it.gov.pagopa.receipt.pdf.generator.utils.Aes256Utils;
import it.gov.pagopa.receipt.pdf.generator.utils.ObjectMapperUtils;
import org.apache.http.HttpStatus;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.mockito.ArgumentCaptor;
import org.mockito.Captor;
import org.mockito.Mock;
import org.mockito.Spy;
import org.mockito.junit.jupiter.MockitoExtension;
import uk.org.webcompere.systemstubs.environment.EnvironmentVariables;
import uk.org.webcompere.systemstubs.jupiter.SystemStub;
import uk.org.webcompere.systemstubs.jupiter.SystemStubsExtension;

import java.lang.reflect.Field;
import java.util.Base64;

import static org.junit.jupiter.api.Assertions.*;
Expand All @@ -40,117 +42,149 @@ class ManageReceiptPoisonQueueTest {
private final String VALID_CONTENT_TO_RETRY = String.format("{\"id\":\"%s\"}", BIZ_EVENT_ID);
private final String VALID_CONTENT_NOT_TO_RETRY = String.format("{\"attemptedPoisonRetry\":\"true\",\"id\":\"%s\"}", BIZ_EVENT_ID);
private final String INVALID_MESSAGE = "invalid message";
private final Receipt VALID_RECEIPT = Receipt.builder().eventId(BIZ_EVENT_ID).status(ReceiptStatusType.INSERTED).build();

@Spy
private ManageReceiptPoisonQueue function;

@Mock
private ExecutionContext context;

@Captor
private ArgumentCaptor<String> messageCaptor;

@Captor
private ArgumentCaptor<ReceiptError> documentCaptor;
private ArgumentCaptor<Receipt> receiptCaptor;
@Captor
private ArgumentCaptor<ReceiptError> receiptErrorCaptor;

@SystemStub
private EnvironmentVariables environment = new EnvironmentVariables("AES_SALT", AES_SALT, "AES_SECRET_KEY", AES_KEY);

@AfterEach
public void teardown() throws Exception {
// reset singleton
Field instance = ReceiptQueueClientImpl.class.getDeclaredField("instance");
instance.setAccessible(true);
instance.set(null, null);
}

@Test
void successRunWithValidPayloadToRetryInQueue() throws Exception {
ReceiptQueueClientImpl serviceMock = mock(ReceiptQueueClientImpl.class);
ReceiptQueueClientImpl queueMock = mock(ReceiptQueueClientImpl.class);
Response<SendMessageResult> response = mock(Response.class);
when(response.getStatusCode()).thenReturn(HttpStatus.SC_CREATED);
when(serviceMock.sendMessageToQueue(anyString())).thenReturn(response);
when(queueMock.sendMessageToQueue(anyString())).thenReturn(response);

setMock(serviceMock);
function = spy(new ManageReceiptPoisonQueue(mock(ReceiptCosmosServiceImpl.class), queueMock));

OutputBinding<Receipt> receiptOutput = (OutputBinding<Receipt>)mock(OutputBinding.class);
OutputBinding<ReceiptError> errorToCosmos = (OutputBinding<ReceiptError>)mock(OutputBinding.class);

assertDoesNotThrow(() -> function.processManageReceiptPoisonQueue(
VALID_CONTENT_TO_RETRY, errorToCosmos, context));
VALID_CONTENT_TO_RETRY, receiptOutput, errorToCosmos, context));

verify(serviceMock).sendMessageToQueue(messageCaptor.capture());
verify(queueMock).sendMessageToQueue(messageCaptor.capture());
BizEvent captured = ObjectMapperUtils.mapString(
new String(Base64.getMimeDecoder().decode(messageCaptor.getValue())), BizEvent.class);
assertEquals(BIZ_EVENT_ID, captured.getId());
assertTrue(captured.getAttemptedPoisonRetry());

verifyNoInteractions(errorToCosmos);
verifyNoInteractions(receiptOutput);
}

@Test
void successRunWithValidPayloadNotToRetry() throws Aes256Exception {
ReceiptQueueClientImpl serviceMock = mock(ReceiptQueueClientImpl.class);
void successRunWithValidPayloadNotToRetry() throws Aes256Exception, ReceiptNotFoundException {
ReceiptQueueClientImpl queueMock = mock(ReceiptQueueClientImpl.class);

ManageReceiptPoisonQueueTest.setMock(serviceMock);
OutputBinding<ReceiptError> errorToCosmos = (OutputBinding<ReceiptError>)mock(OutputBinding.class);
ReceiptCosmosService receiptCosmosService = mock(ReceiptCosmosService.class);
when(receiptCosmosService.getReceipt(BIZ_EVENT_ID)).thenReturn(VALID_RECEIPT);

assertDoesNotThrow(() -> function.processManageReceiptPoisonQueue(
VALID_CONTENT_NOT_TO_RETRY, errorToCosmos, context));
function = spy(new ManageReceiptPoisonQueue(receiptCosmosService, queueMock));

verify(errorToCosmos).setValue(documentCaptor.capture());
ReceiptError captured = documentCaptor.getValue();
assertNotNull(captured.getMessagePayload());
assertEquals(VALID_CONTENT_NOT_TO_RETRY, Aes256Utils.decrypt(captured.getMessagePayload()));
assertEquals(BIZ_EVENT_ID, captured.getBizEventId());
assertEquals(ReceiptErrorStatusType.TO_REVIEW, captured.getStatus());
OutputBinding<Receipt> receiptOutput = (OutputBinding<Receipt>)mock(OutputBinding.class);
OutputBinding<ReceiptError> receiptErrorOutput = (OutputBinding<ReceiptError>)mock(OutputBinding.class);

assertDoesNotThrow(() -> function.processManageReceiptPoisonQueue(
VALID_CONTENT_NOT_TO_RETRY, receiptOutput, receiptErrorOutput, context));

verify(receiptErrorOutput).setValue(receiptErrorCaptor.capture());
ReceiptError receiptErrorCaptor = this.receiptErrorCaptor.getValue();
assertNotNull(receiptErrorCaptor.getMessagePayload());
assertEquals(VALID_CONTENT_NOT_TO_RETRY, Aes256Utils.decrypt(receiptErrorCaptor.getMessagePayload()));
assertEquals(BIZ_EVENT_ID, receiptErrorCaptor.getBizEventId());
assertEquals(ReceiptErrorStatusType.TO_REVIEW, receiptErrorCaptor.getStatus());

verify(receiptOutput).setValue(receiptCaptor.capture());
Receipt receiptCaptor = this.receiptCaptor.getValue();
assertEquals(BIZ_EVENT_ID, receiptCaptor.getEventId());
assertEquals(ReceiptStatusType.TO_REVIEW, receiptCaptor.getStatus());
}

@Test
void successRunWithInvalidPayload() throws Aes256Exception {
ReceiptQueueClientImpl serviceMock = mock(ReceiptQueueClientImpl.class);
function = spy(new ManageReceiptPoisonQueue(mock(ReceiptCosmosService.class), mock(ReceiptQueueClientImpl.class)));

ManageReceiptPoisonQueueTest.setMock(serviceMock);
OutputBinding<Receipt> receiptOutput = (OutputBinding<Receipt>)mock(OutputBinding.class);
OutputBinding<ReceiptError> errorToCosmos = (OutputBinding<ReceiptError>)mock(OutputBinding.class);

assertDoesNotThrow(() -> function.processManageReceiptPoisonQueue(INVALID_MESSAGE, errorToCosmos, context));
assertDoesNotThrow(() -> function.processManageReceiptPoisonQueue(INVALID_MESSAGE, receiptOutput, errorToCosmos, context));

verify(errorToCosmos).setValue(documentCaptor.capture());
ReceiptError captured = documentCaptor.getValue();
verify(errorToCosmos).setValue(receiptErrorCaptor.capture());
ReceiptError captured = receiptErrorCaptor.getValue();
assertNotNull(captured.getMessagePayload());
assertEquals(INVALID_MESSAGE, Aes256Utils.decrypt(captured.getMessagePayload()));
assertNull(captured.getBizEventId());
assertEquals(ReceiptErrorStatusType.TO_REVIEW, captured.getStatus());

verifyNoInteractions(receiptOutput);
}

@Test
void KoRunForRequeueError() throws Aes256Exception {
ReceiptQueueClientImpl serviceMock = mock(ReceiptQueueClientImpl.class);
void KoRunForRequeueError() throws Aes256Exception, ReceiptNotFoundException {
ReceiptQueueClientImpl queueMock = mock(ReceiptQueueClientImpl.class);
Response<SendMessageResult> response = mock(Response.class);
when(response.getStatusCode()).thenReturn(HttpStatus.SC_BAD_REQUEST);
when(serviceMock.sendMessageToQueue(anyString())).thenReturn(response);
when(queueMock.sendMessageToQueue(anyString())).thenReturn(response);

setMock(serviceMock);
ReceiptCosmosService receiptCosmosService = mock(ReceiptCosmosService.class);
when(receiptCosmosService.getReceipt(BIZ_EVENT_ID)).thenReturn(VALID_RECEIPT);

function = spy(new ManageReceiptPoisonQueue(receiptCosmosService, queueMock));

OutputBinding<Receipt> receiptOutput = (OutputBinding<Receipt>)mock(OutputBinding.class);
OutputBinding<ReceiptError> errorToCosmos = (OutputBinding<ReceiptError>)mock(OutputBinding.class);

assertDoesNotThrow(() -> function.processManageReceiptPoisonQueue(VALID_CONTENT_TO_RETRY, errorToCosmos, context));
assertDoesNotThrow(() -> function.processManageReceiptPoisonQueue(VALID_CONTENT_TO_RETRY, receiptOutput, errorToCosmos, context));

verify(errorToCosmos).setValue(documentCaptor.capture());
ReceiptError captured = documentCaptor.getValue();
verify(errorToCosmos).setValue(receiptErrorCaptor.capture());
ReceiptError captured = receiptErrorCaptor.getValue();
assertNotNull(captured.getMessagePayload());
assertEquals(VALID_CONTENT_TO_RETRY, Aes256Utils.decrypt(captured.getMessagePayload()));
assertEquals(BIZ_EVENT_ID, captured.getBizEventId());
assertEquals(ReceiptErrorStatusType.TO_REVIEW, captured.getStatus());

verify(receiptOutput).setValue(receiptCaptor.capture());
Receipt receiptCaptor = this.receiptCaptor.getValue();
assertEquals(BIZ_EVENT_ID, receiptCaptor.getEventId());
assertEquals(ReceiptStatusType.TO_REVIEW, receiptCaptor.getStatus());
}

static void setMock(ReceiptQueueClientImpl mock) {
try {
Field instance = ReceiptQueueClientImpl.class.getDeclaredField("instance");
instance.setAccessible(true);
instance.set(instance, mock);
} catch (Exception e) {
throw new RuntimeException(e);
}
}
@Test
void successRunWithReceiptNotFound() throws Aes256Exception, ReceiptNotFoundException {
ReceiptQueueClientImpl queueMock = mock(ReceiptQueueClientImpl.class);
Response<SendMessageResult> response = mock(Response.class);
when(response.getStatusCode()).thenReturn(HttpStatus.SC_BAD_REQUEST);
when(queueMock.sendMessageToQueue(anyString())).thenReturn(response);

ReceiptCosmosService receiptCosmosService = mock(ReceiptCosmosService.class);
when(receiptCosmosService.getReceipt(BIZ_EVENT_ID)).thenThrow(ReceiptNotFoundException.class);

function = spy(new ManageReceiptPoisonQueue(receiptCosmosService, queueMock));

OutputBinding<Receipt> receiptOutput = (OutputBinding<Receipt>)mock(OutputBinding.class);
OutputBinding<ReceiptError> errorToCosmos = (OutputBinding<ReceiptError>)mock(OutputBinding.class);

assertDoesNotThrow(() -> function.processManageReceiptPoisonQueue(VALID_CONTENT_TO_RETRY, receiptOutput, errorToCosmos, context));

verify(errorToCosmos).setValue(receiptErrorCaptor.capture());
ReceiptError captured = receiptErrorCaptor.getValue();
assertNotNull(captured.getMessagePayload());
assertEquals(VALID_CONTENT_TO_RETRY, Aes256Utils.decrypt(captured.getMessagePayload()));
assertEquals(BIZ_EVENT_ID, captured.getBizEventId());
assertEquals(ReceiptErrorStatusType.TO_REVIEW, captured.getStatus());

verifyNoInteractions(receiptOutput);
}
}

0 comments on commit 7874e3e

Please sign in to comment.