diff --git a/src/main/java/it/gov/pagopa/reporting/Info.java b/src/main/java/it/gov/pagopa/reporting/Info.java index fafc1d1..3290b37 100644 --- a/src/main/java/it/gov/pagopa/reporting/Info.java +++ b/src/main/java/it/gov/pagopa/reporting/Info.java @@ -4,9 +4,13 @@ import com.microsoft.azure.functions.annotation.AuthorizationLevel; import com.microsoft.azure.functions.annotation.FunctionName; import com.microsoft.azure.functions.annotation.HttpTrigger; +import it.gov.pagopa.reporting.models.AppInfo; +import java.io.InputStream; import java.util.Optional; +import java.util.Properties; import java.util.logging.Level; +import java.util.logging.Logger; /** @@ -28,7 +32,25 @@ public HttpResponseMessage run ( context.getLogger().log(Level.INFO, "Invoked health check HTTP trigger for pagopa-gpd-reporting-batch."); return request.createResponseBuilder(HttpStatus.OK) - .header("Content-Type", "application/json") - .build(); + .header("Content-Type", "application/json") + .body(getInfo(context.getLogger(), "/META-INF/maven/it.gov.pagopa.reporting/reporting-batch/pom.properties")) + .build(); + } + + public synchronized AppInfo getInfo(Logger logger, String path) { + String version = null; + String name = null; + try { + Properties properties = new Properties(); + InputStream inputStream = getClass().getResourceAsStream(path); + if (inputStream != null) { + properties.load(inputStream); + version = properties.getProperty("version", null); + name = properties.getProperty("artifactId", null); + } + } catch (Exception e) { + logger.severe("Impossible to retrieve information from pom.properties file."); + } + return AppInfo.builder().version(version).environment("aks").name(name).build(); } } diff --git a/src/main/java/it/gov/pagopa/reporting/models/AppInfo.java b/src/main/java/it/gov/pagopa/reporting/models/AppInfo.java new file mode 100644 index 0000000..b767396 --- /dev/null +++ b/src/main/java/it/gov/pagopa/reporting/models/AppInfo.java @@ -0,0 +1,18 @@ +package it.gov.pagopa.reporting.models; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonInclude; +import lombok.*; + +@Data +@Builder(toBuilder = true) +@NoArgsConstructor +@AllArgsConstructor(access = AccessLevel.PRIVATE) +@JsonInclude(JsonInclude.Include.NON_NULL) +@JsonIgnoreProperties(ignoreUnknown = true) +public class AppInfo { + + private String name; + private String version; + private String environment; +} diff --git a/src/test/java/it/gov/pagopa/reporting/InfoTest.java b/src/test/java/it/gov/pagopa/reporting/InfoTest.java new file mode 100644 index 0000000..63175bd --- /dev/null +++ b/src/test/java/it/gov/pagopa/reporting/InfoTest.java @@ -0,0 +1,88 @@ +package it.gov.pagopa.reporting; + +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.reporting.models.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 java.util.Optional; +import java.util.logging.Logger; + +import static org.junit.jupiter.api.Assertions.*; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.anyString; +import static org.mockito.Mockito.doReturn; +import static org.mockito.Mockito.mock; + +@ExtendWith(MockitoExtension.class) +class InfoTest { + + @Mock + ExecutionContext context; + + @Spy + Info infoFunction; + + @Test + void runOK() { + // 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("example-test-logger"); + String path = "/META-INF/maven/it.gov.pagopa.reporting/reporting-batch/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("example-test-logger"); + String path = "/META-INF/maven/it.gov.pagopa.reporting/reporting-batch/fake"; + + // Execute function + AppInfo response = infoFunction.getInfo(logger, path); + + // Checking assertions + assertNull(response.getName()); + assertNull(response.getVersion()); + assertNotNull(response.getEnvironment()); + } + +} diff --git a/src/test/resources/META-INF/maven/it.gov.pagopa.reporting/reporting-batch/pom.properties b/src/test/resources/META-INF/maven/it.gov.pagopa.reporting/reporting-batch/pom.properties new file mode 100644 index 0000000..6ce47e7 --- /dev/null +++ b/src/test/resources/META-INF/maven/it.gov.pagopa.reporting/reporting-batch/pom.properties @@ -0,0 +1,5 @@ +#Generated by Maven +#Fri Jul 07 10:12:25 CEST 2023 +artifactId=reporting-batch +groupId=it.gov.pagopa.reporting +version=x.y.z