> partitionEvents
private String storeBodyInBlobAndGetReference(String eventBody, String fileName) throws BlobStorageUploadException {
String blobBodyReference = null;
- BlobClient blobClient = getBlobContainerClient().getBlobClient(fileName);
try {
+ BlobClient blobClient = getBlobContainerClient().getBlobClient(fileName);
BinaryData body = BinaryData.fromStream(new ByteArrayInputStream(eventBody.getBytes(StandardCharsets.UTF_8)));
blobClient.upload(body);
blobBodyReference = BlobBodyReference.builder()
- .storageAccount(blobContainerClient.getAccountName())
+ .storageAccount(getBlobContainerClient().getAccountName())
.containerName(Constants.BLOB_NAME)
.fileName(fileName)
- .fileLength(body.getLength())
+ .fileLength(body.toString().length())
.build().toString();
} catch (Exception e) {
throw new BlobStorageUploadException(e);
diff --git a/src/main/java/it/gov/pagopa/nodoverifykototablestorage/exception/AppException.java b/src/main/java/it/gov/pagopa/nodoverifykototablestorage/exception/AppException.java
deleted file mode 100644
index d8bcc9a..0000000
--- a/src/main/java/it/gov/pagopa/nodoverifykototablestorage/exception/AppException.java
+++ /dev/null
@@ -1,18 +0,0 @@
-package it.gov.pagopa.nodoverifykototablestorage.exception;
-
-public class AppException extends Exception {
-
- /**
- * generated serialVersionUID
- */
- private static final long serialVersionUID = -7564079264281462536L;
-
- public AppException() {
- super();
- }
-
- public AppException(String message) {
- super(message);
- }
-
-}
diff --git a/src/main/java/it/gov/pagopa/nodoverifykototablestorage/util/AppInfo.java b/src/main/java/it/gov/pagopa/nodoverifykototablestorage/util/AppInfo.java
index 63381b0..10d3111 100644
--- a/src/main/java/it/gov/pagopa/nodoverifykototablestorage/util/AppInfo.java
+++ b/src/main/java/it/gov/pagopa/nodoverifykototablestorage/util/AppInfo.java
@@ -4,9 +4,8 @@
import com.fasterxml.jackson.annotation.JsonInclude;
import lombok.*;
-@Data
+@Getter
@Builder(toBuilder = true)
-@NoArgsConstructor
@AllArgsConstructor(access = AccessLevel.PRIVATE)
@JsonInclude(JsonInclude.Include.NON_NULL)
@JsonIgnoreProperties(ignoreUnknown = true)
diff --git a/src/main/java/it/gov/pagopa/nodoverifykototablestorage/util/ObjectMapperUtils.java b/src/main/java/it/gov/pagopa/nodoverifykototablestorage/util/ObjectMapperUtils.java
index 009955a..dd53b8b 100644
--- a/src/main/java/it/gov/pagopa/nodoverifykototablestorage/util/ObjectMapperUtils.java
+++ b/src/main/java/it/gov/pagopa/nodoverifykototablestorage/util/ObjectMapperUtils.java
@@ -5,10 +5,6 @@
import org.modelmapper.ModelMapper;
import org.modelmapper.convention.MatchingStrategies;
-import java.util.Collection;
-import java.util.List;
-import java.util.stream.Collectors;
-
public class ObjectMapperUtils {
private static final ModelMapper modelMapper;
@@ -32,51 +28,7 @@ public class ObjectMapperUtils {
private ObjectMapperUtils() {
}
- /**
- * Note: outClass object must have default constructor with no arguments
- *
- * @param type of result object.
- * @param type of source object to map from.
- * @param entity entity that needs to be mapped.
- * @param outClass class of result object.
- * @return new object of outClass
type.
- */
- public static D map(final T entity, Class outClass) {
- return modelMapper.map(entity, outClass);
- }
-
public static D readValue(String string,Class clazz) throws JsonProcessingException {
return objectMapper.readValue(string,clazz);
}
- /**
- * Note: outClass object must have default constructor with no arguments
- *
- * @param entityList list of entities that needs to be mapped
- * @param outCLass class of result list element
- * @param type of objects in result list
- * @param type of entity in entityList
- * @return list of mapped object with
type.
- */
- public static List mapAll(final Collection entityList, Class outCLass) {
- return entityList.stream()
- .map(entity -> map(entity, outCLass))
- .collect(Collectors.toList());
- }
-
- /**
- * Maps {@code source} to {@code destination}.
- *
- * @param source object to map from
- * @param destination object to map to
- */
- public static D map(final S source, D destination) {
- modelMapper.map(source, destination);
- return destination;
- }
-
- public static String writeValueAsString(Object value) throws JsonProcessingException {
- return objectMapper.writeValueAsString(value);
- }
-
-
}
diff --git a/src/test/java/it/gov/pagopa/nodoverifykototablestorage/InfoTest.java b/src/test/java/it/gov/pagopa/nodoverifykototablestorage/InfoTest.java
new file mode 100644
index 0000000..fff666d
--- /dev/null
+++ b/src/test/java/it/gov/pagopa/nodoverifykototablestorage/InfoTest.java
@@ -0,0 +1,91 @@
+package it.gov.pagopa.nodoverifykototablestorage;
+
+import static org.junit.jupiter.api.Assertions.*;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.anyString;
+import static org.mockito.Mockito.*;
+
+import java.util.Optional;
+import java.util.logging.Logger;
+
+import it.gov.pagopa.nodoverifykototablestorage.util.AppInfo;
+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 com.microsoft.azure.functions.ExecutionContext;
+import com.microsoft.azure.functions.HttpRequestMessage;
+import com.microsoft.azure.functions.HttpResponseMessage;
+import com.microsoft.azure.functions.HttpStatus;
+
+@ExtendWith(MockitoExtension.class)
+class InfoTest {
+
+ @Mock
+ ExecutionContext context;
+
+ @Spy
+ Info infoFunction;
+
+ @Test
+ void runHttpTriggerOK() {
+ // test precondition
+ Logger logger = Logger.getLogger("NodoVerifyKOEventToTableStorage-test-logger");
+ when(context.getLogger()).thenReturn(logger);
+
+ // test precondition
+ final HttpResponseMessage.Builder builder = mock(HttpResponseMessage.Builder.class);
+ @SuppressWarnings("unchecked")
+ HttpRequestMessage> request = mock(HttpRequestMessage.class);
+
+ HttpResponseMessage responseMock = mock(HttpResponseMessage.class);
+ doReturn(HttpStatus.OK).when(responseMock).getStatus();
+ doReturn(builder).when(builder).body(any());
+ doReturn(responseMock).when(builder).build();
+ doReturn(builder).when(request).createResponseBuilder(any(HttpStatus.class));
+ doReturn(builder).when(builder).header(anyString(), anyString());
+
+ // test execution
+ HttpResponseMessage response = infoFunction.run(request, context);
+
+ // test assertion
+ assertEquals(HttpStatus.OK, response.getStatus());
+ }
+
+ @SneakyThrows
+ @Test
+ void getInfoOk() {
+
+ // Mocking service creation
+ Logger logger = Logger.getLogger("NodoVerifyKOEventToTableStorage-test-logger");
+ String path = "/META-INF/maven/it.gov.pagopa/nodoverifykototablestorage/pom.properties";
+
+ // Execute function
+ AppInfo response = infoFunction.getInfo(logger, path);
+
+ // Checking assertions
+ assertNotNull(response.getName());
+ assertNotNull(response.getVersion());
+ assertNotNull(response.getEnvironment());
+ }
+
+ @SneakyThrows
+ @Test
+ void getInfoKo() {
+
+ // Mocking service creation
+ Logger logger = Logger.getLogger("NodoVerifyKOEventToTableStorage-test-logger");
+
+ // Execute function
+ AppInfo response = infoFunction.getInfo(logger, null);
+
+ // Checking assertions
+ assertNull(response.getName());
+ assertNull(response.getVersion());
+ assertNotNull(response.getEnvironment());
+ }
+
+}
\ No newline at end of file
diff --git a/src/test/java/it/gov/pagopa/nodoverifykototablestorage/NodoVerifyKOEventToTableStorageTest.java b/src/test/java/it/gov/pagopa/nodoverifykototablestorage/NodoVerifyKOEventToTableStorageTest.java
new file mode 100644
index 0000000..3255880
--- /dev/null
+++ b/src/test/java/it/gov/pagopa/nodoverifykototablestorage/NodoVerifyKOEventToTableStorageTest.java
@@ -0,0 +1,232 @@
+package it.gov.pagopa.nodoverifykototablestorage;
+
+import static org.junit.jupiter.api.Assertions.*;
+import static org.mockito.Mockito.*;
+
+import java.io.ByteArrayInputStream;
+import java.nio.charset.StandardCharsets;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.logging.Logger;
+
+import com.azure.core.util.BinaryData;
+import com.azure.data.tables.TableClient;
+import com.azure.data.tables.TableServiceClient;
+import com.azure.data.tables.TableServiceClientBuilder;
+import com.azure.data.tables.models.TableTransactionAction;
+import com.azure.storage.blob.BlobClient;
+import com.azure.storage.blob.BlobContainerClient;
+import com.azure.storage.blob.BlobServiceClient;
+import com.azure.storage.blob.BlobServiceClientBuilder;
+import com.microsoft.azure.functions.ExecutionContext;
+import it.gov.pagopa.nodoverifykototablestorage.util.LogHandler;
+import it.gov.pagopa.nodoverifykototablestorage.util.TestUtil;
+import lombok.SneakyThrows;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.ExtendWith;
+import org.mockito.*;
+import org.mockito.junit.jupiter.MockitoExtension;
+
+@ExtendWith(MockitoExtension.class)
+class NodoVerifyKOEventToTableStorageTest {
+
+ @SuppressWarnings("unchecked")
+ @Test
+ @SneakyThrows
+ void runOk() {
+
+ TableServiceClient tableServiceClient = mock(TableServiceClient.class);
+ BlobServiceClient blobServiceClient = mock(BlobServiceClient.class);
+ BlobContainerClient blobContainerClient = mock(BlobContainerClient.class);
+ BlobClient blobClient = mock(BlobClient.class);
+ TableClient tableClient = mock(TableClient.class);
+ try (
+ MockedConstruction blobServiceClientBuilder = Mockito.mockConstruction(BlobServiceClientBuilder.class, (mock, context) -> {
+ when(mock.connectionString(any())).thenReturn(mock);
+ when(mock.buildClient()).thenReturn(blobServiceClient);
+ });
+ MockedConstruction tableServiceClientBuilder = Mockito.mockConstruction(TableServiceClientBuilder.class, (mock, context) -> {
+ when(mock.connectionString(any())).thenReturn(mock);
+ when(mock.buildClient()).thenReturn(tableServiceClient);
+ });
+ ) {
+
+ // mocking objects
+ ExecutionContext context = mock(ExecutionContext.class);
+ Logger logger = Logger.getLogger("NodoVerifyKOEventToDataStore-test-logger");
+ LogHandler logHandler = new LogHandler();
+ logger.addHandler(logHandler);
+ when(context.getLogger()).thenReturn(logger);
+ String storageAccount = "mockstorageaccount";
+ when(blobServiceClient.createBlobContainerIfNotExists(any())).thenReturn(blobContainerClient);
+ when(blobContainerClient.getBlobClient(anyString())).thenReturn(blobClient);
+ when(tableServiceClient.getTableClient(any())).thenReturn(tableClient);
+ when(blobContainerClient.getAccountName()).thenReturn(storageAccount);
+ when(tableClient.submitTransaction(anyList())).thenReturn(null);
+ ArgumentCaptor blobCaptor = ArgumentCaptor.forClass(BinaryData.class);
+ ArgumentCaptor> transactionCaptor = ArgumentCaptor.forClass(List.class);
+
+ // generating input
+ String eventInStringForm1 = TestUtil.readStringFromFile("events/event_ok_1.json");
+ List events = new ArrayList<>();
+ events.add(eventInStringForm1);
+ String eventInStringForm2 = TestUtil.readStringFromFile("events/event_ok_2.json");
+ events.add(eventInStringForm2);
+ Map[] properties = new HashMap[2];
+ properties[0] = new HashMap<>();
+ properties[0].put("prop1_without_dash", true);
+ properties[0].put("prop1-with-dash", "1");
+ properties[1] = new HashMap<>();
+ properties[1].put("prop2_without_dash", false);
+ properties[1].put("prop2-with-dash", "2");
+
+ // generating expected output on event 1
+ String partitionKey1 = "2023-01-01";
+ String rowKey1 = "1672570800000-uuid-001";
+ int size1 = BinaryData.fromStream(new ByteArrayInputStream(eventInStringForm1.getBytes(StandardCharsets.UTF_8))).toString().length();
+ Map expectedEvent1 = new HashMap<>();
+ expectedEvent1.put("PartitionKey", partitionKey1);
+ expectedEvent1.put("RowKey", rowKey1);
+ expectedEvent1.put("timestamp", 1672570800000L);
+ expectedEvent1.put("noticeNumber", "302040000090000000");
+ expectedEvent1.put("idPA", "77777777777");
+ expectedEvent1.put("idPsp", "88888888888");
+ expectedEvent1.put("idStation", "77777777777_01");
+ expectedEvent1.put("idChannel", "88888888888_01");
+ expectedEvent1.put("prop1_without_dash", true);
+ expectedEvent1.put("prop1WithDash", "1");
+ expectedEvent1.put("blobBodyRef", "{\"storageAccount\":\"" + storageAccount + "\",\"containerName\":\"null\",\"fileName\":\"" + rowKey1 + "\",\"fileLength\":" + size1 + "}");
+
+ // generating expected output on event 2
+ String partitionKey2 = "2023-01-02";
+ String rowKey2 = "1672657200000-uuid-002";
+ int size2 = BinaryData.fromStream(new ByteArrayInputStream(eventInStringForm2.getBytes(StandardCharsets.UTF_8))).toString().length();
+ Map expectedEvent2 = new HashMap<>();
+ expectedEvent2.put("PartitionKey", partitionKey2);
+ expectedEvent2.put("RowKey", rowKey2);
+ expectedEvent2.put("timestamp", 1672657200000L);
+ expectedEvent2.put("noticeNumber", "302040000090000001");
+ expectedEvent2.put("idPA", "77777777777");
+ expectedEvent2.put("idPsp", "88888888888");
+ expectedEvent2.put("idStation", "77777777777_01");
+ expectedEvent2.put("idChannel", "88888888888_01");
+ expectedEvent2.put("prop2_without_dash", false);
+ expectedEvent2.put("prop2WithDash", "2");
+ expectedEvent2.put("blobBodyRef", "{\"storageAccount\":\"" + storageAccount + "\",\"containerName\":\"null\",\"fileName\":\"" + rowKey2 + "\",\"fileLength\":" + size2 + "}");
+
+ // merging events
+ List expectedEventsToPersist = List.of(expectedEvent1, expectedEvent2);
+
+ // execute logic
+ NodoVerifyKOEventToTableStorage function = new NodoVerifyKOEventToTableStorage();
+ function.processNodoVerifyKOEvent(events, properties, context);
+
+ // test assertion for data persistence execution
+ verify(blobClient, times(2)).upload(blobCaptor.capture());
+ verify(tableClient, times(2)).submitTransaction(transactionCaptor.capture());
+
+ // test assertion for blob storing
+ List binaryData = blobCaptor.getAllValues();
+ assertNotNull(binaryData);
+ assertEquals(2, binaryData.size());
+ assertEquals(eventInStringForm1, binaryData.get(0).toString());
+ assertEquals(eventInStringForm2, binaryData.get(1).toString());
+
+ // test assertion for transaction storing
+ List> transactions = transactionCaptor.getAllValues();
+ assertNotNull(transactions);
+ assertFalse(transactions.isEmpty());
+ assertEquals(expectedEventsToPersist.size(), transactions.size());
+ assertEquals(partitionKey1, transactions.get(0).get(0).getEntity().getPartitionKey());
+ assertEquals(rowKey1, transactions.get(0).get(0).getEntity().getRowKey());
+ assertEquals(expectedEvent1, transactions.get(0).get(0).getEntity().getProperties());
+ assertEquals(partitionKey2, transactions.get(1).get(0).getEntity().getPartitionKey());
+ assertEquals(rowKey2, transactions.get(1).get(0).getEntity().getRowKey());
+ assertEquals(expectedEvent2, transactions.get(1).get(0).getEntity().getProperties());
+ }
+ }
+
+ @SuppressWarnings("unchecked")
+ @Test
+ @SneakyThrows
+ void runKo_invalidNumberOfProperties() {
+ // mocking objects
+ ExecutionContext context = mock(ExecutionContext.class);
+ Logger logger = Logger.getLogger("NodoVerifyKOEventToTableStorage-test-logger");
+ LogHandler logHandler = new LogHandler();
+ logger.addHandler(logHandler);
+ when(context.getLogger()).thenReturn(logger);
+
+ // generating input
+ String eventInStringForm = TestUtil.readStringFromFile("events/event_ok_1.json");
+ List events = new ArrayList<>();
+ events.add(eventInStringForm);
+ Map[] properties = new HashMap[2];
+ properties[0] = new HashMap<>();
+ properties[0].put("prop1_without_dash", true);
+ properties[0].put("prop1-with-dash", "1");
+ properties[1] = new HashMap<>();
+ properties[1].put("prop1_without_dash", false);
+ properties[1].put("prop1-with-dash", "2");
+
+ // execute logic
+ NodoVerifyKOEventToTableStorage function = new NodoVerifyKOEventToTableStorage();
+ function.processNodoVerifyKOEvent(events, properties, context);
+
+ // test assertion
+ assertTrue(logHandler.getLogs().contains("Error processing events, lengths do not match: [events: 1 - properties: 2]"));
+ }
+
+ @SuppressWarnings("unchecked")
+ @Test
+ @SneakyThrows
+ void runKo_missingFaultBeanTimestamp() {
+ // mocking objects
+ ExecutionContext context = mock(ExecutionContext.class);
+ Logger logger = Logger.getLogger("NodoVerifyKOEventToTableStorage-test-logger");
+ LogHandler logHandler = new LogHandler();
+ logger.addHandler(logHandler);
+ when(context.getLogger()).thenReturn(logger);
+
+ // generating input
+ String eventInStringForm = TestUtil.readStringFromFile("events/event_ko_1.json");
+ List events = new ArrayList<>();
+ events.add(eventInStringForm);
+ Map[] properties = new HashMap[1];
+ properties[0] = new HashMap<>();
+ properties[0].put("prop1_without_dash", true);
+ properties[0].put("prop1-with-dash", "1");
+
+ // execute logic
+ NodoVerifyKOEventToTableStorage function = new NodoVerifyKOEventToTableStorage();
+ function.processNodoVerifyKOEvent(events, properties, context);
+
+ // test assertion
+ assertTrue(logHandler.getLogs().contains("java.lang.IllegalArgumentException: The field [faultBean.timestamp] does not exists in the passed event."));
+ }
+
+ @Test
+ @SneakyThrows
+ void runKo_genericError() {
+ // mocking objects
+ ExecutionContext context = mock(ExecutionContext.class);
+ Logger logger = Logger.getLogger("NodoVerifyKOEventToDataStore-test-logger");
+ LogHandler logHandler = new LogHandler();
+ logger.addHandler(logHandler);
+ when(context.getLogger()).thenReturn(logger);
+
+ // generating input
+ String eventInStringForm = TestUtil.readStringFromFile("events/event_ok_1.json");
+ List events = new ArrayList<>();
+ events.add(eventInStringForm);
+
+ // execute logic
+ NodoVerifyKOEventToTableStorage function = spy(NodoVerifyKOEventToTableStorage.class);
+ function.processNodoVerifyKOEvent(events, null, context);
+
+ // test assertion
+ assertTrue(logHandler.getLogs().contains("[ALERT][VerifyKOToTS] AppException - Generic exception on table storage nodo-verify-ko-events msg ingestion"));
+ }
+}
diff --git a/src/test/java/it/gov/pagopa/nodoverifykototablestorage/util/LogHandler.java b/src/test/java/it/gov/pagopa/nodoverifykototablestorage/util/LogHandler.java
new file mode 100644
index 0000000..0da8f5b
--- /dev/null
+++ b/src/test/java/it/gov/pagopa/nodoverifykototablestorage/util/LogHandler.java
@@ -0,0 +1,32 @@
+package it.gov.pagopa.nodoverifykototablestorage.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
diff --git a/src/test/java/it/gov/pagopa/nodoverifykototablestorage/util/TestUtil.java b/src/test/java/it/gov/pagopa/nodoverifykototablestorage/util/TestUtil.java
new file mode 100644
index 0000000..51a7da3
--- /dev/null
+++ b/src/test/java/it/gov/pagopa/nodoverifykototablestorage/util/TestUtil.java
@@ -0,0 +1,18 @@
+package it.gov.pagopa.nodoverifykototablestorage.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/META-INF/maven/it.gov.pagopa/nodoverifykototablestorage/pom.properties b/src/test/resources/META-INF/maven/it.gov.pagopa/nodoverifykototablestorage/pom.properties
new file mode 100644
index 0000000..e4792bb
--- /dev/null
+++ b/src/test/resources/META-INF/maven/it.gov.pagopa/nodoverifykototablestorage/pom.properties
@@ -0,0 +1,5 @@
+#Generated by Maven
+#Fri Jul 07 10:12:25 CEST 2023
+groupId=it.gov.pagopa
+artifactId=nodoverifykototablestorage
+version=x.y.z
\ No newline at end of file
diff --git a/src/test/resources/events/event_ko_1.json b/src/test/resources/events/event_ko_1.json
new file mode 100644
index 0000000..6d8c1be
--- /dev/null
+++ b/src/test/resources/events/event_ko_1.json
@@ -0,0 +1,20 @@
+{
+ "id": "uuid-003",
+ "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"
+ }
+}
\ No newline at end of file
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..22a1886
--- /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": 1672570800000
+ }
+}
\ No newline at end of file
diff --git a/src/test/resources/events/event_ok_2.json b/src/test/resources/events/event_ok_2.json
new file mode 100644
index 0000000..af4eb47
--- /dev/null
+++ b/src/test/resources/events/event_ok_2.json
@@ -0,0 +1,25 @@
+{
+ "id": "uuid-002",
+ "version": "2",
+ "debtorPosition": {
+ "modelType": "2",
+ "noticeNumber": "302040000090000001",
+ "amount": "100.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-02T12:00:00",
+ "timestamp": 1672657200000
+ }
+}
\ No newline at end of file
diff --git a/src/test/resources/mockito-extensions /org.mockito.plugins.MockMaker b/src/test/resources/mockito-extensions /org.mockito.plugins.MockMaker
new file mode 100644
index 0000000..ca6ee9c
--- /dev/null
+++ b/src/test/resources/mockito-extensions /org.mockito.plugins.MockMaker
@@ -0,0 +1 @@
+mock-maker-inline
\ No newline at end of file