From 96fc6e98039645579c8d942b77546f98af8ed50e Mon Sep 17 00:00:00 2001 From: Francesco Parisi Date: Tue, 21 May 2024 02:28:20 +0200 Subject: [PATCH 01/12] NOD-892: [FDR] XML-to-JSON - Implementazione JUnit --- pom.xml | 2 +- src/test/java/FdrXmlErrorTest.java | 75 ++++++++++++++++++++++++++++++ src/test/java/InfoTest.java | 57 +++++++++++++++++++++++ src/test/java/util/LogHandler.java | 32 +++++++++++++ 4 files changed, 165 insertions(+), 1 deletion(-) create mode 100644 src/test/java/FdrXmlErrorTest.java create mode 100644 src/test/java/InfoTest.java create mode 100644 src/test/java/util/LogHandler.java diff --git a/pom.xml b/pom.xml index 35b4a6a..0c55281 100644 --- a/pom.xml +++ b/pom.xml @@ -303,7 +303,7 @@ org.apache.maven.plugins maven-surefire-plugin - 2.19.1 + 2.22.0 diff --git a/src/test/java/FdrXmlErrorTest.java b/src/test/java/FdrXmlErrorTest.java new file mode 100644 index 0000000..3552608 --- /dev/null +++ b/src/test/java/FdrXmlErrorTest.java @@ -0,0 +1,75 @@ +import com.azure.data.tables.TableServiceClient; +import com.azure.data.tables.TableServiceClientBuilder; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.microsoft.azure.functions.*; +import it.gov.pagopa.fdrxmltojson.FdrXmlError; +import lombok.SneakyThrows; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.ArgumentCaptor; +import org.mockito.Mock; +import org.mockito.Spy; +import org.mockito.junit.jupiter.MockitoExtension; +import util.TestUtil; + +import java.util.*; +import java.util.logging.Logger; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.mockito.Mockito.*; + +@ExtendWith(MockitoExtension.class) +public class FdrXmlErrorTest { + + @Spy + FdrXmlError fdrXmlError; + + @Mock + ExecutionContext context; + + private static final Logger logger = Logger.getLogger("FdrXmlToJson-test-logger"); + + final HttpRequestMessage> request = mock(HttpRequestMessage.class); + final HttpResponseMessage.Builder builder = mock(HttpResponseMessage.Builder.class); + + @Test + @SneakyThrows + void runOk_withoutAdditionalProperties() { + // mocking objects + when(context.getLogger()).thenReturn(logger); + HttpResponseMessage responseMock = mock(HttpResponseMessage.class); + + doReturn(HttpStatus.OK).when(responseMock).getStatus(); + doReturn(responseMock).when(builder).build(); + doReturn(builder).when(request).createResponseBuilder(any(HttpStatus.class)); + + TableServiceClientBuilder tableServiceClientBuilder = mock(TableServiceClientBuilder.class); + TableServiceClient tableServiceClient = mock(TableServiceClient.class); + when(tableServiceClientBuilder.buildClient()).thenReturn(tableServiceClient); + + OutputBinding> document = (OutputBinding>) mock(OutputBinding.class); + + // generating input + String eventInStringForm = "";//TestUtil.readStringFromFile("events/event_ok_1.json"); + List events = new ArrayList<>(); + events.add(eventInStringForm); + Map[] properties = new HashMap[1]; + properties[0] = new HashMap<>(); + + // generating expected output + Map expectedEvent = new ObjectMapper().readValue(eventInStringForm, Map.class); + expectedEvent.put("PartitionKey", "20231212-77777777777-88888888888"); +// ((Map)expectedEvent.get(Constants.FAULTBEAN_EVENT_FIELD)).put(Constants.TIMESTAMP_EVENT_FIELD, 1702406079); +// ((Map)expectedEvent.get(Constants.FAULTBEAN_EVENT_FIELD)).put(Constants.DATE_TIME_EVENT_FIELD, "2023-12-12T18:34:39.860654"); + List expectedEventsToPersist = List.of(expectedEvent); + + // execute logic + fdrXmlError.run(request, context); + +// ArgumentCaptor> captor = ArgumentCaptor.forClass(List.class); +// verify(document).setValue(captor.capture()); +// List actualEventsToPersist = captor.getValue(); +// assertEquals(convertWithStream(expectedEventsToPersist), convertWithStream(actualEventsToPersist)); + } + +} diff --git a/src/test/java/InfoTest.java b/src/test/java/InfoTest.java new file mode 100644 index 0000000..7d50645 --- /dev/null +++ b/src/test/java/InfoTest.java @@ -0,0 +1,57 @@ +import com.microsoft.azure.functions.ExecutionContext; +import com.microsoft.azure.functions.HttpRequestMessage; +import com.microsoft.azure.functions.HttpResponseMessage; +import com.microsoft.azure.functions.HttpStatus; +import it.gov.pagopa.fdrxmltojson.Info; +import lombok.SneakyThrows; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.Mock; +import org.mockito.Spy; +import org.mockito.junit.jupiter.MockitoExtension; + +import java.util.Optional; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.doReturn; +import static org.mockito.Mockito.mock; + +@ExtendWith(MockitoExtension.class) +public class InfoTest { + + @Mock + ExecutionContext context; + + @Spy + Info infoFunction; + + final HttpRequestMessage> request = mock(HttpRequestMessage.class); + final HttpResponseMessage.Builder builder = mock(HttpResponseMessage.Builder.class); + + @SneakyThrows + @Test + void getInfoOk() { + HttpResponseMessage responseMock = mock(HttpResponseMessage.class); + doReturn(HttpStatus.OK).when(responseMock).getStatus(); + doReturn(responseMock).when(builder).build(); + doReturn(builder).when(request).createResponseBuilder(any(HttpStatus.class)); + + HttpResponseMessage response = infoFunction.run(request, context); + + assertEquals(200, response.getStatus().value()); + } + + @SneakyThrows + @Test + void getInfoKo() { + HttpResponseMessage responseMock = mock(HttpResponseMessage.class); + doReturn(HttpStatus.INTERNAL_SERVER_ERROR).when(responseMock).getStatus(); + doReturn(responseMock).when(builder).build(); + doReturn(builder).when(request).createResponseBuilder(any(HttpStatus.class)); + + HttpResponseMessage response = infoFunction.run(request, context); + + assertEquals(500, response.getStatus().value()); + } +} diff --git a/src/test/java/util/LogHandler.java b/src/test/java/util/LogHandler.java new file mode 100644 index 0000000..6adcbf6 --- /dev/null +++ b/src/test/java/util/LogHandler.java @@ -0,0 +1,32 @@ +package util; + +import java.util.logging.Handler; +import java.util.logging.LogRecord; + +public class LogHandler extends Handler { + + private final StringBuilder buffer = new StringBuilder(); + + @Override + public void publish(final LogRecord record) { + this.buffer.append(record.getMessage()); + } + + @Override + public void flush() { + // intentionally blank + } + + @Override + public void close() { + resetLogs(); + } + + public String getLogs() { + return this.buffer.toString(); + } + + public void resetLogs() { + this.buffer.setLength(0); + } +} \ No newline at end of file From 62dbe5d0e4f9f850967eda81c5e63dc80edd4be8 Mon Sep 17 00:00:00 2001 From: Francesco Parisi Date: Wed, 22 May 2024 02:24:13 +0200 Subject: [PATCH 02/12] NOD-892: [FDR] XML-to-JSON - Implementazione JUnit --- pom.xml | 12 ++++++++--- src/test/java/FdrXmlErrorTest.java | 8 +++++--- src/test/java/util/TestUtil.java | 18 ++++++++++++++++ src/test/resources/events/event_ok_1.json | 25 +++++++++++++++++++++++ 4 files changed, 57 insertions(+), 6 deletions(-) create mode 100644 src/test/java/util/TestUtil.java create mode 100644 src/test/resources/events/event_ok_1.json diff --git a/pom.xml b/pom.xml index 0c55281..f242e97 100644 --- a/pom.xml +++ b/pom.xml @@ -69,6 +69,12 @@ 4.3.1 test + + org.mockito + mockito-inline + 4.3.1 + test + @@ -364,9 +370,7 @@ org.openapitools openapi-generator-maven-plugin - - 6.6.0 - + 7.4.0 @@ -375,6 +379,8 @@ ${project.basedir}/src/main/openapi/openapi_internal.json java + false + false diff --git a/src/test/java/FdrXmlErrorTest.java b/src/test/java/FdrXmlErrorTest.java index 3552608..26060f7 100644 --- a/src/test/java/FdrXmlErrorTest.java +++ b/src/test/java/FdrXmlErrorTest.java @@ -6,16 +6,16 @@ import lombok.SneakyThrows; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; -import org.mockito.ArgumentCaptor; import org.mockito.Mock; +import org.mockito.Mockito; import org.mockito.Spy; import org.mockito.junit.jupiter.MockitoExtension; +import org.openapitools.client.api.InternalPspApi; import util.TestUtil; import java.util.*; import java.util.logging.Logger; -import static org.junit.jupiter.api.Assertions.assertEquals; import static org.mockito.Mockito.*; @ExtendWith(MockitoExtension.class) @@ -32,6 +32,7 @@ public class FdrXmlErrorTest { final HttpRequestMessage> request = mock(HttpRequestMessage.class); final HttpResponseMessage.Builder builder = mock(HttpResponseMessage.Builder.class); + @Test @SneakyThrows void runOk_withoutAdditionalProperties() { @@ -45,12 +46,13 @@ void runOk_withoutAdditionalProperties() { TableServiceClientBuilder tableServiceClientBuilder = mock(TableServiceClientBuilder.class); TableServiceClient tableServiceClient = mock(TableServiceClient.class); + when(tableServiceClientBuilder.connectionString(anyString())).thenReturn(tableServiceClientBuilder); when(tableServiceClientBuilder.buildClient()).thenReturn(tableServiceClient); OutputBinding> document = (OutputBinding>) mock(OutputBinding.class); // generating input - String eventInStringForm = "";//TestUtil.readStringFromFile("events/event_ok_1.json"); + String eventInStringForm = TestUtil.readStringFromFile("events/event_ok_1.json"); List events = new ArrayList<>(); events.add(eventInStringForm); Map[] properties = new HashMap[1]; diff --git a/src/test/java/util/TestUtil.java b/src/test/java/util/TestUtil.java new file mode 100644 index 0000000..d93552a --- /dev/null +++ b/src/test/java/util/TestUtil.java @@ -0,0 +1,18 @@ +package util; + +import lombok.experimental.UtilityClass; + +import java.io.File; +import java.io.IOException; +import java.nio.file.Files; +import java.util.Objects; + +@UtilityClass +public class TestUtil { + + public String readStringFromFile(String relativePath) throws IOException { + ClassLoader classLoader = TestUtil.class.getClassLoader(); + File file = new File(Objects.requireNonNull(classLoader.getResource(relativePath)).getPath()); + return Files.readString(file.toPath()); + } +} diff --git a/src/test/resources/events/event_ok_1.json b/src/test/resources/events/event_ok_1.json new file mode 100644 index 0000000..d8c4334 --- /dev/null +++ b/src/test/resources/events/event_ok_1.json @@ -0,0 +1,25 @@ +{ + "id": "uuid-001", + "version": "2", + "debtorPosition": { + "modelType": "2", + "noticeNumber": "302040000090000000", + "amount": "50.00" + }, + "creditor": { + "idPA": "77777777777", + "ccPost": "777777777777", + "idBrokerPA": "77777777777", + "idStation": "77777777777_01" + }, + "psp": { + "idPsp": "88888888888", + "idBrokerPsp": "88888888888", + "idChannel": "88888888888_01" + }, + "faultBean": { + "faultCode": "PPT_STAZIONE_INT_PA_ERRORE_RESPONSE", + "description": "EC service error at 2023-01-01T12:00:00", + "timestamp": "2023-12-12T18:34:39.860654" + } +} \ No newline at end of file From 09dbf703d20a7a6edd044a0dacde4f04c9a89b54 Mon Sep 17 00:00:00 2001 From: Francesco Parisi Date: Thu, 23 May 2024 02:37:08 +0200 Subject: [PATCH 03/12] NOD-892: [FDR] XML-to-JSON - Implementazione JUnit --- pom.xml | 4 +- src/test/java/FdrXmlToJsonTest.java | 301 ++++++++++++++++++ src/test/java/util/MockHttpURLConnection.java | 34 ++ src/test/java/util/MockURLStreamHandler.java | 20 ++ .../util/MockURLStreamHandlerFactory.java | 18 ++ .../nodoInviaFlussoRendicontazione.xml | 17 + 6 files changed, 392 insertions(+), 2 deletions(-) create mode 100644 src/test/java/FdrXmlToJsonTest.java create mode 100644 src/test/java/util/MockHttpURLConnection.java create mode 100644 src/test/java/util/MockURLStreamHandler.java create mode 100644 src/test/java/util/MockURLStreamHandlerFactory.java create mode 100644 src/test/resources/xmlcontent/nodoInviaFlussoRendicontazione.xml diff --git a/pom.xml b/pom.xml index f242e97..9e9b613 100644 --- a/pom.xml +++ b/pom.xml @@ -60,7 +60,7 @@ org.mockito mockito-core - 4.3.1 + 5.11.0 test @@ -72,7 +72,7 @@ org.mockito mockito-inline - 4.3.1 + 5.2.0 test diff --git a/src/test/java/FdrXmlToJsonTest.java b/src/test/java/FdrXmlToJsonTest.java new file mode 100644 index 0000000..9af3e80 --- /dev/null +++ b/src/test/java/FdrXmlToJsonTest.java @@ -0,0 +1,301 @@ +import com.azure.data.tables.TableClient; +import com.azure.data.tables.TableServiceClient; +import com.azure.storage.blob.BlobClient; +import com.azure.storage.blob.BlobContainerClient; +import com.microsoft.azure.functions.ExecutionContext; +import com.microsoft.azure.functions.HttpRequestMessage; +import com.microsoft.azure.functions.HttpResponseMessage; +import com.microsoft.azure.functions.HttpStatus; +import it.gov.pagopa.fdrxmltojson.FdrXmlToJson; +import lombok.SneakyThrows; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.Mock; +import org.mockito.Spy; +import org.mockito.junit.jupiter.MockitoExtension; +import org.openapitools.client.ApiException; +import org.openapitools.client.api.InternalPspApi; +import org.openapitools.client.model.ErrorResponse; +import org.openapitools.client.model.GenericResponse; +import util.TestUtil; + +import java.lang.reflect.Field; +import java.lang.reflect.Modifier; +import java.nio.charset.StandardCharsets; +import java.util.HashMap; +import java.util.List; +import java.util.Optional; +import java.util.UUID; +import java.util.logging.Logger; + +import static org.mockito.Mockito.*; + +@ExtendWith(MockitoExtension.class) +public class FdrXmlToJsonTest { + + @Spy + FdrXmlToJson fdrXmlToJson; + + @Mock + ExecutionContext context; + + private static final Logger logger = Logger.getLogger("FdrXmlToJson-test-logger"); + + final HttpRequestMessage> request = mock(HttpRequestMessage.class); + final HttpResponseMessage.Builder builder = mock(HttpResponseMessage.Builder.class); + + static void setFinalStatic(Field field, Object newValue) throws Exception { + field.setAccessible(true); + Field modifiersField = Field.class.getDeclaredField("modifiers"); + modifiersField.setAccessible(true); + modifiersField.setInt(field, field.getModifiers() & ~Modifier.FINAL); + field.set(null, newValue); + } + + @Test + @SneakyThrows + void runOk_withoutAdditionalProperties() { + // mocking objects + when(context.getLogger()).thenReturn(logger); + HttpResponseMessage responseMock = mock(HttpResponseMessage.class); + + doReturn(responseMock).when(builder).build(); + doReturn(builder).when(request).createResponseBuilder(any(HttpStatus.class)); + + TableServiceClient tableServiceClient = mock(TableServiceClient.class); + setFinalStatic(FdrXmlToJson.class.getDeclaredField("tableServiceClient"), tableServiceClient); + setFinalStatic(FdrXmlToJson.class.getDeclaredField("tableName"), "errors"); + + BlobContainerClient blobContainerClient = mock(BlobContainerClient.class); + BlobClient blobClient = mock(BlobClient.class); + when(blobContainerClient.getBlobClient(anyString())).thenReturn(blobClient); + setFinalStatic(FdrXmlToJson.class.getDeclaredField("blobContainerClient"), blobContainerClient); + + // generating input + String xml = TestUtil.readStringFromFile("xmlcontent/nodoInviaFlussoRendicontazione.xml"); + + InternalPspApi pspApi = mock(InternalPspApi.class); + setFinalStatic(FdrXmlToJson.class.getDeclaredField("pspApi"), pspApi); + setFinalStatic(FdrXmlToJson.class.getDeclaredField("addPaymentRequestPartitionSize"), "10"); + + GenericResponse genericResponse = new GenericResponse(); + genericResponse.setMessage("OK"); + when(pspApi.internalCreate(anyString(), anyString(), any())).thenReturn(genericResponse); + when(pspApi.internalAddPayment(anyString(), anyString(), any())).thenReturn(genericResponse); + when(pspApi.internalPublish(anyString(), anyString())).thenReturn(genericResponse); + + // execute logic + fdrXmlToJson.processNodoReEvent(xml.getBytes(StandardCharsets.UTF_8), UUID.randomUUID().toString(), context); + + verify(pspApi, times(1)).internalCreate(anyString(), anyString(), any()); + verify(pspApi, times(1)).internalAddPayment(anyString(), anyString(), any()); + verify(pspApi, times(1)).internalPublish(anyString(), anyString()); + } + + @Test + @SneakyThrows + void runKo_maxRetryCount() { + // mocking objects + when(context.getLogger()).thenReturn(logger); + HttpResponseMessage responseMock = mock(HttpResponseMessage.class); + + doReturn(responseMock).when(builder).build(); + doReturn(builder).when(request).createResponseBuilder(any(HttpStatus.class)); + + TableServiceClient tableServiceClient = mock(TableServiceClient.class); + setFinalStatic(FdrXmlToJson.class.getDeclaredField("tableServiceClient"), tableServiceClient); + setFinalStatic(FdrXmlToJson.class.getDeclaredField("tableName"), "errors"); + + BlobContainerClient blobContainerClient = mock(BlobContainerClient.class); + BlobClient blobClient = mock(BlobClient.class); + when(blobContainerClient.getBlobClient(anyString())).thenReturn(blobClient); + setFinalStatic(FdrXmlToJson.class.getDeclaredField("blobContainerClient"), blobContainerClient); + + // generating input + String xml = TestUtil.readStringFromFile("xmlcontent/nodoInviaFlussoRendicontazione.xml"); + + InternalPspApi pspApi = mock(InternalPspApi.class); + setFinalStatic(FdrXmlToJson.class.getDeclaredField("pspApi"), pspApi); + setFinalStatic(FdrXmlToJson.class.getDeclaredField("addPaymentRequestPartitionSize"), "10"); + + GenericResponse genericResponse = new GenericResponse(); + genericResponse.setMessage("OK"); + when(pspApi.internalCreate(anyString(), anyString(), any())).thenReturn(genericResponse); + when(pspApi.internalAddPayment(anyString(), anyString(), any())).thenReturn(genericResponse); + when(pspApi.internalPublish(anyString(), anyString())).thenReturn(genericResponse); + + setFinalStatic(FdrXmlToJson.class.getDeclaredField("MAX_RETRY_COUNT"), -1); + // execute logic + fdrXmlToJson.processNodoReEvent(xml.getBytes(StandardCharsets.UTF_8), UUID.randomUUID().toString(), context); + + verify(pspApi, times(1)).internalCreate(anyString(), anyString(), any()); + verify(pspApi, times(1)).internalAddPayment(anyString(), anyString(), any()); + verify(pspApi, times(1)).internalPublish(anyString(), anyString()); + } + + @Test + @SneakyThrows + void runKo_errorBlobContainerLoad() { + // mocking objects + when(context.getLogger()).thenReturn(logger); + HttpResponseMessage responseMock = mock(HttpResponseMessage.class); + + doReturn(responseMock).when(builder).build(); + doReturn(builder).when(request).createResponseBuilder(any(HttpStatus.class)); + + TableServiceClient tableServiceClient = mock(TableServiceClient.class); + setFinalStatic(FdrXmlToJson.class.getDeclaredField("tableServiceClient"), tableServiceClient); + setFinalStatic(FdrXmlToJson.class.getDeclaredField("tableName"), "errors"); + + // generating input + String xml = TestUtil.readStringFromFile("xmlcontent/nodoInviaFlussoRendicontazione.xml"); + + InternalPspApi pspApi = mock(InternalPspApi.class); + setFinalStatic(FdrXmlToJson.class.getDeclaredField("pspApi"), pspApi); + setFinalStatic(FdrXmlToJson.class.getDeclaredField("addPaymentRequestPartitionSize"), "10"); + + GenericResponse genericResponse = new GenericResponse(); + genericResponse.setMessage("OK"); + when(pspApi.internalCreate(anyString(), anyString(), any())).thenReturn(genericResponse); + when(pspApi.internalAddPayment(anyString(), anyString(), any())).thenReturn(genericResponse); + when(pspApi.internalPublish(anyString(), anyString())).thenReturn(genericResponse); + + setFinalStatic(FdrXmlToJson.class.getDeclaredField("MAX_RETRY_COUNT"), -1); + // execute logic + Assertions.assertThrows(Exception.class, + () -> fdrXmlToJson.processNodoReEvent(xml.getBytes(StandardCharsets.UTF_8), UUID.randomUUID().toString(), context)); + + verify(pspApi, times(1)).internalCreate(anyString(), anyString(), any()); + verify(pspApi, times(1)).internalAddPayment(anyString(), anyString(), any()); + verify(pspApi, times(1)).internalPublish(anyString(), anyString()); + } + + @Test + @SneakyThrows + void runKo_errorBlobContainerDelete() { + // mocking objects + when(context.getLogger()).thenReturn(logger); + HttpResponseMessage responseMock = mock(HttpResponseMessage.class); + + doReturn(responseMock).when(builder).build(); + doReturn(builder).when(request).createResponseBuilder(any(HttpStatus.class)); + + TableServiceClient tableServiceClient = mock(TableServiceClient.class); + TableClient tableClient = mock(TableClient.class); + when(tableServiceClient.getTableClient(anyString())).thenReturn(tableClient); + setFinalStatic(FdrXmlToJson.class.getDeclaredField("tableServiceClient"), tableServiceClient); + setFinalStatic(FdrXmlToJson.class.getDeclaredField("tableName"), "errors"); + + BlobContainerClient blobContainerClient = mock(BlobContainerClient.class); + setFinalStatic(FdrXmlToJson.class.getDeclaredField("blobContainerClient"), blobContainerClient); + + // generating input + String xml = TestUtil.readStringFromFile("xmlcontent/nodoInviaFlussoRendicontazione.xml"); + + InternalPspApi pspApi = mock(InternalPspApi.class); + setFinalStatic(FdrXmlToJson.class.getDeclaredField("pspApi"), pspApi); + setFinalStatic(FdrXmlToJson.class.getDeclaredField("addPaymentRequestPartitionSize"), "10"); + + GenericResponse genericResponse = new GenericResponse(); + genericResponse.setMessage("OK"); + when(pspApi.internalCreate(anyString(), anyString(), any())).thenReturn(genericResponse); + when(pspApi.internalAddPayment(anyString(), anyString(), any())).thenReturn(genericResponse); + when(pspApi.internalPublish(anyString(), anyString())).thenReturn(genericResponse); + + // execute logic + Assertions.assertThrows(Exception.class, + () -> fdrXmlToJson.processNodoReEvent(xml.getBytes(StandardCharsets.UTF_8), UUID.randomUUID().toString(), context)); + + verify(pspApi, times(1)).internalCreate(anyString(), anyString(), any()); + verify(pspApi, times(1)).internalAddPayment(anyString(), anyString(), any()); + verify(pspApi, times(1)).internalPublish(anyString(), anyString()); + } + + @Test + @SneakyThrows + void runKo_pspHttpError() { + // mocking objects + when(context.getLogger()).thenReturn(logger); + HttpResponseMessage responseMock = mock(HttpResponseMessage.class); + + doReturn(responseMock).when(builder).build(); + doReturn(builder).when(request).createResponseBuilder(any(HttpStatus.class)); + + TableServiceClient tableServiceClient = mock(TableServiceClient.class); + setFinalStatic(FdrXmlToJson.class.getDeclaredField("tableServiceClient"), tableServiceClient); + setFinalStatic(FdrXmlToJson.class.getDeclaredField("tableName"), "errors"); + + BlobContainerClient blobContainerClient = mock(BlobContainerClient.class); + BlobClient blobClient = mock(BlobClient.class); + when(blobContainerClient.getBlobClient(anyString())).thenReturn(blobClient); + setFinalStatic(FdrXmlToJson.class.getDeclaredField("blobContainerClient"), blobContainerClient); + + // generating input + String xml = TestUtil.readStringFromFile("xmlcontent/nodoInviaFlussoRendicontazione.xml"); + + InternalPspApi pspApi = mock(InternalPspApi.class); + setFinalStatic(FdrXmlToJson.class.getDeclaredField("pspApi"), pspApi); + setFinalStatic(FdrXmlToJson.class.getDeclaredField("addPaymentRequestPartitionSize"), "10"); + +// GenericResponse genericResponse = new GenericResponse(); +// genericResponse.setMessage("OK"); + when(pspApi.internalCreate(anyString(), anyString(), any())).thenReturn(null); +// when(pspApi.internalAddPayment(anyString(), anyString(), any())).thenReturn(genericResponse); +// when(pspApi.internalPublish(anyString(), anyString())).thenReturn(genericResponse); + + setFinalStatic(FdrXmlToJson.class.getDeclaredField("MAX_RETRY_COUNT"), -1); + // execute logic + fdrXmlToJson.processNodoReEvent(xml.getBytes(StandardCharsets.UTF_8), UUID.randomUUID().toString(), context); + + verify(pspApi, times(1)).internalCreate(anyString(), anyString(), any()); + verify(pspApi, times(1)).internalAddPayment(anyString(), anyString(), any()); + verify(pspApi, times(1)).internalPublish(anyString(), anyString()); + } + + @Test + @SneakyThrows + void runKo_pspHttpError2() { + // mocking objects + when(context.getLogger()).thenReturn(logger); + HttpResponseMessage responseMock = mock(HttpResponseMessage.class); + + doReturn(responseMock).when(builder).build(); + doReturn(builder).when(request).createResponseBuilder(any(HttpStatus.class)); + + TableServiceClient tableServiceClient = mock(TableServiceClient.class); + TableClient tableClient = mock(TableClient.class); + when(tableServiceClient.getTableClient(anyString())).thenReturn(tableClient); + setFinalStatic(FdrXmlToJson.class.getDeclaredField("tableServiceClient"), tableServiceClient); + setFinalStatic(FdrXmlToJson.class.getDeclaredField("tableName"), "errors"); + + BlobContainerClient blobContainerClient = mock(BlobContainerClient.class); + BlobClient blobClient = mock(BlobClient.class); + when(blobContainerClient.getBlobClient(anyString())).thenReturn(blobClient); + setFinalStatic(FdrXmlToJson.class.getDeclaredField("blobContainerClient"), blobContainerClient); + + // generating input + String xml = TestUtil.readStringFromFile("xmlcontent/nodoInviaFlussoRendicontazione.xml"); + + InternalPspApi pspApi = mock(InternalPspApi.class); + setFinalStatic(FdrXmlToJson.class.getDeclaredField("pspApi"), pspApi); + setFinalStatic(FdrXmlToJson.class.getDeclaredField("addPaymentRequestPartitionSize"), "10"); + +// GenericResponse genericResponse = new GenericResponse(); +// genericResponse.setMessage("OK"); + ErrorResponse errorResponse = new ErrorResponse(); + errorResponse.setErrorId(UUID.randomUUID().toString()); + errorResponse.setHttpStatusCode(400); + errorResponse.setAppErrorCode("400"); + errorResponse.setHttpStatusDescription(""); + when(pspApi.internalCreate(anyString(), anyString(), any())).thenThrow(new ApiException(400, "", new HashMap>(), "KO")); +// when(pspApi.internalAddPayment(anyString(), anyString(), any())).thenReturn(genericResponse); +// when(pspApi.internalPublish(anyString(), anyString())).thenReturn(genericResponse); + + // execute logic + fdrXmlToJson.processNodoReEvent(xml.getBytes(StandardCharsets.UTF_8), UUID.randomUUID().toString(), context); + + verify(pspApi, times(0)).internalCreate(anyString(), anyString(), any()); + } + +} diff --git a/src/test/java/util/MockHttpURLConnection.java b/src/test/java/util/MockHttpURLConnection.java new file mode 100644 index 0000000..a7dc3bf --- /dev/null +++ b/src/test/java/util/MockHttpURLConnection.java @@ -0,0 +1,34 @@ +package util; + +import java.io.IOException; +import java.net.HttpURLConnection; +import java.net.URL; + +public class MockHttpURLConnection extends HttpURLConnection { + + public MockHttpURLConnection(URL url) { + super(url); + } + + @Override + public int getResponseCode() { + return responseCode; + } + + public void setResponseCode(int responseCode) { + this.responseCode = responseCode; + } + + @Override + public void disconnect() { + } + + @Override + public boolean usingProxy() { + return false; + } + + @Override + public void connect() throws IOException { + } +} diff --git a/src/test/java/util/MockURLStreamHandler.java b/src/test/java/util/MockURLStreamHandler.java new file mode 100644 index 0000000..4564122 --- /dev/null +++ b/src/test/java/util/MockURLStreamHandler.java @@ -0,0 +1,20 @@ +package util; + +import java.io.IOException; +import java.net.URL; +import java.net.URLConnection; +import java.net.URLStreamHandler; + +public class MockURLStreamHandler extends URLStreamHandler { + + private MockHttpURLConnection mockHttpURLConnection; + + public MockURLStreamHandler(MockHttpURLConnection mockHttpURLConnection) { + this.mockHttpURLConnection = mockHttpURLConnection; + } + + @Override + protected URLConnection openConnection(URL url) throws IOException { + return this.mockHttpURLConnection; + } +} \ No newline at end of file diff --git a/src/test/java/util/MockURLStreamHandlerFactory.java b/src/test/java/util/MockURLStreamHandlerFactory.java new file mode 100644 index 0000000..c85571a --- /dev/null +++ b/src/test/java/util/MockURLStreamHandlerFactory.java @@ -0,0 +1,18 @@ +package util; + +import java.net.URLStreamHandler; +import java.net.URLStreamHandlerFactory; + +public class MockURLStreamHandlerFactory implements URLStreamHandlerFactory { + + private MockHttpURLConnection mockHttpURLConnection; + + public MockURLStreamHandlerFactory(MockHttpURLConnection mockHttpURLConnection) { + this.mockHttpURLConnection = mockHttpURLConnection; + } + + @Override + public URLStreamHandler createURLStreamHandler(String protocol) { + return new MockURLStreamHandler(this.mockHttpURLConnection); + } +} diff --git a/src/test/resources/xmlcontent/nodoInviaFlussoRendicontazione.xml b/src/test/resources/xmlcontent/nodoInviaFlussoRendicontazione.xml new file mode 100644 index 0000000..b3f36eb --- /dev/null +++ b/src/test/resources/xmlcontent/nodoInviaFlussoRendicontazione.xml @@ -0,0 +1,17 @@ + + + + 60000000001 + 60000000001 + 15376371009_04 + PLACEHOLDER + 15376371009 + 2024-05-2160000000001-17163317305 + 2024-05-21T01:00:59 + PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9InllcyI/PjxGbHVzc29SaXZlcnNhbWVudG8geG1sbnM9Imh0dHA6Ly93d3cuZGlnaXRwYS5nb3YuaXQvc2NoZW1hcy8yMDExL1BhZ2FtZW50aS8iPjx2ZXJzaW9uZU9nZ2V0dG8+MS4wPC92ZXJzaW9uZU9nZ2V0dG8+CiAgICA8aWRlbnRpZmljYXRpdm9GbHVzc28+MjAyNC0wNS0yMTYwMDAwMDAwMDAxLTE3MTYzMzE3MzA1PC9pZGVudGlmaWNhdGl2b0ZsdXNzbz4KICAgIDxkYXRhT3JhRmx1c3NvPjIwMjQtMDUtMjFUMDE6MDA6NTk8L2RhdGFPcmFGbHVzc28+CiAgICA8aWRlbnRpZmljYXRpdm9Vbml2b2NvUmVnb2xhbWVudG8+Qm9uaWZpY28gU0VQQS0wMzI2OC05OTk5OTk5OTk5PC9pZGVudGlmaWNhdGl2b1VuaXZvY29SZWdvbGFtZW50bz4KICAgIDxkYXRhUmVnb2xhbWVudG8+MjAyNC0wNS0yMTwvZGF0YVJlZ29sYW1lbnRvPgogICAgPGlzdGl0dXRvTWl0dGVudGU+CiAgICAgICAgPGlkZW50aWZpY2F0aXZvVW5pdm9jb01pdHRlbnRlPgogICAgICAgICAgICA8dGlwb0lkZW50aWZpY2F0aXZvVW5pdm9jbz5CPC90aXBvSWRlbnRpZmljYXRpdm9Vbml2b2NvPgogICAgICAgICAgICA8Y29kaWNlSWRlbnRpZmljYXRpdm9Vbml2b2NvPlNFTEJJVDJCPC9jb2RpY2VJZGVudGlmaWNhdGl2b1VuaXZvY28+CiAgICAgICAgPC9pZGVudGlmaWNhdGl2b1VuaXZvY29NaXR0ZW50ZT4KICAgICAgICA8ZGVub21pbmF6aW9uZU1pdHRlbnRlPkJhbmNhIFNlbGxhPC9kZW5vbWluYXppb25lTWl0dGVudGU+CiAgICA8L2lzdGl0dXRvTWl0dGVudGU+CiAgICA8aXN0aXR1dG9SaWNldmVudGU+CiAgICAgICAgPGlkZW50aWZpY2F0aXZvVW5pdm9jb1JpY2V2ZW50ZT4KICAgICAgICAgICAgPHRpcG9JZGVudGlmaWNhdGl2b1VuaXZvY28+RzwvdGlwb0lkZW50aWZpY2F0aXZvVW5pdm9jbz4KICAgICAgICAgICAgPGNvZGljZUlkZW50aWZpY2F0aXZvVW5pdm9jbz45OTk5OTk5OTk5OTwvY29kaWNlSWRlbnRpZmljYXRpdm9Vbml2b2NvPgogICAgICAgIDwvaWRlbnRpZmljYXRpdm9Vbml2b2NvUmljZXZlbnRlPgogICAgPC9pc3RpdHV0b1JpY2V2ZW50ZT4KICAgIDxudW1lcm9Ub3RhbGVQYWdhbWVudGk+MTwvbnVtZXJvVG90YWxlUGFnYW1lbnRpPgogICAgPGltcG9ydG9Ub3RhbGVQYWdhbWVudGk+MTAuMDA8L2ltcG9ydG9Ub3RhbGVQYWdhbWVudGk+CiAgICA8ZGF0aVNpbmdvbGlQYWdhbWVudGk+CiAgICAgICAgPGlkZW50aWZpY2F0aXZvVW5pdm9jb1ZlcnNhbWVudG8+JHt1dGlscy5zdHJpbmdHZW4oMTQpfTwvaWRlbnRpZmljYXRpdm9Vbml2b2NvVmVyc2FtZW50bz4KICAgICAgICA8aWRlbnRpZmljYXRpdm9Vbml2b2NvUmlzY29zc2lvbmU+JHt1dGlscy5zdHJpbmdHZW4oMTApfTwvaWRlbnRpZmljYXRpdm9Vbml2b2NvUmlzY29zc2lvbmU+CiAgICAgICAgPGluZGljZURhdGlTaW5nb2xvUGFnYW1lbnRvPjE8L2luZGljZURhdGlTaW5nb2xvUGFnYW1lbnRvPgogICAgICAgIDxzaW5nb2xvSW1wb3J0b1BhZ2F0bz4xMC4wMDwvc2luZ29sb0ltcG9ydG9QYWdhdG8+CiAgICAgICAgPGNvZGljZUVzaXRvU2luZ29sb1BhZ2FtZW50bz45PC9jb2RpY2VFc2l0b1NpbmdvbG9QYWdhbWVudG8+CiAgICAgICAgPGRhdGFFc2l0b1NpbmdvbG9QYWdhbWVudG8+MjAxNy0wNy0xNzwvZGF0YUVzaXRvU2luZ29sb1BhZ2FtZW50bz4KICAgIDwvZGF0aVNpbmdvbGlQYWdhbWVudGk+CjwvRmx1c3NvUml2ZXJzYW1lbnRvPg== + + + \ No newline at end of file From 2960f7cb8812bab5c3b59ae60599fb6ff7caf9ad Mon Sep 17 00:00:00 2001 From: Francesco Parisi Date: Thu, 23 May 2024 15:50:48 +0200 Subject: [PATCH 04/12] NOD-892: [FDR] XML-to-JSON - Implementazione JUnit --- .../gov/pagopa/fdrxmltojson/FdrXmlError.java | 2 - src/test/java/FdrXmlErrorTest.java | 130 ++++++++++++------ src/test/java/FdrXmlToJsonTest.java | 67 ++++++--- 3 files changed, 135 insertions(+), 64 deletions(-) diff --git a/src/main/java/it/gov/pagopa/fdrxmltojson/FdrXmlError.java b/src/main/java/it/gov/pagopa/fdrxmltojson/FdrXmlError.java index 7761073..d2ebb3a 100644 --- a/src/main/java/it/gov/pagopa/fdrxmltojson/FdrXmlError.java +++ b/src/main/java/it/gov/pagopa/fdrxmltojson/FdrXmlError.java @@ -19,8 +19,6 @@ import java.time.Instant; import java.util.Iterator; -import java.util.LinkedHashMap; -import java.util.Map; import java.util.Optional; import java.util.logging.Level; import java.util.logging.Logger; diff --git a/src/test/java/FdrXmlErrorTest.java b/src/test/java/FdrXmlErrorTest.java index 26060f7..011cb6e 100644 --- a/src/test/java/FdrXmlErrorTest.java +++ b/src/test/java/FdrXmlErrorTest.java @@ -1,18 +1,25 @@ +import com.azure.core.http.rest.PagedIterable; +import com.azure.data.tables.TableClient; import com.azure.data.tables.TableServiceClient; import com.azure.data.tables.TableServiceClientBuilder; +import com.azure.data.tables.models.TableEntity; +import com.azure.storage.blob.BlobClient; +import com.azure.storage.blob.BlobContainerClient; import com.fasterxml.jackson.databind.ObjectMapper; import com.microsoft.azure.functions.*; import it.gov.pagopa.fdrxmltojson.FdrXmlError; +import it.gov.pagopa.fdrxmltojson.FdrXmlToJson; import lombok.SneakyThrows; +import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.Mock; -import org.mockito.Mockito; import org.mockito.Spy; import org.mockito.junit.jupiter.MockitoExtension; -import org.openapitools.client.api.InternalPspApi; import util.TestUtil; +import java.lang.reflect.Field; +import java.lang.reflect.Modifier; import java.util.*; import java.util.logging.Logger; @@ -32,46 +39,85 @@ public class FdrXmlErrorTest { final HttpRequestMessage> request = mock(HttpRequestMessage.class); final HttpResponseMessage.Builder builder = mock(HttpResponseMessage.Builder.class); - - @Test - @SneakyThrows - void runOk_withoutAdditionalProperties() { - // mocking objects - when(context.getLogger()).thenReturn(logger); - HttpResponseMessage responseMock = mock(HttpResponseMessage.class); - - doReturn(HttpStatus.OK).when(responseMock).getStatus(); - doReturn(responseMock).when(builder).build(); - doReturn(builder).when(request).createResponseBuilder(any(HttpStatus.class)); - - TableServiceClientBuilder tableServiceClientBuilder = mock(TableServiceClientBuilder.class); - TableServiceClient tableServiceClient = mock(TableServiceClient.class); - when(tableServiceClientBuilder.connectionString(anyString())).thenReturn(tableServiceClientBuilder); - when(tableServiceClientBuilder.buildClient()).thenReturn(tableServiceClient); - - OutputBinding> document = (OutputBinding>) mock(OutputBinding.class); - - // generating input - String eventInStringForm = TestUtil.readStringFromFile("events/event_ok_1.json"); - List events = new ArrayList<>(); - events.add(eventInStringForm); - Map[] properties = new HashMap[1]; - properties[0] = new HashMap<>(); - - // generating expected output - Map expectedEvent = new ObjectMapper().readValue(eventInStringForm, Map.class); - expectedEvent.put("PartitionKey", "20231212-77777777777-88888888888"); -// ((Map)expectedEvent.get(Constants.FAULTBEAN_EVENT_FIELD)).put(Constants.TIMESTAMP_EVENT_FIELD, 1702406079); -// ((Map)expectedEvent.get(Constants.FAULTBEAN_EVENT_FIELD)).put(Constants.DATE_TIME_EVENT_FIELD, "2023-12-12T18:34:39.860654"); - List expectedEventsToPersist = List.of(expectedEvent); - - // execute logic - fdrXmlError.run(request, context); - -// ArgumentCaptor> captor = ArgumentCaptor.forClass(List.class); -// verify(document).setValue(captor.capture()); -// List actualEventsToPersist = captor.getValue(); -// assertEquals(convertWithStream(expectedEventsToPersist), convertWithStream(actualEventsToPersist)); + static void setFinalStatic(Field field, Object newValue) throws Exception { + field.setAccessible(true); + Field modifiersField = Field.class.getDeclaredField("modifiers"); + modifiersField.setAccessible(true); + modifiersField.setInt(field, field.getModifiers() & ~Modifier.FINAL); + field.set(null, newValue); } +// @Test +// @SneakyThrows +// void runOk() { +// // mocking objects +// when(context.getLogger()).thenReturn(logger); +// HttpResponseMessage responseMock = mock(HttpResponseMessage.class); +// +// doReturn(responseMock).when(builder).build(); +// doReturn(builder).when(request).createResponseBuilder(any(HttpStatus.class)); +// +// TableServiceClient tableServiceClient = mock(TableServiceClient.class); +//// TableClient tableClient = mock(TableClient.class); +// TableEntity tableEntity = mock(TableEntity.class); +// PagedIterable pagedIterable = mock(PagedIterable.class); +//// when(tableServiceClient.getTableClient(anyString())).thenReturn(tableClient); +//// when(tableClient.getEntity(anyString(), anyString())).thenReturn(tableEntity); +//// when(tableClient.listEntities().iterator()).thenReturn(pagedIterable.iterator()); +// setFinalStatic(FdrXmlError.class.getDeclaredField("tableServiceClient"), tableServiceClient); +// setFinalStatic(FdrXmlError.class.getDeclaredField("tableName"), "errors"); +// +// +// +// BlobContainerClient blobContainerClient = mock(BlobContainerClient.class); +// BlobClient blobClient = mock(BlobClient.class); +// when(blobContainerClient.getBlobClient(anyString())).thenReturn(blobClient); +// setFinalStatic(FdrXmlError.class.getDeclaredField("blobContainerClient"), blobContainerClient); +// +// // generating input +// String eventInStringForm = TestUtil.readStringFromFile("events/event_ok_1.json"); +// List events = new ArrayList<>(); +// events.add(eventInStringForm); +// Map[] properties = new HashMap[1]; +// properties[0] = new HashMap<>(); +// +//// doReturn("2024-01-01").when(request.getQueryParameters().get("partitionKey")); +//// doReturn("1").when(request.getQueryParameters().get("rowKey")); +//// doReturn("true").when(request.getQueryParameters().get("deleteOnlyByKey")); +// +// // execute logic +// fdrXmlError.run(request, context); +// } +// +// @Test +// @SneakyThrows +// void runKo_1() { +// // mocking objects +// when(context.getLogger()).thenReturn(logger); +// HttpResponseMessage responseMock = mock(HttpResponseMessage.class); +// +// doReturn(responseMock).when(builder).build(); +// doReturn(builder).when(request).createResponseBuilder(any(HttpStatus.class)); +// +// TableServiceClient tableServiceClient = mock(TableServiceClient.class); +// setFinalStatic(FdrXmlError.class.getDeclaredField("tableServiceClient"), tableServiceClient); +// setFinalStatic(FdrXmlError.class.getDeclaredField("tableName"), "errors"); +// +// BlobContainerClient blobContainerClient = mock(BlobContainerClient.class); +// BlobClient blobClient = mock(BlobClient.class); +// when(blobContainerClient.getBlobClient(anyString())).thenReturn(blobClient); +// setFinalStatic(FdrXmlError.class.getDeclaredField("blobContainerClient"), blobContainerClient); +// +// // generating input +// String eventInStringForm = TestUtil.readStringFromFile("events/event_ok_1.json"); +// List events = new ArrayList<>(); +// events.add(eventInStringForm); +// Map[] properties = new HashMap[1]; +// properties[0] = new HashMap<>(); +// +// // execute logic +// Assertions.assertThrows(Exception.class, +// () -> fdrXmlError.run(request, context)); +// } + } diff --git a/src/test/java/FdrXmlToJsonTest.java b/src/test/java/FdrXmlToJsonTest.java index 9af3e80..8a042e5 100644 --- a/src/test/java/FdrXmlToJsonTest.java +++ b/src/test/java/FdrXmlToJsonTest.java @@ -6,6 +6,7 @@ import com.microsoft.azure.functions.HttpRequestMessage; import com.microsoft.azure.functions.HttpResponseMessage; import com.microsoft.azure.functions.HttpStatus; +import it.gov.pagopa.fdrxmltojson.AppException; import it.gov.pagopa.fdrxmltojson.FdrXmlToJson; import lombok.SneakyThrows; import org.junit.jupiter.api.Assertions; @@ -20,11 +21,11 @@ import org.openapitools.client.model.GenericResponse; import util.TestUtil; +import java.io.IOException; import java.lang.reflect.Field; import java.lang.reflect.Modifier; import java.nio.charset.StandardCharsets; import java.util.HashMap; -import java.util.List; import java.util.Optional; import java.util.UUID; import java.util.logging.Logger; @@ -238,11 +239,7 @@ void runKo_pspHttpError() { setFinalStatic(FdrXmlToJson.class.getDeclaredField("pspApi"), pspApi); setFinalStatic(FdrXmlToJson.class.getDeclaredField("addPaymentRequestPartitionSize"), "10"); -// GenericResponse genericResponse = new GenericResponse(); -// genericResponse.setMessage("OK"); when(pspApi.internalCreate(anyString(), anyString(), any())).thenReturn(null); -// when(pspApi.internalAddPayment(anyString(), anyString(), any())).thenReturn(genericResponse); -// when(pspApi.internalPublish(anyString(), anyString())).thenReturn(genericResponse); setFinalStatic(FdrXmlToJson.class.getDeclaredField("MAX_RETRY_COUNT"), -1); // execute logic @@ -255,7 +252,7 @@ void runKo_pspHttpError() { @Test @SneakyThrows - void runKo_pspHttpError2() { + void runKo_pspErrorResponse() { // mocking objects when(context.getLogger()).thenReturn(logger); HttpResponseMessage responseMock = mock(HttpResponseMessage.class); @@ -270,8 +267,6 @@ void runKo_pspHttpError2() { setFinalStatic(FdrXmlToJson.class.getDeclaredField("tableName"), "errors"); BlobContainerClient blobContainerClient = mock(BlobContainerClient.class); - BlobClient blobClient = mock(BlobClient.class); - when(blobContainerClient.getBlobClient(anyString())).thenReturn(blobClient); setFinalStatic(FdrXmlToJson.class.getDeclaredField("blobContainerClient"), blobContainerClient); // generating input @@ -281,21 +276,53 @@ void runKo_pspHttpError2() { setFinalStatic(FdrXmlToJson.class.getDeclaredField("pspApi"), pspApi); setFinalStatic(FdrXmlToJson.class.getDeclaredField("addPaymentRequestPartitionSize"), "10"); -// GenericResponse genericResponse = new GenericResponse(); -// genericResponse.setMessage("OK"); - ErrorResponse errorResponse = new ErrorResponse(); - errorResponse.setErrorId(UUID.randomUUID().toString()); - errorResponse.setHttpStatusCode(400); - errorResponse.setAppErrorCode("400"); - errorResponse.setHttpStatusDescription(""); - when(pspApi.internalCreate(anyString(), anyString(), any())).thenThrow(new ApiException(400, "", new HashMap>(), "KO")); -// when(pspApi.internalAddPayment(anyString(), anyString(), any())).thenReturn(genericResponse); -// when(pspApi.internalPublish(anyString(), anyString())).thenReturn(genericResponse); + mockStatic(ErrorResponse.class); + when(ErrorResponse.fromJson(anyString())).thenThrow(IOException.class); + + when(pspApi.internalCreate(anyString(), anyString(), any())).thenThrow(new ApiException(400, "", new HashMap<>(), "{ \"")); // execute logic - fdrXmlToJson.processNodoReEvent(xml.getBytes(StandardCharsets.UTF_8), UUID.randomUUID().toString(), context); + Assertions.assertThrows(AppException.class, + () -> fdrXmlToJson.processNodoReEvent(xml.getBytes(StandardCharsets.UTF_8), UUID.randomUUID().toString(), context)); + + verify(pspApi, times(1)).internalCreate(anyString(), anyString(), any()); + verify(pspApi, times(0)).internalAddPayment(anyString(), anyString(), any()); + } + + @Test + @SneakyThrows + void runKo_pspErrorResponseMalformed() { + // mocking objects + when(context.getLogger()).thenReturn(logger); + HttpResponseMessage responseMock = mock(HttpResponseMessage.class); + + doReturn(responseMock).when(builder).build(); + doReturn(builder).when(request).createResponseBuilder(any(HttpStatus.class)); + + TableServiceClient tableServiceClient = mock(TableServiceClient.class); + TableClient tableClient = mock(TableClient.class); + when(tableServiceClient.getTableClient(anyString())).thenReturn(tableClient); + setFinalStatic(FdrXmlToJson.class.getDeclaredField("tableServiceClient"), tableServiceClient); + setFinalStatic(FdrXmlToJson.class.getDeclaredField("tableName"), "errors"); + + BlobContainerClient blobContainerClient = mock(BlobContainerClient.class); + setFinalStatic(FdrXmlToJson.class.getDeclaredField("blobContainerClient"), blobContainerClient); + + // generating input + String xml = TestUtil.readStringFromFile("xmlcontent/nodoInviaFlussoRendicontazione.xml"); - verify(pspApi, times(0)).internalCreate(anyString(), anyString(), any()); + InternalPspApi pspApi = mock(InternalPspApi.class); + setFinalStatic(FdrXmlToJson.class.getDeclaredField("pspApi"), pspApi); + setFinalStatic(FdrXmlToJson.class.getDeclaredField("addPaymentRequestPartitionSize"), "10"); + + when(pspApi.internalCreate(anyString(), anyString(), any())).thenThrow(new ApiException(400, "", new HashMap<>(), "{ \"error\": \"OK\" }")); + + // execute logic + Assertions.assertThrows(AppException.class, + () -> fdrXmlToJson.processNodoReEvent(xml.getBytes(StandardCharsets.UTF_8), UUID.randomUUID().toString(), context)); + + verify(pspApi, times(1)).internalCreate(anyString(), anyString(), any()); + verify(pspApi, times(0)).internalAddPayment(anyString(), anyString(), any()); } } From a9f5ff1f9e10eee2b007c8215f8e4217d6dbf9b7 Mon Sep 17 00:00:00 2001 From: Francesco Parisi Date: Thu, 23 May 2024 16:31:03 +0200 Subject: [PATCH 05/12] NOD-892: [FDR] XML-to-JSON - Implementazione JUnit --- pom.xml | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index 9e9b613..9e0f33e 100644 --- a/pom.xml +++ b/pom.xml @@ -222,6 +222,7 @@ 3.12.0 + @@ -309,7 +310,7 @@ org.apache.maven.plugins maven-surefire-plugin - 2.22.0 + 2.19.1 @@ -321,7 +322,7 @@ org.junit.jupiter junit-jupiter-engine - 5.0.3 + 5.0.1 From 0bf106991ad9b04d661a8f073f6cddba56bdc0bc Mon Sep 17 00:00:00 2001 From: Francesco Parisi Date: Thu, 23 May 2024 16:44:59 +0200 Subject: [PATCH 06/12] NOD-892: [FDR] XML-to-JSON - Implementazione JUnit --- src/test/java/FdrXmlToJsonTest.java | 32 +---------------------------- 1 file changed, 1 insertion(+), 31 deletions(-) diff --git a/src/test/java/FdrXmlToJsonTest.java b/src/test/java/FdrXmlToJsonTest.java index 8a042e5..60e3e40 100644 --- a/src/test/java/FdrXmlToJsonTest.java +++ b/src/test/java/FdrXmlToJsonTest.java @@ -10,6 +10,7 @@ import it.gov.pagopa.fdrxmltojson.FdrXmlToJson; import lombok.SneakyThrows; import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.Mock; @@ -43,9 +44,6 @@ public class FdrXmlToJsonTest { private static final Logger logger = Logger.getLogger("FdrXmlToJson-test-logger"); - final HttpRequestMessage> request = mock(HttpRequestMessage.class); - final HttpResponseMessage.Builder builder = mock(HttpResponseMessage.Builder.class); - static void setFinalStatic(Field field, Object newValue) throws Exception { field.setAccessible(true); Field modifiersField = Field.class.getDeclaredField("modifiers"); @@ -59,10 +57,6 @@ static void setFinalStatic(Field field, Object newValue) throws Exception { void runOk_withoutAdditionalProperties() { // mocking objects when(context.getLogger()).thenReturn(logger); - HttpResponseMessage responseMock = mock(HttpResponseMessage.class); - - doReturn(responseMock).when(builder).build(); - doReturn(builder).when(request).createResponseBuilder(any(HttpStatus.class)); TableServiceClient tableServiceClient = mock(TableServiceClient.class); setFinalStatic(FdrXmlToJson.class.getDeclaredField("tableServiceClient"), tableServiceClient); @@ -99,10 +93,6 @@ void runOk_withoutAdditionalProperties() { void runKo_maxRetryCount() { // mocking objects when(context.getLogger()).thenReturn(logger); - HttpResponseMessage responseMock = mock(HttpResponseMessage.class); - - doReturn(responseMock).when(builder).build(); - doReturn(builder).when(request).createResponseBuilder(any(HttpStatus.class)); TableServiceClient tableServiceClient = mock(TableServiceClient.class); setFinalStatic(FdrXmlToJson.class.getDeclaredField("tableServiceClient"), tableServiceClient); @@ -140,10 +130,6 @@ void runKo_maxRetryCount() { void runKo_errorBlobContainerLoad() { // mocking objects when(context.getLogger()).thenReturn(logger); - HttpResponseMessage responseMock = mock(HttpResponseMessage.class); - - doReturn(responseMock).when(builder).build(); - doReturn(builder).when(request).createResponseBuilder(any(HttpStatus.class)); TableServiceClient tableServiceClient = mock(TableServiceClient.class); setFinalStatic(FdrXmlToJson.class.getDeclaredField("tableServiceClient"), tableServiceClient); @@ -177,10 +163,6 @@ void runKo_errorBlobContainerLoad() { void runKo_errorBlobContainerDelete() { // mocking objects when(context.getLogger()).thenReturn(logger); - HttpResponseMessage responseMock = mock(HttpResponseMessage.class); - - doReturn(responseMock).when(builder).build(); - doReturn(builder).when(request).createResponseBuilder(any(HttpStatus.class)); TableServiceClient tableServiceClient = mock(TableServiceClient.class); TableClient tableClient = mock(TableClient.class); @@ -218,10 +200,6 @@ void runKo_errorBlobContainerDelete() { void runKo_pspHttpError() { // mocking objects when(context.getLogger()).thenReturn(logger); - HttpResponseMessage responseMock = mock(HttpResponseMessage.class); - - doReturn(responseMock).when(builder).build(); - doReturn(builder).when(request).createResponseBuilder(any(HttpStatus.class)); TableServiceClient tableServiceClient = mock(TableServiceClient.class); setFinalStatic(FdrXmlToJson.class.getDeclaredField("tableServiceClient"), tableServiceClient); @@ -255,10 +233,6 @@ void runKo_pspHttpError() { void runKo_pspErrorResponse() { // mocking objects when(context.getLogger()).thenReturn(logger); - HttpResponseMessage responseMock = mock(HttpResponseMessage.class); - - doReturn(responseMock).when(builder).build(); - doReturn(builder).when(request).createResponseBuilder(any(HttpStatus.class)); TableServiceClient tableServiceClient = mock(TableServiceClient.class); TableClient tableClient = mock(TableClient.class); @@ -294,10 +268,6 @@ void runKo_pspErrorResponse() { void runKo_pspErrorResponseMalformed() { // mocking objects when(context.getLogger()).thenReturn(logger); - HttpResponseMessage responseMock = mock(HttpResponseMessage.class); - - doReturn(responseMock).when(builder).build(); - doReturn(builder).when(request).createResponseBuilder(any(HttpStatus.class)); TableServiceClient tableServiceClient = mock(TableServiceClient.class); TableClient tableClient = mock(TableClient.class); From 107dafff0d2bb8d853e606328124c8fd24c92648 Mon Sep 17 00:00:00 2001 From: Francesco Parisi Date: Thu, 23 May 2024 16:56:04 +0200 Subject: [PATCH 07/12] NOD-892: [FDR] XML-to-JSON - Implementazione JUnit --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 9e0f33e..2c8ade9 100644 --- a/pom.xml +++ b/pom.xml @@ -60,7 +60,7 @@ org.mockito mockito-core - 5.11.0 + 4.3.1 test From 304d6e696254cf6f9a77d0783937c7afac144f51 Mon Sep 17 00:00:00 2001 From: Francesco Parisi Date: Thu, 23 May 2024 17:05:50 +0200 Subject: [PATCH 08/12] NOD-892: [FDR] XML-to-JSON - Implementazione JUnit --- src/test/java/FdrXmlErrorTest.java | 25 +++++-------------------- src/test/java/FdrXmlToJsonTest.java | 9 --------- 2 files changed, 5 insertions(+), 29 deletions(-) diff --git a/src/test/java/FdrXmlErrorTest.java b/src/test/java/FdrXmlErrorTest.java index 011cb6e..d865a77 100644 --- a/src/test/java/FdrXmlErrorTest.java +++ b/src/test/java/FdrXmlErrorTest.java @@ -1,29 +1,17 @@ -import com.azure.core.http.rest.PagedIterable; -import com.azure.data.tables.TableClient; -import com.azure.data.tables.TableServiceClient; -import com.azure.data.tables.TableServiceClientBuilder; -import com.azure.data.tables.models.TableEntity; -import com.azure.storage.blob.BlobClient; -import com.azure.storage.blob.BlobContainerClient; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.microsoft.azure.functions.*; +import com.microsoft.azure.functions.ExecutionContext; +import com.microsoft.azure.functions.HttpRequestMessage; +import com.microsoft.azure.functions.HttpResponseMessage; import it.gov.pagopa.fdrxmltojson.FdrXmlError; -import it.gov.pagopa.fdrxmltojson.FdrXmlToJson; -import lombok.SneakyThrows; -import org.junit.jupiter.api.Assertions; -import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.Mock; import org.mockito.Spy; import org.mockito.junit.jupiter.MockitoExtension; -import util.TestUtil; import java.lang.reflect.Field; -import java.lang.reflect.Modifier; -import java.util.*; +import java.util.Optional; import java.util.logging.Logger; -import static org.mockito.Mockito.*; +import static org.mockito.Mockito.mock; @ExtendWith(MockitoExtension.class) public class FdrXmlErrorTest { @@ -41,9 +29,6 @@ public class FdrXmlErrorTest { static void setFinalStatic(Field field, Object newValue) throws Exception { field.setAccessible(true); - Field modifiersField = Field.class.getDeclaredField("modifiers"); - modifiersField.setAccessible(true); - modifiersField.setInt(field, field.getModifiers() & ~Modifier.FINAL); field.set(null, newValue); } diff --git a/src/test/java/FdrXmlToJsonTest.java b/src/test/java/FdrXmlToJsonTest.java index 60e3e40..104bf82 100644 --- a/src/test/java/FdrXmlToJsonTest.java +++ b/src/test/java/FdrXmlToJsonTest.java @@ -3,14 +3,10 @@ import com.azure.storage.blob.BlobClient; import com.azure.storage.blob.BlobContainerClient; import com.microsoft.azure.functions.ExecutionContext; -import com.microsoft.azure.functions.HttpRequestMessage; -import com.microsoft.azure.functions.HttpResponseMessage; -import com.microsoft.azure.functions.HttpStatus; import it.gov.pagopa.fdrxmltojson.AppException; import it.gov.pagopa.fdrxmltojson.FdrXmlToJson; import lombok.SneakyThrows; import org.junit.jupiter.api.Assertions; -import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.Mock; @@ -24,10 +20,8 @@ import java.io.IOException; import java.lang.reflect.Field; -import java.lang.reflect.Modifier; import java.nio.charset.StandardCharsets; import java.util.HashMap; -import java.util.Optional; import java.util.UUID; import java.util.logging.Logger; @@ -46,9 +40,6 @@ public class FdrXmlToJsonTest { static void setFinalStatic(Field field, Object newValue) throws Exception { field.setAccessible(true); - Field modifiersField = Field.class.getDeclaredField("modifiers"); - modifiersField.setAccessible(true); - modifiersField.setInt(field, field.getModifiers() & ~Modifier.FINAL); field.set(null, newValue); } From fa714168a6df5a1f538cfa8c075f22012c90fd81 Mon Sep 17 00:00:00 2001 From: Francesco Parisi Date: Thu, 23 May 2024 17:57:06 +0200 Subject: [PATCH 09/12] NOD-892: [FDR] XML-to-JSON - Implementazione JUnit --- src/test/java/FdrXmlToJsonTest.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/test/java/FdrXmlToJsonTest.java b/src/test/java/FdrXmlToJsonTest.java index 104bf82..92e3091 100644 --- a/src/test/java/FdrXmlToJsonTest.java +++ b/src/test/java/FdrXmlToJsonTest.java @@ -20,6 +20,7 @@ import java.io.IOException; import java.lang.reflect.Field; +import java.lang.reflect.Modifier; import java.nio.charset.StandardCharsets; import java.util.HashMap; import java.util.UUID; @@ -40,9 +41,14 @@ public class FdrXmlToJsonTest { static void setFinalStatic(Field field, Object newValue) throws Exception { field.setAccessible(true); + Field modifiersField = Field.class.getDeclaredField("modifiers"); + modifiersField.setAccessible(true); + modifiersField.setInt(field, field.getModifiers() & ~Modifier.FINAL); field.set(null, newValue); } + + @Test @SneakyThrows void runOk_withoutAdditionalProperties() { From 39d1de626c5e79f7101963c5f1293cfed8f892d6 Mon Sep 17 00:00:00 2001 From: Francesco Parisi Date: Thu, 23 May 2024 18:24:27 +0200 Subject: [PATCH 10/12] NOD-892: [FDR] XML-to-JSON - Implementazione JUnit --- pom.xml | 6 +++ src/test/java/FdrXmlToJsonTest.java | 77 +++++++++++++++-------------- 2 files changed, 46 insertions(+), 37 deletions(-) diff --git a/pom.xml b/pom.xml index 2c8ade9..c97fd2b 100644 --- a/pom.xml +++ b/pom.xml @@ -75,6 +75,12 @@ 5.2.0 test + + org.powermock + powermock-reflect + 2.0.9 + test + diff --git a/src/test/java/FdrXmlToJsonTest.java b/src/test/java/FdrXmlToJsonTest.java index 92e3091..b7f1def 100644 --- a/src/test/java/FdrXmlToJsonTest.java +++ b/src/test/java/FdrXmlToJsonTest.java @@ -16,6 +16,7 @@ import org.openapitools.client.api.InternalPspApi; import org.openapitools.client.model.ErrorResponse; import org.openapitools.client.model.GenericResponse; +import org.powermock.reflect.Whitebox; import util.TestUtil; import java.io.IOException; @@ -56,20 +57,22 @@ void runOk_withoutAdditionalProperties() { when(context.getLogger()).thenReturn(logger); TableServiceClient tableServiceClient = mock(TableServiceClient.class); - setFinalStatic(FdrXmlToJson.class.getDeclaredField("tableServiceClient"), tableServiceClient); - setFinalStatic(FdrXmlToJson.class.getDeclaredField("tableName"), "errors"); + Whitebox.setInternalState(FdrXmlToJson.class, "tableServiceClient", tableServiceClient); +// setFinalStatic(FdrXmlToJson.class.getDeclaredField("tableServiceClient"), tableServiceClient); + Whitebox.setInternalState(FdrXmlToJson.class, "tableName", "errors"); +// setFinalStatic(FdrXmlToJson.class.getDeclaredField("tableName"), "errors"); BlobContainerClient blobContainerClient = mock(BlobContainerClient.class); BlobClient blobClient = mock(BlobClient.class); when(blobContainerClient.getBlobClient(anyString())).thenReturn(blobClient); - setFinalStatic(FdrXmlToJson.class.getDeclaredField("blobContainerClient"), blobContainerClient); + Whitebox.setInternalState(FdrXmlToJson.class, "blobContainerClient", blobContainerClient); // generating input String xml = TestUtil.readStringFromFile("xmlcontent/nodoInviaFlussoRendicontazione.xml"); InternalPspApi pspApi = mock(InternalPspApi.class); - setFinalStatic(FdrXmlToJson.class.getDeclaredField("pspApi"), pspApi); - setFinalStatic(FdrXmlToJson.class.getDeclaredField("addPaymentRequestPartitionSize"), "10"); + Whitebox.setInternalState(FdrXmlToJson.class, "pspApi", pspApi); + Whitebox.setInternalState(FdrXmlToJson.class, "addPaymentRequestPartitionSize", "10"); GenericResponse genericResponse = new GenericResponse(); genericResponse.setMessage("OK"); @@ -92,20 +95,20 @@ void runKo_maxRetryCount() { when(context.getLogger()).thenReturn(logger); TableServiceClient tableServiceClient = mock(TableServiceClient.class); - setFinalStatic(FdrXmlToJson.class.getDeclaredField("tableServiceClient"), tableServiceClient); - setFinalStatic(FdrXmlToJson.class.getDeclaredField("tableName"), "errors"); + Whitebox.setInternalState(FdrXmlToJson.class, "tableServiceClient", tableServiceClient); + Whitebox.setInternalState(FdrXmlToJson.class, "tableName", "errors"); BlobContainerClient blobContainerClient = mock(BlobContainerClient.class); BlobClient blobClient = mock(BlobClient.class); when(blobContainerClient.getBlobClient(anyString())).thenReturn(blobClient); - setFinalStatic(FdrXmlToJson.class.getDeclaredField("blobContainerClient"), blobContainerClient); + Whitebox.setInternalState(FdrXmlToJson.class, "blobContainerClient", blobContainerClient); // generating input String xml = TestUtil.readStringFromFile("xmlcontent/nodoInviaFlussoRendicontazione.xml"); InternalPspApi pspApi = mock(InternalPspApi.class); - setFinalStatic(FdrXmlToJson.class.getDeclaredField("pspApi"), pspApi); - setFinalStatic(FdrXmlToJson.class.getDeclaredField("addPaymentRequestPartitionSize"), "10"); + Whitebox.setInternalState(FdrXmlToJson.class, "pspApi", pspApi); + Whitebox.setInternalState(FdrXmlToJson.class, "addPaymentRequestPartitionSize", "10"); GenericResponse genericResponse = new GenericResponse(); genericResponse.setMessage("OK"); @@ -113,7 +116,7 @@ void runKo_maxRetryCount() { when(pspApi.internalAddPayment(anyString(), anyString(), any())).thenReturn(genericResponse); when(pspApi.internalPublish(anyString(), anyString())).thenReturn(genericResponse); - setFinalStatic(FdrXmlToJson.class.getDeclaredField("MAX_RETRY_COUNT"), -1); + Whitebox.setInternalState(FdrXmlToJson.class, "MAX_RETRY_COUNT", -1); // execute logic fdrXmlToJson.processNodoReEvent(xml.getBytes(StandardCharsets.UTF_8), UUID.randomUUID().toString(), context); @@ -129,15 +132,15 @@ void runKo_errorBlobContainerLoad() { when(context.getLogger()).thenReturn(logger); TableServiceClient tableServiceClient = mock(TableServiceClient.class); - setFinalStatic(FdrXmlToJson.class.getDeclaredField("tableServiceClient"), tableServiceClient); - setFinalStatic(FdrXmlToJson.class.getDeclaredField("tableName"), "errors"); + Whitebox.setInternalState(FdrXmlToJson.class, "tableServiceClient", tableServiceClient); + Whitebox.setInternalState(FdrXmlToJson.class, "tableName", "errors"); // generating input String xml = TestUtil.readStringFromFile("xmlcontent/nodoInviaFlussoRendicontazione.xml"); InternalPspApi pspApi = mock(InternalPspApi.class); - setFinalStatic(FdrXmlToJson.class.getDeclaredField("pspApi"), pspApi); - setFinalStatic(FdrXmlToJson.class.getDeclaredField("addPaymentRequestPartitionSize"), "10"); + Whitebox.setInternalState(FdrXmlToJson.class, "pspApi", pspApi); + Whitebox.setInternalState(FdrXmlToJson.class, "addPaymentRequestPartitionSize", "10"); GenericResponse genericResponse = new GenericResponse(); genericResponse.setMessage("OK"); @@ -145,7 +148,7 @@ void runKo_errorBlobContainerLoad() { when(pspApi.internalAddPayment(anyString(), anyString(), any())).thenReturn(genericResponse); when(pspApi.internalPublish(anyString(), anyString())).thenReturn(genericResponse); - setFinalStatic(FdrXmlToJson.class.getDeclaredField("MAX_RETRY_COUNT"), -1); + Whitebox.setInternalState(FdrXmlToJson.class, "MAX_RETRY_COUNT", -1); // execute logic Assertions.assertThrows(Exception.class, () -> fdrXmlToJson.processNodoReEvent(xml.getBytes(StandardCharsets.UTF_8), UUID.randomUUID().toString(), context)); @@ -164,18 +167,18 @@ void runKo_errorBlobContainerDelete() { TableServiceClient tableServiceClient = mock(TableServiceClient.class); TableClient tableClient = mock(TableClient.class); when(tableServiceClient.getTableClient(anyString())).thenReturn(tableClient); - setFinalStatic(FdrXmlToJson.class.getDeclaredField("tableServiceClient"), tableServiceClient); - setFinalStatic(FdrXmlToJson.class.getDeclaredField("tableName"), "errors"); + Whitebox.setInternalState(FdrXmlToJson.class, "tableServiceClient", tableServiceClient); + Whitebox.setInternalState(FdrXmlToJson.class, "tableName", "errors"); BlobContainerClient blobContainerClient = mock(BlobContainerClient.class); - setFinalStatic(FdrXmlToJson.class.getDeclaredField("blobContainerClient"), blobContainerClient); + Whitebox.setInternalState(FdrXmlToJson.class, "blobContainerClient", blobContainerClient); // generating input String xml = TestUtil.readStringFromFile("xmlcontent/nodoInviaFlussoRendicontazione.xml"); InternalPspApi pspApi = mock(InternalPspApi.class); - setFinalStatic(FdrXmlToJson.class.getDeclaredField("pspApi"), pspApi); - setFinalStatic(FdrXmlToJson.class.getDeclaredField("addPaymentRequestPartitionSize"), "10"); + Whitebox.setInternalState(FdrXmlToJson.class, "pspApi", pspApi); + Whitebox.setInternalState(FdrXmlToJson.class, "addPaymentRequestPartitionSize", "10"); GenericResponse genericResponse = new GenericResponse(); genericResponse.setMessage("OK"); @@ -199,24 +202,24 @@ void runKo_pspHttpError() { when(context.getLogger()).thenReturn(logger); TableServiceClient tableServiceClient = mock(TableServiceClient.class); - setFinalStatic(FdrXmlToJson.class.getDeclaredField("tableServiceClient"), tableServiceClient); - setFinalStatic(FdrXmlToJson.class.getDeclaredField("tableName"), "errors"); + Whitebox.setInternalState(FdrXmlToJson.class, "tableServiceClient", tableServiceClient); + Whitebox.setInternalState(FdrXmlToJson.class, "tableName", "errors"); BlobContainerClient blobContainerClient = mock(BlobContainerClient.class); BlobClient blobClient = mock(BlobClient.class); when(blobContainerClient.getBlobClient(anyString())).thenReturn(blobClient); - setFinalStatic(FdrXmlToJson.class.getDeclaredField("blobContainerClient"), blobContainerClient); + Whitebox.setInternalState(FdrXmlToJson.class, "blobContainerClient", blobContainerClient); // generating input String xml = TestUtil.readStringFromFile("xmlcontent/nodoInviaFlussoRendicontazione.xml"); InternalPspApi pspApi = mock(InternalPspApi.class); - setFinalStatic(FdrXmlToJson.class.getDeclaredField("pspApi"), pspApi); - setFinalStatic(FdrXmlToJson.class.getDeclaredField("addPaymentRequestPartitionSize"), "10"); + Whitebox.setInternalState(FdrXmlToJson.class, "pspApi", pspApi); + Whitebox.setInternalState(FdrXmlToJson.class, "addPaymentRequestPartitionSize", "10"); when(pspApi.internalCreate(anyString(), anyString(), any())).thenReturn(null); - setFinalStatic(FdrXmlToJson.class.getDeclaredField("MAX_RETRY_COUNT"), -1); + Whitebox.setInternalState(FdrXmlToJson.class, "MAX_RETRY_COUNT", -1); // execute logic fdrXmlToJson.processNodoReEvent(xml.getBytes(StandardCharsets.UTF_8), UUID.randomUUID().toString(), context); @@ -234,18 +237,18 @@ void runKo_pspErrorResponse() { TableServiceClient tableServiceClient = mock(TableServiceClient.class); TableClient tableClient = mock(TableClient.class); when(tableServiceClient.getTableClient(anyString())).thenReturn(tableClient); - setFinalStatic(FdrXmlToJson.class.getDeclaredField("tableServiceClient"), tableServiceClient); - setFinalStatic(FdrXmlToJson.class.getDeclaredField("tableName"), "errors"); + Whitebox.setInternalState(FdrXmlToJson.class, "tableServiceClient", tableServiceClient); + Whitebox.setInternalState(FdrXmlToJson.class, "tableName", "errors"); BlobContainerClient blobContainerClient = mock(BlobContainerClient.class); - setFinalStatic(FdrXmlToJson.class.getDeclaredField("blobContainerClient"), blobContainerClient); + Whitebox.setInternalState(FdrXmlToJson.class, "blobContainerClient", blobContainerClient); // generating input String xml = TestUtil.readStringFromFile("xmlcontent/nodoInviaFlussoRendicontazione.xml"); InternalPspApi pspApi = mock(InternalPspApi.class); - setFinalStatic(FdrXmlToJson.class.getDeclaredField("pspApi"), pspApi); - setFinalStatic(FdrXmlToJson.class.getDeclaredField("addPaymentRequestPartitionSize"), "10"); + Whitebox.setInternalState(FdrXmlToJson.class, "pspApi", pspApi); + Whitebox.setInternalState(FdrXmlToJson.class, "addPaymentRequestPartitionSize", "10"); mockStatic(ErrorResponse.class); when(ErrorResponse.fromJson(anyString())).thenThrow(IOException.class); @@ -269,18 +272,18 @@ void runKo_pspErrorResponseMalformed() { TableServiceClient tableServiceClient = mock(TableServiceClient.class); TableClient tableClient = mock(TableClient.class); when(tableServiceClient.getTableClient(anyString())).thenReturn(tableClient); - setFinalStatic(FdrXmlToJson.class.getDeclaredField("tableServiceClient"), tableServiceClient); - setFinalStatic(FdrXmlToJson.class.getDeclaredField("tableName"), "errors"); + Whitebox.setInternalState(FdrXmlToJson.class, "tableServiceClient", tableServiceClient); + Whitebox.setInternalState(FdrXmlToJson.class, "tableName", "errors"); BlobContainerClient blobContainerClient = mock(BlobContainerClient.class); - setFinalStatic(FdrXmlToJson.class.getDeclaredField("blobContainerClient"), blobContainerClient); + Whitebox.setInternalState(FdrXmlToJson.class, "blobContainerClient", blobContainerClient); // generating input String xml = TestUtil.readStringFromFile("xmlcontent/nodoInviaFlussoRendicontazione.xml"); InternalPspApi pspApi = mock(InternalPspApi.class); - setFinalStatic(FdrXmlToJson.class.getDeclaredField("pspApi"), pspApi); - setFinalStatic(FdrXmlToJson.class.getDeclaredField("addPaymentRequestPartitionSize"), "10"); + Whitebox.setInternalState(FdrXmlToJson.class, "pspApi", pspApi); + Whitebox.setInternalState(FdrXmlToJson.class, "addPaymentRequestPartitionSize", "10"); when(pspApi.internalCreate(anyString(), anyString(), any())).thenThrow(new ApiException(400, "", new HashMap<>(), "{ \"error\": \"OK\" }")); From 5348bec222ce9e0df0b3133c97c659a6f423a41e Mon Sep 17 00:00:00 2001 From: Francesco Parisi Date: Fri, 24 May 2024 00:32:28 +0200 Subject: [PATCH 11/12] NOD-892: [FDR] XML-to-JSON - Implementazione JUnit --- src/test/java/FdrXmlErrorTest.java | 210 +++++++++++++++++----------- src/test/java/FdrXmlToJsonTest.java | 16 +-- 2 files changed, 131 insertions(+), 95 deletions(-) diff --git a/src/test/java/FdrXmlErrorTest.java b/src/test/java/FdrXmlErrorTest.java index d865a77..4fe8e4c 100644 --- a/src/test/java/FdrXmlErrorTest.java +++ b/src/test/java/FdrXmlErrorTest.java @@ -1,20 +1,31 @@ +import com.azure.core.http.rest.PagedIterable; +import com.azure.data.tables.TableClient; +import com.azure.data.tables.TableServiceClient; +import com.azure.data.tables.models.TableEntity; +import com.azure.storage.blob.BlobClient; +import com.azure.storage.blob.BlobContainerClient; import com.microsoft.azure.functions.ExecutionContext; import com.microsoft.azure.functions.HttpRequestMessage; import com.microsoft.azure.functions.HttpResponseMessage; +import com.microsoft.azure.functions.HttpStatus; +import it.gov.pagopa.fdrxmltojson.AppConstant; import it.gov.pagopa.fdrxmltojson.FdrXmlError; +import lombok.SneakyThrows; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.Mock; import org.mockito.Spy; import org.mockito.junit.jupiter.MockitoExtension; +import org.powermock.reflect.Whitebox; -import java.lang.reflect.Field; -import java.util.Optional; +import java.util.*; import java.util.logging.Logger; -import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.*; @ExtendWith(MockitoExtension.class) -public class FdrXmlErrorTest { +class FdrXmlErrorTest { @Spy FdrXmlError fdrXmlError; @@ -22,87 +33,126 @@ public class FdrXmlErrorTest { @Mock ExecutionContext context; - private static final Logger logger = Logger.getLogger("FdrXmlToJson-test-logger"); + private static final Logger logger = Logger.getLogger("FdrXmlError-test-logger"); final HttpRequestMessage> request = mock(HttpRequestMessage.class); final HttpResponseMessage.Builder builder = mock(HttpResponseMessage.Builder.class); - static void setFinalStatic(Field field, Object newValue) throws Exception { - field.setAccessible(true); - field.set(null, newValue); + @Test + @SneakyThrows + void runOk() { + // mocking objects + when(context.getLogger()).thenReturn(logger); + + doReturn(builder).when(request).createResponseBuilder(any(HttpStatus.class)); + + Whitebox.setInternalState(FdrXmlError.class, "tableName", "errors"); + TableServiceClient tableServiceClient = mock(TableServiceClient.class); + Whitebox.setInternalState(FdrXmlError.class, "tableServiceClient", tableServiceClient); + TableClient tableClient = mock(TableClient.class); + PagedIterable pagedIterable = mock(PagedIterable.class); + when(tableServiceClient.getTableClient(anyString())).thenReturn(tableClient); + when(tableClient.listEntities()).thenReturn(pagedIterable); + TableEntity tableEntity = new TableEntity("2024-01-01", "1"); + Map tableEntityMap = new HashMap<>(); + tableEntityMap.put(AppConstant.columnFieldFdr, "fdr"); + tableEntityMap.put(AppConstant.columnFieldPspId, "pspId"); + tableEntityMap.put(AppConstant.columnFieldErrorType, "DELETE_BLOB_ERROR"); + tableEntityMap.put(AppConstant.columnFieldFileName, "provaFileName"); + tableEntity.setProperties(tableEntityMap); + Iterator mockIterator = List.of(tableEntity).iterator(); + when(pagedIterable.iterator()).thenReturn(mockIterator); + + BlobContainerClient blobContainerClient = mock(BlobContainerClient.class); + BlobClient blobClient = mock(BlobClient.class); + when(blobContainerClient.getBlobClient(anyString())).thenReturn(blobClient); + Whitebox.setInternalState(FdrXmlError.class, "blobContainerClient", blobContainerClient); + + // generating input + request.getQueryParameters().put("partitionKey", "2024-01-01"); + request.getQueryParameters().put("rowKey", "1"); + request.getQueryParameters().put("deleteOnlyByKey", "true"); + + // execute logic + Assertions.assertThrows(Exception.class, () -> fdrXmlError.run(request, context)); + } + + @Test + @SneakyThrows + void runOk_2() { + // mocking objects + when(context.getLogger()).thenReturn(logger); + + Whitebox.setInternalState(FdrXmlError.class, "tableName", "errors"); + TableServiceClient tableServiceClient = mock(TableServiceClient.class); + Whitebox.setInternalState(FdrXmlError.class, "tableServiceClient", tableServiceClient); + TableClient tableClient = mock(TableClient.class); + PagedIterable pagedIterable = mock(PagedIterable.class); + when(tableServiceClient.getTableClient(anyString())).thenReturn(tableClient); + when(tableClient.listEntities()).thenReturn(pagedIterable); + TableEntity tableEntity = new TableEntity("2024-01-01", "1"); + Map tableEntityMap = new HashMap<>(); + tableEntityMap.put(AppConstant.columnFieldFdr, "fdr"); + tableEntityMap.put(AppConstant.columnFieldPspId, "pspId"); + tableEntityMap.put(AppConstant.columnFieldErrorType, "GENERIC_ERROR"); + tableEntityMap.put(AppConstant.columnFieldFileName, "provaFileName"); + tableEntity.setProperties(tableEntityMap); + Iterator mockIterator = List.of(tableEntity).iterator(); + when(pagedIterable.iterator()).thenReturn(mockIterator); + + BlobContainerClient blobContainerClient = mock(BlobContainerClient.class); + BlobClient blobClient = mock(BlobClient.class); + when(blobContainerClient.getBlobClient(anyString())).thenReturn(blobClient); + Whitebox.setInternalState(FdrXmlError.class, "blobContainerClient", blobContainerClient); + + // generating input + doReturn(builder).when(request).createResponseBuilder(any(HttpStatus.class)); + + request.getQueryParameters().put("partitionKey", "2024-01-01"); + request.getQueryParameters().put("rowKey", "1"); + request.getQueryParameters().put("deleteOnlyByKey", "true"); + + // execute logic + Assertions.assertThrows(Exception.class, () -> fdrXmlError.run(request, context)); } -// @Test -// @SneakyThrows -// void runOk() { -// // mocking objects -// when(context.getLogger()).thenReturn(logger); -// HttpResponseMessage responseMock = mock(HttpResponseMessage.class); -// -// doReturn(responseMock).when(builder).build(); -// doReturn(builder).when(request).createResponseBuilder(any(HttpStatus.class)); -// -// TableServiceClient tableServiceClient = mock(TableServiceClient.class); -//// TableClient tableClient = mock(TableClient.class); -// TableEntity tableEntity = mock(TableEntity.class); -// PagedIterable pagedIterable = mock(PagedIterable.class); -//// when(tableServiceClient.getTableClient(anyString())).thenReturn(tableClient); -//// when(tableClient.getEntity(anyString(), anyString())).thenReturn(tableEntity); -//// when(tableClient.listEntities().iterator()).thenReturn(pagedIterable.iterator()); -// setFinalStatic(FdrXmlError.class.getDeclaredField("tableServiceClient"), tableServiceClient); -// setFinalStatic(FdrXmlError.class.getDeclaredField("tableName"), "errors"); -// -// -// -// BlobContainerClient blobContainerClient = mock(BlobContainerClient.class); -// BlobClient blobClient = mock(BlobClient.class); -// when(blobContainerClient.getBlobClient(anyString())).thenReturn(blobClient); -// setFinalStatic(FdrXmlError.class.getDeclaredField("blobContainerClient"), blobContainerClient); -// -// // generating input -// String eventInStringForm = TestUtil.readStringFromFile("events/event_ok_1.json"); -// List events = new ArrayList<>(); -// events.add(eventInStringForm); -// Map[] properties = new HashMap[1]; -// properties[0] = new HashMap<>(); -// -//// doReturn("2024-01-01").when(request.getQueryParameters().get("partitionKey")); -//// doReturn("1").when(request.getQueryParameters().get("rowKey")); -//// doReturn("true").when(request.getQueryParameters().get("deleteOnlyByKey")); -// -// // execute logic -// fdrXmlError.run(request, context); -// } -// -// @Test -// @SneakyThrows -// void runKo_1() { -// // mocking objects -// when(context.getLogger()).thenReturn(logger); -// HttpResponseMessage responseMock = mock(HttpResponseMessage.class); -// -// doReturn(responseMock).when(builder).build(); -// doReturn(builder).when(request).createResponseBuilder(any(HttpStatus.class)); -// -// TableServiceClient tableServiceClient = mock(TableServiceClient.class); -// setFinalStatic(FdrXmlError.class.getDeclaredField("tableServiceClient"), tableServiceClient); -// setFinalStatic(FdrXmlError.class.getDeclaredField("tableName"), "errors"); -// -// BlobContainerClient blobContainerClient = mock(BlobContainerClient.class); -// BlobClient blobClient = mock(BlobClient.class); -// when(blobContainerClient.getBlobClient(anyString())).thenReturn(blobClient); -// setFinalStatic(FdrXmlError.class.getDeclaredField("blobContainerClient"), blobContainerClient); -// -// // generating input -// String eventInStringForm = TestUtil.readStringFromFile("events/event_ok_1.json"); -// List events = new ArrayList<>(); -// events.add(eventInStringForm); -// Map[] properties = new HashMap[1]; -// properties[0] = new HashMap<>(); -// -// // execute logic -// Assertions.assertThrows(Exception.class, -// () -> fdrXmlError.run(request, context)); -// } + @Test + @SneakyThrows + void runKo_1() { + // mocking objects + when(context.getLogger()).thenReturn(logger); + + doReturn(builder).when(request).createResponseBuilder(any(HttpStatus.class)); + + Whitebox.setInternalState(FdrXmlError.class, "tableName", "errors"); + TableServiceClient tableServiceClient = mock(TableServiceClient.class); + Whitebox.setInternalState(FdrXmlError.class, "tableServiceClient", tableServiceClient); + TableClient tableClient = mock(TableClient.class); + PagedIterable pagedIterable = mock(PagedIterable.class); + when(tableServiceClient.getTableClient(anyString())).thenReturn(tableClient); + when(tableClient.listEntities()).thenReturn(pagedIterable); + TableEntity tableEntity = new TableEntity("2024-01-01", "1"); + Map tableEntityMap = new HashMap<>(); + tableEntityMap.put(AppConstant.columnFieldFdr, "fdr"); + tableEntityMap.put(AppConstant.columnFieldPspId, "pspId"); + tableEntityMap.put(AppConstant.columnFieldErrorType, "GENERIC_ERROR"); + tableEntityMap.put(AppConstant.columnFieldFileName, "provaFileName"); + tableEntity.setProperties(tableEntityMap); + Iterator mockIterator = List.of(tableEntity).iterator(); + when(pagedIterable.iterator()).thenReturn(mockIterator); + + BlobContainerClient blobContainerClient = mock(BlobContainerClient.class); + BlobClient blobClient = mock(BlobClient.class); + when(blobContainerClient.getBlobClient(anyString())).thenReturn(blobClient); + Whitebox.setInternalState(FdrXmlError.class, "blobContainerClient", blobContainerClient); + + // generating input + request.getQueryParameters().put("partitionKey", "2024-01-01"); + request.getQueryParameters().put("rowKey", "1"); + request.getQueryParameters().put("deleteOnlyByKey", "false"); + + // execute logic + Assertions.assertThrows(Exception.class, () -> fdrXmlError.run(request, context)); + } } diff --git a/src/test/java/FdrXmlToJsonTest.java b/src/test/java/FdrXmlToJsonTest.java index b7f1def..32ccc37 100644 --- a/src/test/java/FdrXmlToJsonTest.java +++ b/src/test/java/FdrXmlToJsonTest.java @@ -20,8 +20,6 @@ import util.TestUtil; import java.io.IOException; -import java.lang.reflect.Field; -import java.lang.reflect.Modifier; import java.nio.charset.StandardCharsets; import java.util.HashMap; import java.util.UUID; @@ -30,7 +28,7 @@ import static org.mockito.Mockito.*; @ExtendWith(MockitoExtension.class) -public class FdrXmlToJsonTest { +class FdrXmlToJsonTest { @Spy FdrXmlToJson fdrXmlToJson; @@ -40,16 +38,6 @@ public class FdrXmlToJsonTest { private static final Logger logger = Logger.getLogger("FdrXmlToJson-test-logger"); - static void setFinalStatic(Field field, Object newValue) throws Exception { - field.setAccessible(true); - Field modifiersField = Field.class.getDeclaredField("modifiers"); - modifiersField.setAccessible(true); - modifiersField.setInt(field, field.getModifiers() & ~Modifier.FINAL); - field.set(null, newValue); - } - - - @Test @SneakyThrows void runOk_withoutAdditionalProperties() { @@ -58,9 +46,7 @@ void runOk_withoutAdditionalProperties() { TableServiceClient tableServiceClient = mock(TableServiceClient.class); Whitebox.setInternalState(FdrXmlToJson.class, "tableServiceClient", tableServiceClient); -// setFinalStatic(FdrXmlToJson.class.getDeclaredField("tableServiceClient"), tableServiceClient); Whitebox.setInternalState(FdrXmlToJson.class, "tableName", "errors"); -// setFinalStatic(FdrXmlToJson.class.getDeclaredField("tableName"), "errors"); BlobContainerClient blobContainerClient = mock(BlobContainerClient.class); BlobClient blobClient = mock(BlobClient.class); From bd2c78cc0b9947ce5087ff02a75797fa0403948a Mon Sep 17 00:00:00 2001 From: Francesco Parisi Date: Fri, 24 May 2024 16:51:00 +0200 Subject: [PATCH 12/12] NOD-892: [FDR] XML-to-JSON - Implementazione JUnit --- pom.xml | 3 +-- src/test/java/InfoTest.java | 2 +- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/pom.xml b/pom.xml index c97fd2b..69a766c 100644 --- a/pom.xml +++ b/pom.xml @@ -228,7 +228,6 @@ 3.12.0 - @@ -328,7 +327,7 @@ org.junit.jupiter junit-jupiter-engine - 5.0.1 + 5.0.3 diff --git a/src/test/java/InfoTest.java b/src/test/java/InfoTest.java index 7d50645..a1ec296 100644 --- a/src/test/java/InfoTest.java +++ b/src/test/java/InfoTest.java @@ -18,7 +18,7 @@ import static org.mockito.Mockito.mock; @ExtendWith(MockitoExtension.class) -public class InfoTest { +class InfoTest { @Mock ExecutionContext context;