From 004337dca6b7d64904de3cae21e7751d3bccf8e7 Mon Sep 17 00:00:00 2001 From: George Tziavas Date: Thu, 19 Jun 2025 18:25:05 +0300 Subject: [PATCH 1/3] Increased coverage to 53% --- pom.xml | 6 + .../etsi/osl/metrico/DummyRouteBuilder.java | 53 -------- .../org/etsi/osl/metrico/JsonUtilTest.java | 10 ++ .../osl/metrico/MetricoCommonMethodsTest.java | 122 ++++++++++++++++++ .../prometheus/PrometheusQueriesTest.java | 28 ++++ .../MetricoServiceRouteBuilderTest.java | 46 +++++++ .../metrico/services/MetricoServiceTest.java | 110 ++++++++++++++++ 7 files changed, 322 insertions(+), 53 deletions(-) delete mode 100644 src/test/java/org/etsi/osl/metrico/DummyRouteBuilder.java create mode 100644 src/test/java/org/etsi/osl/metrico/MetricoCommonMethodsTest.java create mode 100644 src/test/java/org/etsi/osl/metrico/services/MetricoServiceRouteBuilderTest.java diff --git a/pom.xml b/pom.xml index f32a9d6..2149fc8 100644 --- a/pom.xml +++ b/pom.xml @@ -232,6 +232,12 @@ 1.2.0-SNAPSHOT compile + + org.apache.camel + camel-test-spring-junit5 + 3.20.2 + test + diff --git a/src/test/java/org/etsi/osl/metrico/DummyRouteBuilder.java b/src/test/java/org/etsi/osl/metrico/DummyRouteBuilder.java deleted file mode 100644 index fb5d771..0000000 --- a/src/test/java/org/etsi/osl/metrico/DummyRouteBuilder.java +++ /dev/null @@ -1,53 +0,0 @@ -package org.etsi.osl.metrico; - -import org.apache.camel.builder.RouteBuilder; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.context.annotation.Profile; -import org.springframework.stereotype.Component; - -@Profile("testing") -@Component -public class DummyRouteBuilder extends RouteBuilder { - private static final Logger logger = LoggerFactory.getLogger(DummyRouteBuilder.class); - - @Value("${PM_MEASUREMENT_COLLECTION_JOB_UPDATE}") - private String PM_MEASUREMENT_COLLECTION_JOB_UPDATE = ""; - @Value("${PM_MEASUREMENT_COLLECTION_GET_JOB_BY_ID}") - private String PM_MEASUREMENT_COLLECTION_GET_JOB_BY_ID = ""; - @Value("${PM_MEASUREMENT_COLLECTION_JOBS_GET}") - private String PM_MEASUREMENT_COLLECTION_JOBS_GET = ""; - @Value("${CATALOG_GET_SERVICE_BY_ID}") - private String CATALOG_GET_SERVICE_BY_ID = ""; - @Value("${CATALOG_UPD_SERVICE}") - private String CATALOG_UPD_SERVICE = ""; - @Value("${CATALOG_GET_RESOURCE_BY_ID}") - private String CATALOG_GET_RESOURCE_BY_ID = ""; - @Value("${CATALOG_UPD_RESOURCE}") - private String CATALOG_UPD_RESOURCE = ""; - @Value("${CATALOG_UPDADD_RESOURCESPEC}") - private String CATALOG_UPDADD_RESOURCESPEC = ""; - - private final String measurementCollectionJobJson = "{\n" + - " \"outputFormat\": \"JSON\",\n" + - " \"@type\": \"MeasurementCollectionJob\",\n" + - " \"consumingApplicationId\": \"app123\",\n" + - " \"producingApplicationId\": \"app456\",\n" + - " \"dataAccessEndpoint\": [],\n" + - " \"jobPriority\": 1,\n" + - " \"lastModifiedTime\": \"2023-01-01T00:00:00Z\",\n" + - " \"scheduleDefinition\": []\n" + - "}"; - - @Override - public void configure() throws Exception { - logger.info("Configuring dummy routes..."); - - from("direct:PM.MEASUREMENTCOLLECTIONJOB.GET_BY_ID") - .process(exchange -> { - logger.info("Processing GET_BY_ID route"); - exchange.getIn().setBody(measurementCollectionJobJson); - }); - } -} \ No newline at end of file diff --git a/src/test/java/org/etsi/osl/metrico/JsonUtilTest.java b/src/test/java/org/etsi/osl/metrico/JsonUtilTest.java index b84de03..944e252 100644 --- a/src/test/java/org/etsi/osl/metrico/JsonUtilTest.java +++ b/src/test/java/org/etsi/osl/metrico/JsonUtilTest.java @@ -44,4 +44,14 @@ class JsonUtilTest { assertNull(jsonString); } + @Test + void toJsonString_unserializableObject_returnsNull() { + class SelfRef { + public SelfRef ref; + } + SelfRef obj = new SelfRef(); + obj.ref = obj; // creates a circular reference + String jsonString = JsonUtil.toJsonString(obj); + assertNull(jsonString); + } } \ No newline at end of file diff --git a/src/test/java/org/etsi/osl/metrico/MetricoCommonMethodsTest.java b/src/test/java/org/etsi/osl/metrico/MetricoCommonMethodsTest.java new file mode 100644 index 0000000..bbe516e --- /dev/null +++ b/src/test/java/org/etsi/osl/metrico/MetricoCommonMethodsTest.java @@ -0,0 +1,122 @@ +//package org.etsi.osl.metrico; +// +//import com.fasterxml.jackson.databind.ObjectMapper; +//import org.apache.camel.ProducerTemplate; +//import org.etsi.osl.tmf.pm628.model.MeasurementCollectionJob; +//import org.etsi.osl.tmf.pm628.model.MeasurementCollectionJobMVO; +//import org.etsi.osl.tmf.pm628.model.MeasurementCollectionJobRef; +//import org.etsi.osl.tmf.rcm634.model.LogicalResourceSpecification; +//import org.etsi.osl.tmf.rcm634.model.ResourceSpecificationCreate; +//import org.etsi.osl.tmf.ri639.model.ResourceUpdate; +//import org.etsi.osl.tmf.sim638.model.Service; +//import org.etsi.osl.tmf.sim638.model.ServiceUpdate; +//import org.junit.jupiter.api.BeforeEach; +//import org.junit.jupiter.api.Test; +//import org.mockito.ArgumentMatchers; +//import org.mockito.MockedStatic; +// +//import java.lang.reflect.Field; +//import java.util.Collections; +//import java.util.List; +// +//import static org.junit.jupiter.api.Assertions.*; +//import static org.mockito.Mockito.*; +// +//class MetricoCommonMethodsTest { +// +// private ProducerTemplate template; +// private MetricoCommonMethods methods; +// +// @BeforeEach +// void setUp() { +// template = mock(ProducerTemplate.class); +// methods = new MetricoCommonMethods(template); +// } +// +//// @Test +//// void testValueAnnotationsInjected() { +//// assertEquals("direct:PM.MEASUREMENTCOLLECTIONJOB.UPDATE", methods.PM_MEASUREMENT_COLLECTION_JOB_UPDATE); +//// assertEquals("direct:PM.MEASUREMENTCOLLECTIONJOB.GET_BY_ID", methods.PM_MEASUREMENT_COLLECTION_GET_JOB_BY_ID); +//// assertEquals("direct:PM.MEASUREMENTCOLLECTIONJOBS.GET", methods.PM_MEASUREMENT_COLLECTION_JOBS_GET); +//// assertEquals("direct:CATALOG.GET.SERVICE", methods.CATALOG_GET_SERVICE_BY_ID); +//// assertEquals("direct:CATALOG.UPD.SERVICE", methods.CATALOG_UPD_SERVICE); +//// assertEquals("direct:CATALOG.GET.RESOURCE", methods.CATALOG_GET_RESOURCE_BY_ID); +//// assertEquals("direct:CATALOG.UPD.RESOURCE", methods.CATALOG_UPD_RESOURCE); +//// assertEquals("direct:CATALOG.UPDADD.RESOURCESPEC", methods.CATALOG_UPDADD_RESOURCESPEC); +//// assertEquals("jms:queue:PM.MEASUREMENTCOLLECTIONJOB.GET_INPROGRESS_OR_PENDING", methods.PM_MEASUREMENT_COLLECTION_JOB_GET_INPROGRESS_OR_PENDING); +//// } +// +// @Test +// void testRetrieveMeasurementCollectionJob() throws Exception { +// Field field = MetricoCommonMethods.class.getDeclaredField("PM_MEASUREMENT_COLLECTION_GET_JOB_BY_ID"); +// field.setAccessible(true); +// field.set(methods, "someUri"); +// +// MeasurementCollectionJob job = new MeasurementCollectionJob(); +// String jobJson = new ObjectMapper().writeValueAsString(job); +// when(template.requestBody((Object) eq("someUri"), any())).thenReturn(jobJson); +// +// try (MockedStatic jsonUtilMock = mockStatic(JsonUtil.class)) { +// jsonUtilMock.when(() -> JsonUtil.toJsonObj(jobJson, MeasurementCollectionJob.class)).thenReturn(job); +// +// MeasurementCollectionJob result = methods.retrieveMeasurementCollectionJob("id1"); +// assertNotNull(result); +// } +// } +// +// @Test +// void testRetrieveMeasurementCollectionJobByRef() throws Exception { +// MeasurementCollectionJobRef ref = new MeasurementCollectionJobRef(); +// ref.setId("id2"); +// MeasurementCollectionJob job = new MeasurementCollectionJob(); +// String jobJson = new ObjectMapper().writeValueAsString(job); +// when(template.requestBody((Object) anyString(), any())).thenReturn(jobJson); +// +// MeasurementCollectionJob result = methods.retrieveMeasurementCollectionJob(ref); +// assertNotNull(result); +// } +// +// @Test +// void testListMeasurementCollectionJob() throws Exception { +// MeasurementCollectionJob job = new MeasurementCollectionJob(); +// List jobs = Collections.singletonList(job); +// String jobsJson = new ObjectMapper().writeValueAsString(jobs); +// when(template.requestBody((Object) anyString(), any())).thenReturn(jobsJson); +// +// List result = methods.listMeasurementCollectionJob(); +// assertNotNull(result); +// assertEquals(1, result.size()); +// } +// +// @Test +// void testUpdateService() throws Exception { +// ServiceUpdate update = new ServiceUpdate(); +// Service service = new Service(); +// String serviceJson = new ObjectMapper().writeValueAsString(service); +// when(template.requestBodyAndHeaders(anyString(), any(), anyMap())).thenReturn(serviceJson); +// +// Service result = methods.updateService("serviceId", update, true); +// assertNotNull(result); +// } +// +// @Test +// void testCreateOrUpdateResourceSpecByNameCategoryVersion() throws Exception { +// ResourceSpecificationCreate create = new ResourceSpecificationCreate(); +// LogicalResourceSpecification spec = new LogicalResourceSpecification(); +// String specJson = new ObjectMapper().writeValueAsString(spec); +// when(template.requestBodyAndHeaders(anyString(), any(), anyMap())).thenReturn(specJson); +// +// LogicalResourceSpecification result = methods.createOrUpdateResourceSpecByNameCategoryVersion(create); +// assertNotNull(result); +// } +// +// @Test +// void testUpdateResourceById() throws Exception { +// ResourceUpdate update = new ResourceUpdate(); +// LogicalResourceSpecification resource = new LogicalResourceSpecification(); +// String resourceJson = new ObjectMapper().writeValueAsString(resource); +// when(template.requestBodyAndHeaders(anyString(), any(), anyMap())).thenReturn(resourceJson); +// +// assertNotNull(methods.updateResourceById("resourceId", update)); +// } +//} \ No newline at end of file diff --git a/src/test/java/org/etsi/osl/metrico/prometheus/PrometheusQueriesTest.java b/src/test/java/org/etsi/osl/metrico/prometheus/PrometheusQueriesTest.java index 066e18c..864af40 100644 --- a/src/test/java/org/etsi/osl/metrico/prometheus/PrometheusQueriesTest.java +++ b/src/test/java/org/etsi/osl/metrico/prometheus/PrometheusQueriesTest.java @@ -7,10 +7,14 @@ import org.etsi.osl.tmf.pm628.model.ExecutionStateType; import org.etsi.osl.tmf.pm628.model.MeasurementCollectionJob; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; +import org.mockito.MockedStatic; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.lang.reflect.Field; +import java.time.OffsetDateTime; +import java.util.concurrent.ScheduledExecutorService; +import java.util.concurrent.TimeUnit; import static org.junit.jupiter.api.Assertions.*; import static org.mockito.Mockito.*; @@ -121,4 +125,28 @@ class PrometheusQueriesTest { verify(metricoCommonMethods).updateService(eq("service-uuid"), any(), eq(true)); } + @Test + void testStartPeriodicQuery_SchedulesStopJobWhenEndDateTimePresent() { + Job job = new Job(); + job.setExecutionInterval(100); + job.setEndDateTime(OffsetDateTime.now().plusSeconds(61)); + MeasurementCollectionJob mcj = new MeasurementCollectionJob(); + + ScheduledExecutorService scheduler = mock(ScheduledExecutorService.class); + + try (MockedStatic jobServiceStatic = mockStatic(JobService.class)) { + jobServiceStatic.when(JobService::getScheduler).thenReturn(scheduler); + + when(jobService.startJob(any(Runnable.class), any(Job.class))).thenAnswer(invocation -> { + Job j = invocation.getArgument(1); + j.setState(ExecutionStateType.INPROGRESS); + return j; + }); + + prometheusQueries.startPeriodicQuery("http://localhost:9090", "query=up", job, mcj); + + verify(scheduler).schedule(any(Runnable.class), eq(60L), eq(TimeUnit.SECONDS)); + } + } + } \ No newline at end of file diff --git a/src/test/java/org/etsi/osl/metrico/services/MetricoServiceRouteBuilderTest.java b/src/test/java/org/etsi/osl/metrico/services/MetricoServiceRouteBuilderTest.java new file mode 100644 index 0000000..00da713 --- /dev/null +++ b/src/test/java/org/etsi/osl/metrico/services/MetricoServiceRouteBuilderTest.java @@ -0,0 +1,46 @@ +package org.etsi.osl.metrico.services; + +import com.fasterxml.jackson.databind.ObjectMapper; +import org.apache.camel.CamelContext; +import org.apache.camel.ProducerTemplate; +import org.apache.camel.test.spring.junit5.CamelSpringBootTest; +import org.etsi.osl.metrico.MetricoCommonMethods; +import org.etsi.osl.tmf.pm628.model.MeasurementCollectionJob; +import org.etsi.osl.tmf.pm628.model.MeasurementCollectionJobCreateEvent; +import org.junit.jupiter.api.Test; +import org.mockito.ArgumentCaptor; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.boot.test.mock.mockito.MockBean; +import org.springframework.test.context.TestPropertySource; + +import static org.mockito.Mockito.*; + +@CamelSpringBootTest +@SpringBootTest +@TestPropertySource(properties = { + "EVENT_MEASUREMENT_COLLECTION_JOB_CREATE=direct:eventMeasurementCollectionJobCreate" +}) +class MetricoServiceRouteBuilderTest { + + @Autowired + private ProducerTemplate producerTemplate; + + @MockBean + private MetricoService metricoService; + + @MockBean + private MetricoCommonMethods metricoCommonMethods; + + @Test + void testRouteCallsMetricoService() throws Exception { + ObjectMapper objectMapper = new ObjectMapper(); + MeasurementCollectionJobCreateEvent event = new MeasurementCollectionJobCreateEvent(); + String eventJson = objectMapper.writeValueAsString(event); + + producerTemplate.sendBody("direct:eventMeasurementCollectionJobCreate", eventJson); + + ArgumentCaptor captor = ArgumentCaptor.forClass(MeasurementCollectionJobCreateEvent.class); + verify(metricoService, timeout(1000)).startPeriodicQueryToPrometheusEvent(captor.capture()); + } +} \ No newline at end of file diff --git a/src/test/java/org/etsi/osl/metrico/services/MetricoServiceTest.java b/src/test/java/org/etsi/osl/metrico/services/MetricoServiceTest.java index 70f9ba9..b742298 100644 --- a/src/test/java/org/etsi/osl/metrico/services/MetricoServiceTest.java +++ b/src/test/java/org/etsi/osl/metrico/services/MetricoServiceTest.java @@ -170,4 +170,114 @@ class MetricoServiceTest { verify(metricoCommonMethods).retrieveMeasurementCollectionJob("123e4567-e89b-12d3-a456-426614174002"); } + + + @Test + void testRestartPendingOrInProgressJobs_skipsJobWithNoDataAccessEndpoint() { + MeasurementCollectionJob mcj = validMCJ(); + mcj.setDataAccessEndpoint(null); + + ArrayList mcjList = new ArrayList<>(); + mcjList.add(mcj); + + when(metricoCommonMethods.listPendingOrInProgressMeasurementCollectionJobs()) + .thenReturn(mcjList); + when(metricoCommonMethods.retrieveMeasurementCollectionJob(mcj.getUuid())) + .thenReturn(mcj); + + metricoService.restartPendingOrInProgressJobs(); + + verify(metricoCommonMethods).updateMeasurementCollectionJobById(eq(mcj.getUuid()), any(MeasurementCollectionJobMVO.class)); + verify(jobService).stopAllJobs(); + } + + @Test + void testRestartPendingOrInProgressJobs_skipsJobWithMultipleDataAccessEndpoints() { + MeasurementCollectionJob mcj = validMCJ(); + DataAccessEndpoint dae2 = new DataAccessEndpoint(); + dae2.setUuid(UUID.randomUUID().toString()); + dae2.setApiType("Prometheus"); + dae2.setUri(URI.create("http://localhost:9091/api/v1/query?query=down")); + List endpoints = new ArrayList<>(mcj.getDataAccessEndpoint()); + endpoints.add(dae2); + mcj.setDataAccessEndpoint(endpoints); + + ArrayList mcjList = new ArrayList<>(); + mcjList.add(mcj); + + when(metricoCommonMethods.listPendingOrInProgressMeasurementCollectionJobs()) + .thenReturn(mcjList); + when(metricoCommonMethods.retrieveMeasurementCollectionJob(mcj.getUuid())) + .thenReturn(mcj); + + metricoService.restartPendingOrInProgressJobs(); + + verify(metricoCommonMethods).updateMeasurementCollectionJobById(eq(mcj.getUuid()), any(MeasurementCollectionJobMVO.class)); + verify(jobService).stopAllJobs(); + } + + @Test + void testRestartPendingOrInProgressJobs_skipsJobWithMultipleScheduleDefinitions() { + MeasurementCollectionJob mcj = validMCJ(); + ScheduleDefinition schedule2 = new ScheduleDefinition(); + schedule2.setScheduleDefinitionStartTime(OffsetDateTime.now().plusSeconds(2)); + schedule2.setScheduleDefinitionEndTime(OffsetDateTime.now().plusHours(2)); + List schedules = new ArrayList<>(mcj.getScheduleDefinition()); + schedules.add(schedule2); + mcj.setScheduleDefinition(schedules); + + ArrayList mcjList = new ArrayList<>(); + mcjList.add(mcj); + + when(metricoCommonMethods.listPendingOrInProgressMeasurementCollectionJobs()) + .thenReturn(mcjList); + when(metricoCommonMethods.retrieveMeasurementCollectionJob(mcj.getUuid())) + .thenReturn(mcj); + + metricoService.restartPendingOrInProgressJobs(); + + verify(metricoCommonMethods).updateMeasurementCollectionJobById(eq(mcj.getUuid()), any(MeasurementCollectionJobMVO.class)); + verify(jobService).stopAllJobs(); + } + + @Test + void testRestartPendingOrInProgressJobs_skipsJobWithEndedScheduleDefinition() { + MeasurementCollectionJob mcj = validMCJ(); + OffsetDateTime start = OffsetDateTime.now().minusHours(2); + OffsetDateTime end = OffsetDateTime.now().minusHours(1); + mcj.getScheduleDefinition().get(0).setScheduleDefinitionStartTime(start); + mcj.getScheduleDefinition().get(0).setScheduleDefinitionEndTime(end); + + ArrayList mcjList = new ArrayList<>(); + mcjList.add(mcj); + + when(metricoCommonMethods.listPendingOrInProgressMeasurementCollectionJobs()) + .thenReturn(mcjList); + when(metricoCommonMethods.retrieveMeasurementCollectionJob(mcj.getUuid())) + .thenReturn(mcj); + + metricoService.restartPendingOrInProgressJobs(); + + verify(metricoCommonMethods).updateMeasurementCollectionJobById(eq(mcj.getUuid()), any(MeasurementCollectionJobMVO.class)); + verify(jobService).stopAllJobs(); + } + + @Test + void testRestartPendingOrInProgressJobs_jobWithNoScheduleDefinition_addsAndSkipsIfEnded() { + MeasurementCollectionJob mcj = validMCJ(); + mcj.setScheduleDefinition(new ArrayList<>()); // No schedule definitions + mcj.setCreationTime(OffsetDateTime.now().minusHours(2)); + ArrayList mcjList = new ArrayList<>(); + mcjList.add(mcj); + + when(metricoCommonMethods.listPendingOrInProgressMeasurementCollectionJobs()) + .thenReturn(mcjList); + when(metricoCommonMethods.retrieveMeasurementCollectionJob(mcj.getUuid())) + .thenReturn(mcj); + + metricoService.restartPendingOrInProgressJobs(); + + verify(metricoCommonMethods).updateMeasurementCollectionJobById(eq(mcj.getUuid()), any(MeasurementCollectionJobMVO.class)); + verify(jobService).stopAllJobs(); + } } \ No newline at end of file -- GitLab From d7f6b3f068506818c721f46c79a14c60d8a1ea0b Mon Sep 17 00:00:00 2001 From: George Tziavas Date: Mon, 23 Jun 2025 16:22:06 +0300 Subject: [PATCH 2/3] common methods tests scafold - not running --- .../osl/metrico/MetricoCommonMethodsTest.java | 390 ++++++++++++------ 1 file changed, 268 insertions(+), 122 deletions(-) diff --git a/src/test/java/org/etsi/osl/metrico/MetricoCommonMethodsTest.java b/src/test/java/org/etsi/osl/metrico/MetricoCommonMethodsTest.java index bbe516e..7d9de0b 100644 --- a/src/test/java/org/etsi/osl/metrico/MetricoCommonMethodsTest.java +++ b/src/test/java/org/etsi/osl/metrico/MetricoCommonMethodsTest.java @@ -1,122 +1,268 @@ -//package org.etsi.osl.metrico; -// -//import com.fasterxml.jackson.databind.ObjectMapper; -//import org.apache.camel.ProducerTemplate; -//import org.etsi.osl.tmf.pm628.model.MeasurementCollectionJob; -//import org.etsi.osl.tmf.pm628.model.MeasurementCollectionJobMVO; -//import org.etsi.osl.tmf.pm628.model.MeasurementCollectionJobRef; -//import org.etsi.osl.tmf.rcm634.model.LogicalResourceSpecification; -//import org.etsi.osl.tmf.rcm634.model.ResourceSpecificationCreate; -//import org.etsi.osl.tmf.ri639.model.ResourceUpdate; -//import org.etsi.osl.tmf.sim638.model.Service; -//import org.etsi.osl.tmf.sim638.model.ServiceUpdate; -//import org.junit.jupiter.api.BeforeEach; -//import org.junit.jupiter.api.Test; -//import org.mockito.ArgumentMatchers; -//import org.mockito.MockedStatic; -// -//import java.lang.reflect.Field; -//import java.util.Collections; -//import java.util.List; -// -//import static org.junit.jupiter.api.Assertions.*; -//import static org.mockito.Mockito.*; -// -//class MetricoCommonMethodsTest { -// -// private ProducerTemplate template; -// private MetricoCommonMethods methods; -// -// @BeforeEach -// void setUp() { -// template = mock(ProducerTemplate.class); -// methods = new MetricoCommonMethods(template); -// } -// -//// @Test -//// void testValueAnnotationsInjected() { -//// assertEquals("direct:PM.MEASUREMENTCOLLECTIONJOB.UPDATE", methods.PM_MEASUREMENT_COLLECTION_JOB_UPDATE); -//// assertEquals("direct:PM.MEASUREMENTCOLLECTIONJOB.GET_BY_ID", methods.PM_MEASUREMENT_COLLECTION_GET_JOB_BY_ID); -//// assertEquals("direct:PM.MEASUREMENTCOLLECTIONJOBS.GET", methods.PM_MEASUREMENT_COLLECTION_JOBS_GET); -//// assertEquals("direct:CATALOG.GET.SERVICE", methods.CATALOG_GET_SERVICE_BY_ID); -//// assertEquals("direct:CATALOG.UPD.SERVICE", methods.CATALOG_UPD_SERVICE); -//// assertEquals("direct:CATALOG.GET.RESOURCE", methods.CATALOG_GET_RESOURCE_BY_ID); -//// assertEquals("direct:CATALOG.UPD.RESOURCE", methods.CATALOG_UPD_RESOURCE); -//// assertEquals("direct:CATALOG.UPDADD.RESOURCESPEC", methods.CATALOG_UPDADD_RESOURCESPEC); -//// assertEquals("jms:queue:PM.MEASUREMENTCOLLECTIONJOB.GET_INPROGRESS_OR_PENDING", methods.PM_MEASUREMENT_COLLECTION_JOB_GET_INPROGRESS_OR_PENDING); -//// } -// -// @Test -// void testRetrieveMeasurementCollectionJob() throws Exception { -// Field field = MetricoCommonMethods.class.getDeclaredField("PM_MEASUREMENT_COLLECTION_GET_JOB_BY_ID"); -// field.setAccessible(true); -// field.set(methods, "someUri"); -// -// MeasurementCollectionJob job = new MeasurementCollectionJob(); -// String jobJson = new ObjectMapper().writeValueAsString(job); -// when(template.requestBody((Object) eq("someUri"), any())).thenReturn(jobJson); -// -// try (MockedStatic jsonUtilMock = mockStatic(JsonUtil.class)) { -// jsonUtilMock.when(() -> JsonUtil.toJsonObj(jobJson, MeasurementCollectionJob.class)).thenReturn(job); -// -// MeasurementCollectionJob result = methods.retrieveMeasurementCollectionJob("id1"); -// assertNotNull(result); -// } -// } -// -// @Test -// void testRetrieveMeasurementCollectionJobByRef() throws Exception { -// MeasurementCollectionJobRef ref = new MeasurementCollectionJobRef(); -// ref.setId("id2"); -// MeasurementCollectionJob job = new MeasurementCollectionJob(); -// String jobJson = new ObjectMapper().writeValueAsString(job); -// when(template.requestBody((Object) anyString(), any())).thenReturn(jobJson); -// -// MeasurementCollectionJob result = methods.retrieveMeasurementCollectionJob(ref); -// assertNotNull(result); -// } -// -// @Test -// void testListMeasurementCollectionJob() throws Exception { -// MeasurementCollectionJob job = new MeasurementCollectionJob(); -// List jobs = Collections.singletonList(job); -// String jobsJson = new ObjectMapper().writeValueAsString(jobs); -// when(template.requestBody((Object) anyString(), any())).thenReturn(jobsJson); -// -// List result = methods.listMeasurementCollectionJob(); -// assertNotNull(result); -// assertEquals(1, result.size()); -// } -// -// @Test -// void testUpdateService() throws Exception { -// ServiceUpdate update = new ServiceUpdate(); -// Service service = new Service(); -// String serviceJson = new ObjectMapper().writeValueAsString(service); -// when(template.requestBodyAndHeaders(anyString(), any(), anyMap())).thenReturn(serviceJson); -// -// Service result = methods.updateService("serviceId", update, true); -// assertNotNull(result); -// } -// -// @Test -// void testCreateOrUpdateResourceSpecByNameCategoryVersion() throws Exception { -// ResourceSpecificationCreate create = new ResourceSpecificationCreate(); -// LogicalResourceSpecification spec = new LogicalResourceSpecification(); -// String specJson = new ObjectMapper().writeValueAsString(spec); -// when(template.requestBodyAndHeaders(anyString(), any(), anyMap())).thenReturn(specJson); -// -// LogicalResourceSpecification result = methods.createOrUpdateResourceSpecByNameCategoryVersion(create); -// assertNotNull(result); -// } -// -// @Test -// void testUpdateResourceById() throws Exception { -// ResourceUpdate update = new ResourceUpdate(); -// LogicalResourceSpecification resource = new LogicalResourceSpecification(); -// String resourceJson = new ObjectMapper().writeValueAsString(resource); -// when(template.requestBodyAndHeaders(anyString(), any(), anyMap())).thenReturn(resourceJson); -// -// assertNotNull(methods.updateResourceById("resourceId", update)); -// } -//} \ No newline at end of file +package org.etsi.osl.metrico; + +import com.fasterxml.jackson.databind.ObjectMapper; +import org.apache.camel.ProducerTemplate; +import org.apache.camel.RoutesBuilder; +import org.apache.camel.builder.RouteBuilder; +import org.etsi.osl.tmf.pm628.model.MeasurementCollectionJob; +import org.etsi.osl.tmf.pm628.model.MeasurementCollectionJobMVO; +import org.etsi.osl.tmf.pm628.model.MeasurementCollectionJobMapper; +import org.etsi.osl.tmf.pm628.model.MeasurementCollectionJobRef; +import org.etsi.osl.tmf.rcm634.model.LogicalResourceSpecification; +import org.etsi.osl.tmf.rcm634.model.ResourceSpecificationCreate; +import org.etsi.osl.tmf.ri639.model.ResourceUpdate; +import org.etsi.osl.tmf.sim638.model.Service; +import org.etsi.osl.tmf.sim638.model.ServiceUpdate; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.mapstruct.factory.Mappers; +import org.mockito.MockedStatic; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.ActiveProfiles; + +import java.lang.reflect.Field; +import java.util.Collections; +import java.util.List; + +import static org.junit.jupiter.api.Assertions.*; +import static org.mockito.Mockito.*; + +@SpringBootTest(properties = { + "PM_MEASUREMENT_COLLECTION_JOB_UPDATE = direct:PM.MEASUREMENTCOLLECTIONJOB.UPDATE", + "PM_MEASUREMENT_COLLECTION_GET_JOB_BY_ID = direct:PM.MEASUREMENTCOLLECTIONJOB.GET_BY_ID", + "PM_MEASUREMENT_COLLECTION_JOBS_GET = direct:PM.MEASUREMENTCOLLECTIONJOBS.GET", + "PM_MEASUREMENT_COLLECTION_JOB_GET_INPROGRESS_OR_PENDING = jms:queue:PM.MEASUREMENTCOLLECTIONJOB.GET_INPROGRESS_OR_PENDING", + "CATALOG_GET_SERVICE_BY_ID = direct:CATALOG.GET.SERVICE", + "CATALOG_UPD_SERVICE = direct:CATALOG.UPD.SERVICE", + "CATALOG_GET_RESOURCE_BY_ID = direct:CATALOG.GET.RESOURCE", + "CATALOG_UPD_RESOURCE = direct:CATALOG.UPD.RESOURCE", + "CATALOG_UPDADD_RESOURCESPEC = direct:CATALOG.UPDADD.RESOURCESPEC", +}) +@ActiveProfiles("testing") +class MetricoCommonMethodsTest { + + private ProducerTemplate template; + private MetricoCommonMethods methods; + + + RoutesBuilder builder = new RouteBuilder() { + @Override + public void configure() { + from("direct:PM.MEASUREMENTCOLLECTIONJOB.UPDATE").bean(MetricoCommonMethodsTest.class, "mockUpdateMeasurementCollectionJob(${header.mcjid}, ${body})"); + from("direct:PM.MEASUREMENTCOLLECTIONJOB.GET_BY_ID").bean(MetricoCommonMethodsTest.class, "mockFindMeasurementCollectionJobByUuidEagerAsString"); + from("direct:PM.MEASUREMENTCOLLECTIONJOBS.GET").bean(MetricoCommonMethodsTest.class, "mockFindAllMeasurementCollectionJobs"); + from("jms:queue:PM.MEASUREMENTCOLLECTIONJOB.GET_INPROGRESS_OR_PENDING").bean(MetricoCommonMethodsTest.class, "mockFindPendingOrInProgressMeasurementCollectionJobsAsJson"); + from("direct:CATALOG.GET.SERVICE").bean(MetricoCommonMethodsTest.class, "mockGetServiceEagerAsString"); + from("direct:CATALOG.UPD.SERVICE").bean(MetricoCommonMethodsTest.class, "mockUpdateService(${header.serviceid}, ${body}, ${header.triggerServiceActionQueue})"); + from("direct:CATALOG.GET.RESOURCE").bean(MetricoCommonMethodsTest.class, "getResourceEagerAsString"); + from("direct:CATALOG.UPD.RESOURCE").bean(MetricoCommonMethodsTest.class, "updateResource(${header.resourceId}, ${body}, ${header.triggerServiceActionQueue})"); + from("direct:CATALOG.UPDADD.RESOURCESPEC").bean(MetricoCommonMethodsTest.class, "addOrUpdateResourceSpecificationByNameCategoryVersion(${header.aname}, ${header.acategory}, ${header.aversion}, ${body})"); + } + }; + + @BeforeEach + void setUp() { + template = mock(ProducerTemplate.class); + methods = new MetricoCommonMethods(template); + } + + + @Test + void testRetrieveMeasurementCollectionJob() throws Exception { + Field field = MetricoCommonMethods.class.getDeclaredField("PM_MEASUREMENT_COLLECTION_GET_JOB_BY_ID"); + field.setAccessible(true); + field.set(methods, "someUri"); + + MeasurementCollectionJob job = new MeasurementCollectionJob(); + String jobJson = new ObjectMapper().writeValueAsString(job); + when(template.requestBody((Object) eq("someUri"), any())).thenReturn(jobJson); + + try (MockedStatic jsonUtilMock = mockStatic(JsonUtil.class)) { + jsonUtilMock.when(() -> JsonUtil.toJsonObj(jobJson, MeasurementCollectionJob.class)).thenReturn(job); + + MeasurementCollectionJob result = methods.retrieveMeasurementCollectionJob("id1"); + assertNotNull(result); + } + } + + @Test + void testRetrieveMeasurementCollectionJobByRef() throws Exception { + MeasurementCollectionJobRef ref = new MeasurementCollectionJobRef(); + ref.setId("id2"); + MeasurementCollectionJob job = new MeasurementCollectionJob(); + String jobJson = new ObjectMapper().writeValueAsString(job); + when(template.requestBody((Object) anyString(), any())).thenReturn(jobJson); + + MeasurementCollectionJob result = methods.retrieveMeasurementCollectionJob(ref); + assertNotNull(result); + } + + @Test + void testListMeasurementCollectionJob() throws Exception { + MeasurementCollectionJob job = new MeasurementCollectionJob(); + List jobs = Collections.singletonList(job); + String jobsJson = new ObjectMapper().writeValueAsString(jobs); + when(template.requestBody((Object) anyString(), any())).thenReturn(jobsJson); + + List result = methods.listMeasurementCollectionJob(); + assertNotNull(result); + assertEquals(1, result.size()); + } + + @Test + void testUpdateService() throws Exception { + ServiceUpdate update = new ServiceUpdate(); + Service service = new Service(); + String serviceJson = new ObjectMapper().writeValueAsString(service); + when(template.requestBodyAndHeaders(anyString(), any(), anyMap())).thenReturn(serviceJson); + + Service result = methods.updateService("serviceId", update, true); + assertNotNull(result); + } + + @Test + void testCreateOrUpdateResourceSpecByNameCategoryVersion() throws Exception { + ResourceSpecificationCreate create = new ResourceSpecificationCreate(); + LogicalResourceSpecification spec = new LogicalResourceSpecification(); + String specJson = new ObjectMapper().writeValueAsString(spec); + when(template.requestBodyAndHeaders(anyString(), any(), anyMap())).thenReturn(specJson); + + LogicalResourceSpecification result = methods.createOrUpdateResourceSpecByNameCategoryVersion(create); + assertNotNull(result); + } + + @Test + void testUpdateResourceById() throws Exception { + ResourceUpdate update = new ResourceUpdate(); + LogicalResourceSpecification resource = new LogicalResourceSpecification(); + String resourceJson = new ObjectMapper().writeValueAsString(resource); + when(template.requestBodyAndHeaders(anyString(), any(), anyMap())).thenReturn(resourceJson); + + assertNotNull(methods.updateResourceById("resourceId", update)); + } +// Bellow here are the mocked methods for the test class + public static MeasurementCollectionJob mockUpdateMeasurementCollectionJob(String uuid, MeasurementCollectionJobMVO measurementCollectionJobUpdate) { + MeasurementCollectionJob measurementCollectionJob = new MeasurementCollectionJob(); + measurementCollectionJob.setUuid(uuid); + + MeasurementCollectionJobMapper mapper = Mappers.getMapper(MeasurementCollectionJobMapper.class); + measurementCollectionJob = mapper.updateMeasurementCollectionJob(measurementCollectionJobUpdate, measurementCollectionJob); + + measurementCollectionJob.setLastModifiedTime(java.time.OffsetDateTime.now()); + return measurementCollectionJob; + } + + public static String mockFindMeasurementCollectionJobByUuidEagerAsString(String uuid) { + try { + MeasurementCollectionJob job = new MeasurementCollectionJob(); + job.setUuid(uuid); + ObjectMapper mapper = new ObjectMapper(); + return mapper.writeValueAsString(job); + } catch (Exception e) { + throw new RuntimeException(e); + } + } + + public static String mockFindAllMeasurementCollectionJobs() { + try { + MeasurementCollectionJob job = new MeasurementCollectionJob(); + job.setUuid("mock-uuid-1"); + + List jobs = Collections.singletonList(job); + ObjectMapper mapper = new ObjectMapper(); + return mapper.writeValueAsString(jobs); + } catch (Exception e) { + throw new RuntimeException(e); + } + } + + public static String mockFindPendingOrInProgressMeasurementCollectionJobsAsJson() { + try { + MeasurementCollectionJob job1 = new MeasurementCollectionJob(); + job1.setUuid("pending-uuid-1"); + job1.setExecutionState(org.etsi.osl.tmf.pm628.model.ExecutionStateType.PENDING); + + MeasurementCollectionJob job2 = new MeasurementCollectionJob(); + job2.setUuid("inprogress-uuid-2"); + job2.setExecutionState(org.etsi.osl.tmf.pm628.model.ExecutionStateType.INPROGRESS); + + List jobs = List.of(job1, job2); + ObjectMapper mapper = new ObjectMapper(); + return mapper.writeValueAsString(jobs); + } catch (Exception e) { + throw new RuntimeException(e); + } + } + + public static String mockGetServiceEagerAsString(String serviceId) { + try { + org.etsi.osl.tmf.sim638.model.Service service = new org.etsi.osl.tmf.sim638.model.Service(); + service.setUuid("mock-service-id"); + service.setName("Mock Service"); + // Set other fields as needed for your tests + + ObjectMapper mapper = new ObjectMapper(); + return mapper.writeValueAsString(service); + } catch (Exception e) { + throw new RuntimeException(e); + } + } + + public static String mockUpdateService(String serviceId, ServiceUpdate body, Boolean triggerServiceActionQueue) { + try { + org.etsi.osl.tmf.sim638.model.Service service = new org.etsi.osl.tmf.sim638.model.Service(); + service.setUuid("mock-service-id"); + service.setName("Updated Mock Service"); + // Optionally, set more fields based on the ServiceUpdate body if needed + + ObjectMapper mapper = new ObjectMapper(); + return mapper.writeValueAsString(service); + } catch (Exception e) { + throw new RuntimeException(e); + } + } + + public static String getResourceEagerAsString(String resourceId) { + try { + org.etsi.osl.tmf.ri639.model.LogicalResource resource = new org.etsi.osl.tmf.ri639.model.LogicalResource(); + resource.setUuid("mock-service-id"); + resource.setName("Mock Resource"); + // Set other fields as needed for your tests + + ObjectMapper mapper = new ObjectMapper(); + return mapper.writeValueAsString(resource); + } catch (Exception e) { + throw new RuntimeException(e); + } + } + + public static String updateResource(String resourceId, ResourceUpdate body, Boolean triggerServiceActionQueue) { + try { + org.etsi.osl.tmf.ri639.model.LogicalResource resource = new org.etsi.osl.tmf.ri639.model.LogicalResource(); + resource.setUuid("mock-service-id"); + resource.setName("Updated Mock Resource"); + // Optionally, set more fields based on the ResourceUpdate body if needed + + ObjectMapper mapper = new ObjectMapper(); + return mapper.writeValueAsString(resource); + } catch (Exception e) { + throw new RuntimeException(e); + } + } + + public static String addOrUpdateResourceSpecificationByNameCategoryVersion(String name, String category, String version, ResourceSpecificationCreate body) { + try { + org.etsi.osl.tmf.rcm634.model.LogicalResourceSpecification spec = new org.etsi.osl.tmf.rcm634.model.LogicalResourceSpecification(); + spec.setName(name != null ? name : "mock-name"); + spec.setCategory(category != null ? category : "mock-category"); + spec.setVersion(version != null ? version : "1.0"); + // Set other fields from body if needed + + ObjectMapper mapper = new ObjectMapper(); + return mapper.writeValueAsString(spec); + } catch (Exception e) { + throw new RuntimeException(e); + } + } + +} \ No newline at end of file -- GitLab From bdf21de991a9f4cdcd95b098ea898c70ad3ad14a Mon Sep 17 00:00:00 2001 From: George Tziavas Date: Tue, 24 Jun 2025 17:07:20 +0300 Subject: [PATCH 3/3] coverage 70% --- .../osl/metrico/MetricoCommonMethodsTest.java | 341 ++++++++++-------- 1 file changed, 198 insertions(+), 143 deletions(-) diff --git a/src/test/java/org/etsi/osl/metrico/MetricoCommonMethodsTest.java b/src/test/java/org/etsi/osl/metrico/MetricoCommonMethodsTest.java index 7d9de0b..d66045b 100644 --- a/src/test/java/org/etsi/osl/metrico/MetricoCommonMethodsTest.java +++ b/src/test/java/org/etsi/osl/metrico/MetricoCommonMethodsTest.java @@ -1,202 +1,205 @@ package org.etsi.osl.metrico; +import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; +import jakarta.annotation.PostConstruct; +import org.apache.camel.CamelContext; import org.apache.camel.ProducerTemplate; -import org.apache.camel.RoutesBuilder; import org.apache.camel.builder.RouteBuilder; -import org.etsi.osl.tmf.pm628.model.MeasurementCollectionJob; -import org.etsi.osl.tmf.pm628.model.MeasurementCollectionJobMVO; -import org.etsi.osl.tmf.pm628.model.MeasurementCollectionJobMapper; -import org.etsi.osl.tmf.pm628.model.MeasurementCollectionJobRef; +import org.etsi.osl.tmf.common.model.ELifecycle; +import org.etsi.osl.tmf.common.model.EValueType; +import org.etsi.osl.tmf.pm628.model.*; import org.etsi.osl.tmf.rcm634.model.LogicalResourceSpecification; -import org.etsi.osl.tmf.rcm634.model.ResourceSpecificationCreate; +import org.etsi.osl.tmf.rcm634.model.ResourceSpecificationCharacteristic; +import org.etsi.osl.tmf.ri639.model.LogicalResource; import org.etsi.osl.tmf.ri639.model.ResourceUpdate; import org.etsi.osl.tmf.sim638.model.Service; import org.etsi.osl.tmf.sim638.model.ServiceUpdate; -import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; -import org.mapstruct.factory.Mappers; -import org.mockito.MockedStatic; +import org.junit.jupiter.api.TestInstance; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.test.context.ActiveProfiles; +import org.springframework.boot.test.context.TestConfiguration; -import java.lang.reflect.Field; -import java.util.Collections; -import java.util.List; +import java.io.IOException; +import java.net.URI; +import java.time.OffsetDateTime; +import java.util.*; import static org.junit.jupiter.api.Assertions.*; -import static org.mockito.Mockito.*; @SpringBootTest(properties = { "PM_MEASUREMENT_COLLECTION_JOB_UPDATE = direct:PM.MEASUREMENTCOLLECTIONJOB.UPDATE", "PM_MEASUREMENT_COLLECTION_GET_JOB_BY_ID = direct:PM.MEASUREMENTCOLLECTIONJOB.GET_BY_ID", "PM_MEASUREMENT_COLLECTION_JOBS_GET = direct:PM.MEASUREMENTCOLLECTIONJOBS.GET", - "PM_MEASUREMENT_COLLECTION_JOB_GET_INPROGRESS_OR_PENDING = jms:queue:PM.MEASUREMENTCOLLECTIONJOB.GET_INPROGRESS_OR_PENDING", + "PM_MEASUREMENT_COLLECTION_JOB_GET_INPROGRESS_OR_PENDING = direct:PM.MEASUREMENTCOLLECTIONJOB.GET_INPROGRESS_OR_PENDING", "CATALOG_GET_SERVICE_BY_ID = direct:CATALOG.GET.SERVICE", "CATALOG_UPD_SERVICE = direct:CATALOG.UPD.SERVICE", "CATALOG_GET_RESOURCE_BY_ID = direct:CATALOG.GET.RESOURCE", "CATALOG_UPD_RESOURCE = direct:CATALOG.UPD.RESOURCE", - "CATALOG_UPDADD_RESOURCESPEC = direct:CATALOG.UPDADD.RESOURCESPEC", + "CATALOG_UPDADD_RESOURCESPEC = direct:CATALOG.UPDADD.RESOURCESPEC" }) -@ActiveProfiles("testing") +@TestInstance(TestInstance.Lifecycle.PER_CLASS) class MetricoCommonMethodsTest { - private ProducerTemplate template; - private MetricoCommonMethods methods; + static String OSL_METRICO_RSPEC_NAME = "Metrico_Resource_Specification"; + static String OSL_METRICO_RSPEC_CATEGORY = "metrico.osl.etsi.org/v1"; + static String OSL_METRICO_RSPEC_VERSION = "1.0.0"; + static String OSL_METRICO_RSPEC_DESCRIPTION = "This Specification is used to describe a generic METRICO job resource"; + static String OSL_METRICO_RSPEC_TYPE = "LogicalResourceSpecification"; + @TestConfiguration + static class CamelTestRoutesConfig { + private final CamelContext camelContext; - RoutesBuilder builder = new RouteBuilder() { - @Override - public void configure() { - from("direct:PM.MEASUREMENTCOLLECTIONJOB.UPDATE").bean(MetricoCommonMethodsTest.class, "mockUpdateMeasurementCollectionJob(${header.mcjid}, ${body})"); - from("direct:PM.MEASUREMENTCOLLECTIONJOB.GET_BY_ID").bean(MetricoCommonMethodsTest.class, "mockFindMeasurementCollectionJobByUuidEagerAsString"); - from("direct:PM.MEASUREMENTCOLLECTIONJOBS.GET").bean(MetricoCommonMethodsTest.class, "mockFindAllMeasurementCollectionJobs"); - from("jms:queue:PM.MEASUREMENTCOLLECTIONJOB.GET_INPROGRESS_OR_PENDING").bean(MetricoCommonMethodsTest.class, "mockFindPendingOrInProgressMeasurementCollectionJobsAsJson"); - from("direct:CATALOG.GET.SERVICE").bean(MetricoCommonMethodsTest.class, "mockGetServiceEagerAsString"); - from("direct:CATALOG.UPD.SERVICE").bean(MetricoCommonMethodsTest.class, "mockUpdateService(${header.serviceid}, ${body}, ${header.triggerServiceActionQueue})"); - from("direct:CATALOG.GET.RESOURCE").bean(MetricoCommonMethodsTest.class, "getResourceEagerAsString"); - from("direct:CATALOG.UPD.RESOURCE").bean(MetricoCommonMethodsTest.class, "updateResource(${header.resourceId}, ${body}, ${header.triggerServiceActionQueue})"); - from("direct:CATALOG.UPDADD.RESOURCESPEC").bean(MetricoCommonMethodsTest.class, "addOrUpdateResourceSpecificationByNameCategoryVersion(${header.aname}, ${header.acategory}, ${header.aversion}, ${body})"); + public CamelTestRoutesConfig(CamelContext camelContext) { + this.camelContext = camelContext; } - }; - @BeforeEach - void setUp() { - template = mock(ProducerTemplate.class); - methods = new MetricoCommonMethods(template); + @PostConstruct + public void registerRoutes() throws Exception { + camelContext.addRoutes( + new RouteBuilder() { + @Override + public void configure() { + from("direct:PM.MEASUREMENTCOLLECTIONJOB.UPDATE").bean(MetricoCommonMethodsTest.class, "mockUpdateMeasurementCollectionJob(${header.mcjid}, ${body})"); + from("direct:PM.MEASUREMENTCOLLECTIONJOB.GET_BY_ID").bean(MetricoCommonMethodsTest.class, "mockFindMeasurementCollectionJobByUuidEagerAsString"); + from("direct:PM.MEASUREMENTCOLLECTIONJOBS.GET").bean(MetricoCommonMethodsTest.class, "mockFindAllMeasurementCollectionJobs"); + from("direct:PM.MEASUREMENTCOLLECTIONJOB.GET_INPROGRESS_OR_PENDING").bean(MetricoCommonMethodsTest.class, "mockFindPendingOrInProgressMeasurementCollectionJobsAsJson"); + from("direct:CATALOG.GET.SERVICE").bean(MetricoCommonMethodsTest.class, "mockGetServiceEagerAsString"); + from("direct:CATALOG.UPD.SERVICE").bean(MetricoCommonMethodsTest.class, "mockUpdateService(${header.serviceid}, ${body}, ${header.triggerServiceActionQueue})"); + from("direct:CATALOG.GET.RESOURCE").bean(MetricoCommonMethodsTest.class, "mockGetResourceEagerAsString"); + from("direct:CATALOG.UPD.RESOURCE").bean(MetricoCommonMethodsTest.class, "mockUpdateResource(${header.resourceId}, ${body}, ${header.triggerServiceActionQueue})"); + from("direct:CATALOG.UPDADD.RESOURCESPEC").bean(MetricoCommonMethodsTest.class, "mockAddOrUpdateResourceSpecificationByNameCategoryVersion()"); + } + } + ); + } } + @Autowired + private ProducerTemplate template; + @Autowired + private MetricoCommonMethods methods; @Test void testRetrieveMeasurementCollectionJob() throws Exception { - Field field = MetricoCommonMethods.class.getDeclaredField("PM_MEASUREMENT_COLLECTION_GET_JOB_BY_ID"); - field.setAccessible(true); - field.set(methods, "someUri"); - - MeasurementCollectionJob job = new MeasurementCollectionJob(); - String jobJson = new ObjectMapper().writeValueAsString(job); - when(template.requestBody((Object) eq("someUri"), any())).thenReturn(jobJson); - - try (MockedStatic jsonUtilMock = mockStatic(JsonUtil.class)) { - jsonUtilMock.when(() -> JsonUtil.toJsonObj(jobJson, MeasurementCollectionJob.class)).thenReturn(job); - - MeasurementCollectionJob result = methods.retrieveMeasurementCollectionJob("id1"); - assertNotNull(result); - } + String jobId = "default-job-uuid"; + MeasurementCollectionJob result = methods.retrieveMeasurementCollectionJob(jobId); + assertNotNull(result); + assertEquals(jobId, result.getUuid()); } @Test - void testRetrieveMeasurementCollectionJobByRef() throws Exception { - MeasurementCollectionJobRef ref = new MeasurementCollectionJobRef(); - ref.setId("id2"); - MeasurementCollectionJob job = new MeasurementCollectionJob(); - String jobJson = new ObjectMapper().writeValueAsString(job); - when(template.requestBody((Object) anyString(), any())).thenReturn(jobJson); - - MeasurementCollectionJob result = methods.retrieveMeasurementCollectionJob(ref); - assertNotNull(result); + void testRetrieveMeasurementCollectionJobNull() throws Exception { + String jobId = "not-in-db-job-uuid"; + MeasurementCollectionJob result = methods.retrieveMeasurementCollectionJob(jobId); + assertNull(result); } @Test - void testListMeasurementCollectionJob() throws Exception { - MeasurementCollectionJob job = new MeasurementCollectionJob(); - List jobs = Collections.singletonList(job); - String jobsJson = new ObjectMapper().writeValueAsString(jobs); - when(template.requestBody((Object) anyString(), any())).thenReturn(jobsJson); - - List result = methods.listMeasurementCollectionJob(); + void testRetrieveMeasurementCollectionJobNFromMcjRef() throws Exception { + MeasurementCollectionJobRef mcjRef = new MeasurementCollectionJobRef(); + mcjRef.setId("default-job-uuid"); + MeasurementCollectionJob result = methods.retrieveMeasurementCollectionJob(mcjRef); assertNotNull(result); - assertEquals(1, result.size()); + assertEquals(mcjRef.getId(), result.getUuid()); } @Test - void testUpdateService() throws Exception { - ServiceUpdate update = new ServiceUpdate(); - Service service = new Service(); - String serviceJson = new ObjectMapper().writeValueAsString(service); - when(template.requestBodyAndHeaders(anyString(), any(), anyMap())).thenReturn(serviceJson); - - Service result = methods.updateService("serviceId", update, true); - assertNotNull(result); + void testRetrieveMeasurementCollectionJobNFromMcjRefNull() throws Exception { + MeasurementCollectionJobRef mcjRef = new MeasurementCollectionJobRef(); + mcjRef.setId("not-in-db-job-uuid"); + MeasurementCollectionJob result = methods.retrieveMeasurementCollectionJob(mcjRef); + assertNull(result); } @Test - void testCreateOrUpdateResourceSpecByNameCategoryVersion() throws Exception { - ResourceSpecificationCreate create = new ResourceSpecificationCreate(); - LogicalResourceSpecification spec = new LogicalResourceSpecification(); - String specJson = new ObjectMapper().writeValueAsString(spec); - when(template.requestBodyAndHeaders(anyString(), any(), anyMap())).thenReturn(specJson); + void testListMeasurementCollectionJob(){ + List jobs = methods.listMeasurementCollectionJob(); + assertNotNull(jobs); + assertFalse(jobs.isEmpty()); + assertEquals(2, jobs.size()); // We mocked two jobs in the method + } - LogicalResourceSpecification result = methods.createOrUpdateResourceSpecByNameCategoryVersion(create); - assertNotNull(result); + @Test + void testListPendingOrInProgressMeasurementCollectionJobs() { + List jobs = methods.listPendingOrInProgressMeasurementCollectionJobs(); + assertNull(jobs); } @Test - void testUpdateResourceById() throws Exception { - ResourceUpdate update = new ResourceUpdate(); - LogicalResourceSpecification resource = new LogicalResourceSpecification(); - String resourceJson = new ObjectMapper().writeValueAsString(resource); - when(template.requestBodyAndHeaders(anyString(), any(), anyMap())).thenReturn(resourceJson); + void testUpdateMeasurementCollectionJobById() { + String jobId = "default-job-uuid"; + MeasurementCollectionJobMVO mcjMVO = new MeasurementCollectionJobMVO(); + mcjMVO.setUuid(jobId); - assertNotNull(methods.updateResourceById("resourceId", update)); + mcjMVO.setGranularity(Granularity.G_1H); + + + MeasurementCollectionJob result = methods.updateMeasurementCollectionJobById(jobId, mcjMVO); + MeasurementCollectionJob updatedJob; + + assertNotNull(result); + assertEquals(result.getUuid(), jobId); + assertEquals(Granularity.G_1H, result.getGranularity()); } + // Bellow here are the mocked methods for the test class - public static MeasurementCollectionJob mockUpdateMeasurementCollectionJob(String uuid, MeasurementCollectionJobMVO measurementCollectionJobUpdate) { - MeasurementCollectionJob measurementCollectionJob = new MeasurementCollectionJob(); - measurementCollectionJob.setUuid(uuid); + public static String mockUpdateMeasurementCollectionJob(String uuid, String mcjMVOString) { + MeasurementCollectionJob mcj = defaultMeasurementCollectionJob(); + + MeasurementCollectionJobMVO mcjMVO = null; + try { + mcjMVO = JsonUtil.toJsonObj(mcjMVOString, MeasurementCollectionJobMVO.class); + } catch (IOException e) { + throw new RuntimeException(e); + } - MeasurementCollectionJobMapper mapper = Mappers.getMapper(MeasurementCollectionJobMapper.class); - measurementCollectionJob = mapper.updateMeasurementCollectionJob(measurementCollectionJobUpdate, measurementCollectionJob); + mcj.setGranularity(mcjMVO.getGranularity()); - measurementCollectionJob.setLastModifiedTime(java.time.OffsetDateTime.now()); - return measurementCollectionJob; + return JsonUtil.toJsonString(mcj); } public static String mockFindMeasurementCollectionJobByUuidEagerAsString(String uuid) { - try { - MeasurementCollectionJob job = new MeasurementCollectionJob(); - job.setUuid(uuid); - ObjectMapper mapper = new ObjectMapper(); - return mapper.writeValueAsString(job); - } catch (Exception e) { - throw new RuntimeException(e); + if(uuid.equals("default-job-uuid")) { + return JsonUtil.toJsonString(defaultMeasurementCollectionJob()); } + else return null; } public static String mockFindAllMeasurementCollectionJobs() { - try { - MeasurementCollectionJob job = new MeasurementCollectionJob(); - job.setUuid("mock-uuid-1"); + MeasurementCollectionJob job1 = defaultMeasurementCollectionJob(); + MeasurementCollectionJob job2 = defaultMeasurementCollectionJob(); + job2.setUuid("another-job-uuid"); + List jobs = List.of(job1, job2); - List jobs = Collections.singletonList(job); - ObjectMapper mapper = new ObjectMapper(); - return mapper.writeValueAsString(jobs); - } catch (Exception e) { - throw new RuntimeException(e); + try { + ObjectMapper objectMapper = new ObjectMapper(); + String jsonArray; + + List jobJsonStrings = new ArrayList<>(); + for (MeasurementCollectionJob job : jobs) { + jobJsonStrings.add(objectMapper.writeValueAsString(job)); + } + StringJoiner joiner = new StringJoiner(",", "[", "]"); + for (String jobStr : jobJsonStrings) { + joiner.add(jobStr); + } + jsonArray = joiner.toString(); + return jsonArray; + } catch (JsonProcessingException e) { + throw new RuntimeException("Failed to serialize jobs to JSON", e); } } public static String mockFindPendingOrInProgressMeasurementCollectionJobsAsJson() { - try { - MeasurementCollectionJob job1 = new MeasurementCollectionJob(); - job1.setUuid("pending-uuid-1"); - job1.setExecutionState(org.etsi.osl.tmf.pm628.model.ExecutionStateType.PENDING); - - MeasurementCollectionJob job2 = new MeasurementCollectionJob(); - job2.setUuid("inprogress-uuid-2"); - job2.setExecutionState(org.etsi.osl.tmf.pm628.model.ExecutionStateType.INPROGRESS); - - List jobs = List.of(job1, job2); - ObjectMapper mapper = new ObjectMapper(); - return mapper.writeValueAsString(jobs); - } catch (Exception e) { - throw new RuntimeException(e); - } + return null; } public static String mockGetServiceEagerAsString(String serviceId) { try { - org.etsi.osl.tmf.sim638.model.Service service = new org.etsi.osl.tmf.sim638.model.Service(); + Service service = new Service(); service.setUuid("mock-service-id"); service.setName("Mock Service"); // Set other fields as needed for your tests @@ -210,7 +213,7 @@ class MetricoCommonMethodsTest { public static String mockUpdateService(String serviceId, ServiceUpdate body, Boolean triggerServiceActionQueue) { try { - org.etsi.osl.tmf.sim638.model.Service service = new org.etsi.osl.tmf.sim638.model.Service(); + Service service = new Service(); service.setUuid("mock-service-id"); service.setName("Updated Mock Service"); // Optionally, set more fields based on the ServiceUpdate body if needed @@ -222,9 +225,9 @@ class MetricoCommonMethodsTest { } } - public static String getResourceEagerAsString(String resourceId) { + public static String mockGetResourceEagerAsString(String resourceId) { try { - org.etsi.osl.tmf.ri639.model.LogicalResource resource = new org.etsi.osl.tmf.ri639.model.LogicalResource(); + LogicalResource resource = new LogicalResource(); resource.setUuid("mock-service-id"); resource.setName("Mock Resource"); // Set other fields as needed for your tests @@ -236,9 +239,9 @@ class MetricoCommonMethodsTest { } } - public static String updateResource(String resourceId, ResourceUpdate body, Boolean triggerServiceActionQueue) { + public static String mockUpdateResource(String resourceId, ResourceUpdate body, Boolean triggerServiceActionQueue) { try { - org.etsi.osl.tmf.ri639.model.LogicalResource resource = new org.etsi.osl.tmf.ri639.model.LogicalResource(); + LogicalResource resource = new LogicalResource(); resource.setUuid("mock-service-id"); resource.setName("Updated Mock Resource"); // Optionally, set more fields based on the ResourceUpdate body if needed @@ -250,19 +253,71 @@ class MetricoCommonMethodsTest { } } - public static String addOrUpdateResourceSpecificationByNameCategoryVersion(String name, String category, String version, ResourceSpecificationCreate body) { - try { - org.etsi.osl.tmf.rcm634.model.LogicalResourceSpecification spec = new org.etsi.osl.tmf.rcm634.model.LogicalResourceSpecification(); - spec.setName(name != null ? name : "mock-name"); - spec.setCategory(category != null ? category : "mock-category"); - spec.setVersion(version != null ? version : "1.0"); - // Set other fields from body if needed + public static String mockAddOrUpdateResourceSpecificationByNameCategoryVersion() { + return JsonUtil.toJsonString(defaultResourceSpecification()); + } - ObjectMapper mapper = new ObjectMapper(); - return mapper.writeValueAsString(spec); - } catch (Exception e) { - throw new RuntimeException(e); - } + + public static LogicalResourceSpecification defaultResourceSpecification() { + LogicalResourceSpecification rsc = new LogicalResourceSpecification(); + rsc.setName(OSL_METRICO_RSPEC_NAME); + rsc.setCategory(OSL_METRICO_RSPEC_CATEGORY); + rsc.setVersion(OSL_METRICO_RSPEC_VERSION); + rsc.setDescription(OSL_METRICO_RSPEC_DESCRIPTION); + rsc.setType(OSL_METRICO_RSPEC_TYPE); + rsc.setLifecycleStatus(ELifecycle.ACTIVE.getValue()); + + ResourceSpecificationCharacteristic characteristic = new ResourceSpecificationCharacteristic(); + characteristic.setValueType(EValueType.TEXT.getValue()); + + characteristic.setName("_MT_CHARACTERISTIC_NAME"); + rsc.addResourceSpecCharacteristicItem(characteristic); + + characteristic.setName("_MT_SERVICEUUID"); + rsc.addResourceSpecCharacteristicItem(characteristic); + + characteristic.setName("_MT_END_TIME"); + rsc.addResourceSpecCharacteristicItem(characteristic); + + characteristic.setName("_MT_START_TIME"); + rsc.addResourceSpecCharacteristicItem(characteristic); + + characteristic.setName("_MT_QUERY"); + rsc.addResourceSpecCharacteristicItem(characteristic); + + characteristic.setName("_MT_URL"); + rsc.addResourceSpecCharacteristicItem(characteristic); + + characteristic.setName("_MT_RECURRING_INTERVAL"); + rsc.addResourceSpecCharacteristicItem(characteristic); + + characteristic.setName("_MT_TYPE"); + rsc.addResourceSpecCharacteristicItem(characteristic); + + return rsc; + } + + static MeasurementCollectionJob defaultMeasurementCollectionJob() { + MeasurementCollectionJob job = new MeasurementCollectionJob(); + job.setCreationTime(OffsetDateTime.now()); + job.setUuid("default-job-uuid"); + job.setGranularity(Granularity.G_1MN); + job.setExecutionState(ExecutionStateType.PENDING); + + DataAccessEndpoint dae = new DataAccessEndpoint(); + dae.setUri(URI.create("http://example.com/data")); + dae.apiType("PROMETHEUS"); + List daeList = new ArrayList<>(); + daeList.add(dae); + job.setDataAccessEndpoint(daeList); + + ScheduleDefinition sd = new ScheduleDefinition(); + sd.setScheduleDefinitionStartTime(OffsetDateTime.now()); + sd.setScheduleDefinitionEndTime(OffsetDateTime.now().plusHours(1)); + List sdList = new ArrayList<>(); + sdList.add(sd); + + return job; } } \ No newline at end of file -- GitLab