Add model-loader integration tests

- add integration tests that assert the external communication towards other services using Wiremock
- remove tests that are asserting getters and setters of objects

Issue-ID: AAI-3826
Change-Id: I1f627801869f40cb0eaa61b10148b41bd3b1bdb8
Signed-off-by: Fiete Ostkamp <Fiete.Ostkamp@telekom.de>
diff --git a/src/test/java/org/onap/aai/modelloader/DistributionClientTestConfiguration.java b/src/test/java/org/onap/aai/modelloader/DistributionClientTestConfiguration.java
new file mode 100644
index 0000000..1eed62f
--- /dev/null
+++ b/src/test/java/org/onap/aai/modelloader/DistributionClientTestConfiguration.java
@@ -0,0 +1,81 @@
+/**
+ * ============LICENSE_START=======================================================
+ * org.onap.aai
+ * ================================================================================
+ * Copyright © 2024 Deutsche Telekom AG Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *       http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+package org.onap.aai.modelloader;
+
+import static com.github.tomakehurst.wiremock.client.WireMock.aResponse;
+import static com.github.tomakehurst.wiremock.client.WireMock.equalTo;
+import static com.github.tomakehurst.wiremock.client.WireMock.get;
+import static com.github.tomakehurst.wiremock.client.WireMock.matching;
+import static com.github.tomakehurst.wiremock.client.WireMock.stubFor;
+import static com.github.tomakehurst.wiremock.client.WireMock.urlEqualTo;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.nio.file.Files;
+import java.nio.file.Paths;
+import java.util.Properties;
+
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.boot.context.event.ApplicationStartedEvent;
+import org.springframework.boot.test.context.TestConfiguration;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Primary;
+import org.springframework.context.event.EventListener;
+
+@TestConfiguration
+public class DistributionClientTestConfiguration {
+
+  @Value("${CONFIG_HOME}")
+  private String configDir;
+
+  @Value("${wiremock.server.port}")
+  private int wiremockPort;
+
+  @Primary
+  @Bean(name = "testProperties")
+  public Properties configProperties() throws IOException {
+    // Load model loader system configuration
+    InputStream configInputStream = Files.newInputStream(Paths.get(configDir, "model-loader.properties"));
+    Properties configProperties = new Properties();
+    configProperties.load(configInputStream);
+
+    setOverrides(configProperties);
+
+    return configProperties;
+  }
+
+  private void setOverrides(Properties configProperties) {
+    configProperties.setProperty("ml.distribution.ASDC_ADDRESS", "localhost:" + wiremockPort);
+    configProperties.setProperty("ml.babel.BASE_URL", "http://localhost:" + wiremockPort);
+  }
+
+  @EventListener(ApplicationStartedEvent.class)
+  public void mockSdcInit() {
+    stubFor(get(urlEqualTo("/sdc/v1/artifactTypes"))
+        .withHeader("X-ECOMP-RequestID", matching(".+"))
+        .withHeader("X-ECOMP-InstanceID", equalTo("aai-ml-id-test"))
+        .willReturn(aResponse().withHeader("Content-Type", "application/json").withBodyFile("artifactTypes.json")));
+
+    stubFor(get(urlEqualTo("/sdc/v1/distributionKafkaData"))
+        .withHeader("X-ECOMP-RequestID", matching(".+"))
+        .withHeader("X-ECOMP-InstanceID", equalTo("aai-ml-id-test"))
+        .willReturn(aResponse().withHeader("Content-Type", "application/json").withBodyFile("kafkaBootstrap.json")));
+  }
+}
\ No newline at end of file
diff --git a/src/test/java/org/onap/aai/modelloader/TestModelLoaderApplication.java b/src/test/java/org/onap/aai/modelloader/TestModelLoaderApplication.java
deleted file mode 100644
index cd39066..0000000
--- a/src/test/java/org/onap/aai/modelloader/TestModelLoaderApplication.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/**
- * ============LICENSE_START=======================================================
- * org.onap.aai
- * ================================================================================
- * Copyright © 2017-2018 AT&T Intellectual Property. All rights reserved.
- * Copyright © 2017-2018 European Software Marketing Ltd.
- * ================================================================================
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *       http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ============LICENSE_END=========================================================
- */
-package org.onap.aai.modelloader;
-
-import static org.junit.jupiter.api.Assertions.assertTrue;
-
-import org.junit.jupiter.api.Test;
-
-/**
- * Tests for ModelLoaderApplication class.
- *
- */
-public class TestModelLoaderApplication {
-
-    static {
-        System.setProperty("CONFIG_HOME", "src/test/resources");
-    }
-
-    @Test
-    public void testServiceStarts() {
-        // The SDC Distribution Client is disabled.
-        ModelLoaderApplication.main(new String[0]);
-        assertTrue(true);
-    }
-
-}
diff --git a/src/test/java/org/onap/aai/modelloader/distribution/NotificationIntegrationTest.java b/src/test/java/org/onap/aai/modelloader/distribution/NotificationIntegrationTest.java
index 2645871..abdefd4 100644
--- a/src/test/java/org/onap/aai/modelloader/distribution/NotificationIntegrationTest.java
+++ b/src/test/java/org/onap/aai/modelloader/distribution/NotificationIntegrationTest.java
@@ -26,6 +26,7 @@
 
 import org.junit.jupiter.api.Disabled;
 import org.junit.jupiter.api.Test;
+import org.onap.aai.modelloader.notification.NotificationDataImpl;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.boot.test.context.SpringBootTest;
@@ -35,25 +36,26 @@
 
 @DirtiesContext
 @SpringBootTest(properties = { "model-loader.sdc.connection.enabled=true"})
-@EmbeddedKafka(partitions = 1, brokerProperties = { "listeners=PLAINTEXT://localhost:9092", "port=9092" })
+@EmbeddedKafka(partitions = 1, ports = 9092, topics = {"${topics.distribution.notification}"})
 public class NotificationIntegrationTest {
 
     @Autowired EventCallbackAspect eventCallbackAspect;
 
     @Autowired
-    private KafkaTemplate<String, String> kafkaTemplate;
+    private KafkaTemplate<String, NotificationDataImpl> kafkaTemplate;
 
-    @Value("${test.topic}")
+    @Value("${topics.distribution.notification}")
     private String topic;
 
     @Test
     @Disabled("This test is not yet implemented")
     public void thatActivateCallbackIsCalled()
       throws Exception {
-        String data = "Smth";
-
+        NotificationDataImpl notificationData = new NotificationDataImpl();
+        notificationData.setDistributionID("distributionID");
+    
         // TODO: send distribution event here
-        kafkaTemplate.send(topic, data);
+        kafkaTemplate.send(topic, notificationData);
 
         // TODO: mock distribution client requests to /sdc/v1/artifactTypes
         // TODO: mock distribution client requests to /sdc/v1/distributionKafkaData
diff --git a/src/test/java/org/onap/aai/modelloader/notification/ArtifactDownloadManagerTest.java b/src/test/java/org/onap/aai/modelloader/notification/ArtifactDownloadManagerTest.java
new file mode 100644
index 0000000..0985790
--- /dev/null
+++ b/src/test/java/org/onap/aai/modelloader/notification/ArtifactDownloadManagerTest.java
@@ -0,0 +1,107 @@
+/**
+ * ============LICENSE_START=======================================================
+ * org.onap.aai
+ * ================================================================================
+ * Copyright © 2024 Deutsche Telekom AG Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *       http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+package org.onap.aai.modelloader.notification;
+
+import static com.github.tomakehurst.wiremock.client.WireMock.aResponse;
+import static com.github.tomakehurst.wiremock.client.WireMock.equalTo;
+import static com.github.tomakehurst.wiremock.client.WireMock.get;
+import static com.github.tomakehurst.wiremock.client.WireMock.matching;
+import static com.github.tomakehurst.wiremock.client.WireMock.matchingJsonPath;
+import static com.github.tomakehurst.wiremock.client.WireMock.post;
+import static com.github.tomakehurst.wiremock.client.WireMock.stubFor;
+import static com.github.tomakehurst.wiremock.client.WireMock.urlEqualTo;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.http.entity.ContentType;
+import org.junit.jupiter.api.Test;
+import org.onap.aai.modelloader.DistributionClientTestConfiguration;
+import org.onap.aai.modelloader.entity.Artifact;
+import org.onap.aai.modelloader.entity.ArtifactType;
+import org.onap.aai.modelloader.service.ArtifactInfoImpl;
+import org.onap.sdc.api.notification.IArtifactInfo;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.cloud.contract.wiremock.AutoConfigureWireMock;
+import org.springframework.context.annotation.Import;
+import org.springframework.http.MediaType;
+import org.springframework.kafka.test.context.EmbeddedKafka;
+import org.springframework.test.annotation.DirtiesContext;
+
+import com.fasterxml.jackson.core.JsonProcessingException;
+
+@DirtiesContext
+@AutoConfigureWireMock(port = 0)
+@EmbeddedKafka(partitions = 1, ports = 9092, topics = {"${topics.distribution.notification}"})
+@SpringBootTest(properties = { "ml.distribution.connection.enabled=true" })
+@Import(DistributionClientTestConfiguration.class)
+public class ArtifactDownloadManagerTest {
+
+  @Autowired ArtifactDownloadManager artifactDownloadManager;
+
+  @Test
+  public void downloadArtifacts() throws JsonProcessingException {
+    NotificationDataImpl notificationData = new NotificationDataImpl();
+    notificationData.setDistributionID("distributionID");
+    notificationData.setServiceVersion("2.0");
+
+    stubFor(get(urlEqualTo("/sdc/v1/catalog/services/DemovlbCds/1.0/artifacts/service-TestSvc-csar.csar"))
+        .withHeader("Accept", equalTo(ContentType.APPLICATION_OCTET_STREAM.toString()))
+        .withHeader("X-ECOMP-RequestID", matching(".+"))
+        .withHeader("X-ECOMP-InstanceID", equalTo("aai-ml-id-test"))
+        .willReturn(aResponse()
+          .withHeader("Content-Type", MediaType.APPLICATION_OCTET_STREAM.toString())
+          .withBodyFile("service-TestSvc-csar.csar")));
+    
+    stubFor(
+        post(urlEqualTo("/services/babel-service/v1/app/generateArtifacts"))
+            .withHeader("X-TransactionId", equalTo("distributionID"))
+            .withHeader("X-FromAppId", equalTo("ModelLoader"))
+            .withHeader("Content-Type", equalTo(MediaType.APPLICATION_JSON_VALUE))
+            .withRequestBody(matchingJsonPath("$.artifactName", equalTo("service-TestSvc-csar.csar")))
+            .withRequestBody(matchingJsonPath("$.artifactVersion", equalTo("2.0")))
+            .withRequestBody(matchingJsonPath("$.csar", matching(".*")))
+            .willReturn(
+                aResponse()
+                    .withHeader("Content-Type", "application/json")
+                    .withBodyFile("service-TestSvc-csar-babel-response.json")));
+
+    ArtifactInfoImpl artifactInfo = new ArtifactInfoImpl();
+    artifactInfo.setArtifactName("service-TestSvc-csar.csar");
+    artifactInfo.setArtifactVersion("1.0");
+    artifactInfo.setArtifactURL("/sdc/v1/catalog/services/DemovlbCds/1.0/artifacts/service-TestSvc-csar.csar");
+    artifactInfo.setArtifactType("TOSCA_CSAR");
+    artifactInfo.setArtifactChecksum("ZmI5NzQ1MWViZGFkMjRjZWEwNTQzY2U0OWQwYjlmYjQ=");
+    artifactInfo.setArtifactUUID("f6f907f1-3f45-4fb4-8cbe-15a4c6ee16db");
+    List<IArtifactInfo> artifacts = new ArrayList<>();
+    artifacts.add(artifactInfo);
+    List<Artifact> modelArtifacts = new ArrayList<>(); // processed artifacts will be written to this list
+    List<Artifact> catalogArtifacts = new ArrayList<>(); // processed artifacts will be written to this list
+    boolean result = artifactDownloadManager.downloadArtifacts(notificationData, artifacts, modelArtifacts, catalogArtifacts);
+    
+    assertEquals(1, modelArtifacts.size());
+    assertEquals(ArtifactType.MODEL, modelArtifacts.get(0).getType());
+    assertTrue(result);
+  }
+
+}
diff --git a/src/test/java/org/onap/aai/modelloader/notification/ModelArtifactHandlerTest.java b/src/test/java/org/onap/aai/modelloader/notification/ModelArtifactHandlerTest.java
new file mode 100644
index 0000000..b1269ee
--- /dev/null
+++ b/src/test/java/org/onap/aai/modelloader/notification/ModelArtifactHandlerTest.java
@@ -0,0 +1,226 @@
+/**
+ * ============LICENSE_START=======================================================
+ * org.onap.aai
+ * ================================================================================
+ * Copyright © 2024 Deutsche Telekom AG Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *       http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+package org.onap.aai.modelloader.notification;
+
+import static org.junit.jupiter.api.Assertions.assertTrue;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.Mockito.when;
+import static com.github.tomakehurst.wiremock.client.WireMock.stubFor;
+import static com.github.tomakehurst.wiremock.client.WireMock.verify;
+import static com.github.tomakehurst.wiremock.client.WireMock.urlEqualTo;
+import static com.github.tomakehurst.wiremock.client.WireMock.aResponse;
+import static com.github.tomakehurst.wiremock.client.WireMock.deleteRequestedFor;
+import static com.github.tomakehurst.wiremock.client.WireMock.equalTo;
+import static com.github.tomakehurst.wiremock.client.WireMock.ok;
+
+import java.util.List;
+
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+import org.mockito.InjectMocks;
+import org.mockito.Mock;
+import org.mockito.Mockito;
+import org.onap.aai.modelloader.config.ModelLoaderConfig;
+import org.onap.aai.modelloader.entity.Artifact;
+import org.onap.aai.modelloader.entity.model.ModelArtifact;
+import org.onap.aai.modelloader.entity.model.ModelArtifactHandler;
+import org.onap.aai.modelloader.restclient.AaiRestClient;
+import org.onap.aai.restclient.client.OperationResult;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.cloud.contract.wiremock.AutoConfigureWireMock;
+import org.springframework.http.HttpStatus;
+import org.springframework.web.client.RestTemplate;
+import org.w3c.dom.Node;
+
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.github.tomakehurst.wiremock.client.WireMock;
+
+import java.util.ArrayList;
+
+@SpringBootTest
+@AutoConfigureWireMock(port = 0)
+public class ModelArtifactHandlerTest {
+
+  @Value("${wiremock.server.port}")
+  private int wiremockPort;
+
+  final ObjectMapper objectMapper = new ObjectMapper();
+  @Mock
+  ModelLoaderConfig config;
+  @InjectMocks
+  ModelArtifactHandler modelArtifactHandler;
+
+  @Autowired
+  AaiRestClient restClient;
+
+  @BeforeEach
+  public void setUp() {
+    when(config.getAaiBaseUrl()).thenReturn("http://localhost:" + wiremockPort);
+    when(config.getAaiModelUrl(any())).thenReturn("/aai/v28/service-design-and-creation/models/model/");
+  }
+
+  @Test
+  public void thatArtifactsCanBeCreated() {
+    WireMock.stubFor(
+        WireMock.get(urlEqualTo("/aai/v28/service-design-and-creation/models/model/modelInvariantId"))
+            .withHeader("Accept", equalTo("application/xml"))
+            .withHeader("X-TransactionId", equalTo("someId"))
+            .withHeader("X-FromAppId", equalTo("ModelLoader"))
+            .willReturn(
+                WireMock.aResponse()
+                    .withStatus(HttpStatus.NOT_FOUND.value())));
+
+    WireMock.stubFor(
+        WireMock.put(urlEqualTo("/aai/v28/service-design-and-creation/models/model/modelInvariantId"))
+            .withHeader("Content-Type", equalTo("application/xml"))
+            .withHeader("X-TransactionId", equalTo("someId"))
+            .withHeader("X-FromAppId", equalTo("ModelLoader"))
+            .willReturn(
+                WireMock.aResponse()
+                    .withStatus(HttpStatus.CREATED.value())));
+
+    ModelArtifact modelArtifact = new ModelArtifact();
+    modelArtifact.setModelInvariantId("modelInvariantId");
+    List<Artifact> artifacts = List.of(modelArtifact);
+    List<Artifact> completedArtifacts = new ArrayList<>();
+
+    boolean result = modelArtifactHandler.pushArtifacts(artifacts,
+        "someId", completedArtifacts, restClient);
+    assertTrue(result);
+    WireMock.verify(
+        WireMock.putRequestedFor(urlEqualTo("/aai/v28/service-design-and-creation/models/model/modelInvariantId")));
+  }
+
+  @Test
+  public void thatArtifactsCanBeUpdated() {
+    // Checks if model exists in resources service
+    WireMock.stubFor(
+        WireMock.get(urlEqualTo("/aai/v28/service-design-and-creation/models/model/modelInvariantId"))
+            .withHeader("Accept", equalTo("application/xml"))
+            .withHeader("X-TransactionId", equalTo("distributionId"))
+            .withHeader("X-FromAppId", equalTo("ModelLoader"))
+            .willReturn(
+                WireMock.aResponse()
+                    .withStatus(HttpStatus.OK.value())));
+
+    // Checks if specific version of model exists in aai-resources
+    WireMock.stubFor(
+        WireMock.get(urlEqualTo(
+            "/aai/v28/service-design-and-creation/models/model/modelInvariantId/model-vers/model-ver/modelVersionId"))
+            .withHeader("Accept", equalTo("application/xml"))
+            .withHeader("X-TransactionId", equalTo("distributionId"))
+            .withHeader("X-FromAppId", equalTo("ModelLoader"))
+            .willReturn(
+                WireMock.aResponse()
+                    .withStatus(HttpStatus.NOT_FOUND.value())));
+
+    WireMock.stubFor(
+        WireMock.put(urlEqualTo(
+            "/aai/v28/service-design-and-creation/models/model/modelInvariantId/model-vers/model-ver/modelVersionId"))
+            .withHeader("Content-Type", equalTo("application/xml"))
+            .withHeader("X-TransactionId", equalTo("distributionId"))
+            .withHeader("X-FromAppId", equalTo("ModelLoader"))
+            .willReturn(
+                WireMock.aResponse()
+                    .withStatus(HttpStatus.CREATED.value())));
+
+    ModelArtifact modelArtifact = new ModelArtifact();
+    modelArtifact.setModelInvariantId("modelInvariantId");
+    modelArtifact.setModelVerId("modelVersionId");
+    Node node = Mockito.mock(Node.class);
+    modelArtifact.setModelVer(node);
+    List<Artifact> artifacts = List.of(modelArtifact);
+    List<Artifact> completedArtifacts = new ArrayList<>();
+
+    boolean result = modelArtifactHandler.pushArtifacts(artifacts,
+        "distributionId", completedArtifacts, restClient);
+    verify(WireMock.putRequestedFor(urlEqualTo(
+        "/aai/v28/service-design-and-creation/models/model/modelInvariantId/model-vers/model-ver/modelVersionId")));
+    assertTrue(result);
+  }
+
+  @Test
+  public void thatModelCanBeRolledBack() {
+    stubFor(WireMock.get(urlEqualTo("/aai/v28/service-design-and-creation/models/model/3a40ab73-6694-4e75-bb6d-9a4a86ce35b3"))
+        .withHeader("X-FromAppId", equalTo("ModelLoader"))
+        .withHeader("X-TransactionId", equalTo("distributionId"))
+        .willReturn(aResponse()
+            .withBodyFile("modelResponse.xml")));
+
+    stubFor(WireMock.delete(urlEqualTo("/aai/v28/service-design-and-creation/models/model/3a40ab73-6694-4e75-bb6d-9a4a86ce35b3?resource-version=1710523260974"))
+        .withHeader("X-FromAppId", equalTo("ModelLoader"))
+        .withHeader("X-TransactionId", equalTo("distributionId"))
+        .willReturn(aResponse().withStatus(HttpStatus.OK.value())));
+
+    ModelArtifact modelArtifact = new ModelArtifact();
+    modelArtifact.setModelInvariantId("3a40ab73-6694-4e75-bb6d-9a4a86ce35b3");
+    modelArtifact.setModelVerId("modelVersionId");
+    Node node = Mockito.mock(Node.class);
+    modelArtifact.setModelVer(node);
+    List<Artifact> completedArtifacts = new ArrayList<>();
+    completedArtifacts.add(modelArtifact);
+
+    mockModelCreation(modelArtifact);
+
+    modelArtifactHandler.rollback(completedArtifacts, "distributionId", restClient);
+
+    verify(
+        deleteRequestedFor(
+            urlEqualTo("/aai/v28/service-design-and-creation/models/model/3a40ab73-6694-4e75-bb6d-9a4a86ce35b3?resource-version=1710523260974")));
+  }
+
+  /**
+   * To test the rollback of the full model, the ModelArtifact must have the
+   * firstVersionOfModel = true state.
+   * This flag is set during the model creation and thus needs to run before
+   * testing this particular aspect.
+   *
+   * @param modelArtifact
+   */
+  private void mockModelCreation(ModelArtifact modelArtifact) {
+    OperationResult createdResult = Mockito.mock(OperationResult.class);
+    when(createdResult.getResultCode()).thenReturn(HttpStatus.CREATED.value());
+    OperationResult notFoundResult = Mockito.mock(OperationResult.class);
+    when(notFoundResult.getResultCode()).thenReturn(HttpStatus.NOT_FOUND.value());
+    AaiRestClient aaiClient = Mockito.mock(AaiRestClient.class);
+    when(aaiClient.putResource(any(), any(), any(), any())).thenReturn(createdResult);
+    when(aaiClient.getResource(any(), any(), any())).thenReturn(notFoundResult);
+    modelArtifact.push(aaiClient, config, null, new ArrayList<>());
+  }
+
+  @Test
+  public void thatModelVersionCanBeRolledBack() {
+
+    // "http://localhost:10594/aai/v28/service-design-and-creation/models/model/modelInvariantId/model-vers/model-ver/modelVersionId"
+
+    ModelArtifact modelArtifact = new ModelArtifact();
+    modelArtifact.setModelInvariantId("modelInvariantId");
+    modelArtifact.setModelVerId("modelVersionId");
+    Node node = Mockito.mock(Node.class);
+    modelArtifact.setModelVer(node);
+    List<Artifact> completedArtifacts = new ArrayList<>();
+    completedArtifacts.add(modelArtifact);
+
+    modelArtifactHandler.rollback(completedArtifacts, "distributionId", restClient);
+
+  }
+}
\ No newline at end of file
diff --git a/src/test/java/org/onap/aai/modelloader/notification/TestNotificationDataImpl.java b/src/test/java/org/onap/aai/modelloader/notification/TestNotificationDataImpl.java
deleted file mode 100644
index 4d6858a..0000000
--- a/src/test/java/org/onap/aai/modelloader/notification/TestNotificationDataImpl.java
+++ /dev/null
@@ -1,83 +0,0 @@
-/**
- * ============LICENSE_START=======================================================
- * org.onap.aai
- * ================================================================================
- * Copyright © 2017-2018 AT&T Intellectual Property. All rights reserved.
- * Copyright © 2017-2018 European Software Marketing Ltd.
- * ================================================================================
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *       http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ============LICENSE_END=========================================================
- */
-package org.onap.aai.modelloader.notification;
-
-import static org.hamcrest.CoreMatchers.equalTo;
-import static org.hamcrest.CoreMatchers.is;
-import static org.hamcrest.CoreMatchers.not;
-import static org.hamcrest.MatcherAssert.assertThat;
-
-import org.junit.jupiter.api.Test;
-
-/**
- * Tests for NotificationDataImpl class
- *
- */
-public class TestNotificationDataImpl {
-
-    @Test
-    public void testGettersAndSetters() {
-        NotificationDataImpl data = new NotificationDataImpl();
-        String distributionId = "testid";
-
-        data.setDistributionID(distributionId);
-        assertThat(data.getDistributionID(), is(equalTo(distributionId)));
-
-        // Getters return empty data
-        assertThat(data.getArtifactMetadataByUUID(null), is(equalTo(null)));
-        assertThat(data.getServiceDescription(), is(equalTo(null)));
-        assertThat(data.getServiceInvariantUUID(), is(equalTo(null)));
-        assertThat(data.getServiceName(), is(equalTo(null)));
-        assertThat(data.getServiceUUID(), is(equalTo(null)));
-        assertThat(data.getServiceVersion(), is(equalTo(null)));
-        assertThat(data.getResources().size(), is(0));
-        assertThat(data.getServiceArtifacts().size(), is(0));
-
-        // Unsupported method!
-        String context = "testcontext";
-        data.setWorkloadContext(context);
-        assertThat(data.getWorkloadContext(), is(equalTo(null)));
-    }
-
-
-    @Test
-    public void testEquality() {
-        NotificationDataImpl data = new NotificationDataImpl();
-        assertThat(data, is(not(equalTo(null))));
-        assertThat(data, is(not(equalTo("")))); // NOSONAR
-        assertThat(data, is(equalTo(data)));
-
-        NotificationDataImpl other = new NotificationDataImpl();
-        assertThat(data, is(equalTo(other)));
-        assertThat(data.hashCode(), is(equalTo(other.hashCode())));
-
-        other.setDistributionID("");
-        assertThat(data, is(not(equalTo(other))));
-
-        data.setDistributionID("1234");
-        assertThat(data, is(not(equalTo(other))));
-
-        other.setDistributionID("1234");
-        assertThat(data, is(equalTo(other)));
-        assertThat(data.hashCode(), is(equalTo(other.hashCode())));
-    }
-
-}
diff --git a/src/test/java/org/onap/aai/modelloader/restclient/TestBabelServiceClient.java b/src/test/java/org/onap/aai/modelloader/restclient/TestBabelServiceClient.java
index 77e1594..169943c 100644
--- a/src/test/java/org/onap/aai/modelloader/restclient/TestBabelServiceClient.java
+++ b/src/test/java/org/onap/aai/modelloader/restclient/TestBabelServiceClient.java
@@ -20,68 +20,65 @@
  */
 package org.onap.aai.modelloader.restclient;
 
-import static javax.servlet.http.HttpServletResponse.SC_OK;
-import static org.apache.commons.io.IOUtils.write;
 import static org.hamcrest.CoreMatchers.equalTo;
 import static org.hamcrest.CoreMatchers.is;
 import static org.hamcrest.MatcherAssert.assertThat;
 
 import java.io.IOException;
 import java.net.URISyntaxException;
-import java.nio.charset.Charset;
 import java.nio.file.Files;
 import java.nio.file.Paths;
-import java.util.ArrayList;
 import java.util.List;
 import java.util.Properties;
 
-import javax.servlet.ServletException;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
-import org.eclipse.jetty.server.Handler;
-import org.eclipse.jetty.server.Request;
-import org.eclipse.jetty.server.Server;
-import org.eclipse.jetty.server.handler.AbstractHandler;
-import org.junit.jupiter.api.AfterEach;
-import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.BeforeAll;
 import org.junit.jupiter.api.Test;
 import org.onap.aai.babel.service.data.BabelArtifact;
 import org.onap.aai.modelloader.config.ModelLoaderConfig;
 import org.onap.aai.modelloader.service.HttpsBabelServiceClientFactory;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.cloud.contract.wiremock.AutoConfigureWireMock;
 
-import com.google.gson.Gson;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.github.tomakehurst.wiremock.client.WireMock;
+import com.github.tomakehurst.wiremock.matching.EqualToPattern;
 
 /**
  * Local testing of the Babel service client.
  *
  */
+@SpringBootTest
+@AutoConfigureWireMock(port = 0)
 public class TestBabelServiceClient {
 
-    private Server server;
-    private String responseBody;
+    @Value("${wiremock.server.port}")
+    private int wiremockPort;
 
-    @BeforeEach
-    public void startJetty() throws Exception {
-        List<BabelArtifact> response = new ArrayList<>();
-        response.add(new BabelArtifact("", null, ""));
-        response.add(new BabelArtifact("", null, ""));
-        response.add(new BabelArtifact("", null, ""));
-        responseBody = new Gson().toJson(response);
-
-        server = new Server(0);
-        server.setHandler(getMockHandler());
-        server.start();
-    }
-
-    @AfterEach
-    public void stopJetty() throws Exception {
-        server.stop();
+    @BeforeAll
+    public static void setup() throws JsonProcessingException {
+        ObjectMapper objectMapper = new ObjectMapper();
+        List<BabelArtifact> artifacts = List.of(
+            new BabelArtifact("art1", null, ""),
+            new BabelArtifact("art2", null, ""),
+            new BabelArtifact("art3", null, ""));
+        WireMock.stubFor(
+            WireMock.post(WireMock.urlEqualTo("/generate"))
+                .withHeader("X-TransactionId", WireMock.equalTo("Test-Transaction-ID-BabelClient"))
+                .withHeader("X-FromAppId", WireMock.equalTo("ModelLoader"))
+                .withRequestBody(WireMock.matchingJsonPath("$.artifactName", WireMock.equalTo("service-Vscpass-Test")))
+                .withRequestBody(WireMock.matchingJsonPath("$.artifactVersion", WireMock.equalTo("1.0")))
+                .withRequestBody(WireMock.matchingJsonPath("$.csar", WireMock.matching(".*")))
+                .willReturn(
+                    WireMock.aResponse()
+                        .withHeader("Content-Type", "application/json")
+                        .withBody(objectMapper.writeValueAsString(artifacts))));
     }
 
     @Test
     public void testRestClient() throws BabelServiceClientException, IOException, URISyntaxException {
-        String url = server.getURI().toString();
+        String url = "http://localhost:" + wiremockPort;
         Properties configProperties = new Properties();
         configProperties.put("ml.babel.KEYSTORE_PASSWORD", "OBF:1vn21ugu1saj1v9i1v941sar1ugw1vo0");
         configProperties.put("ml.babel.KEYSTORE_FILE", "src/test/resources/auth/aai-client-dummy.p12");
@@ -89,7 +86,7 @@
         // In a real deployment this would be a different file (to the client keystore)
         configProperties.put("ml.babel.TRUSTSTORE_FILE", "src/test/resources/auth/aai-client-dummy.p12");
         configProperties.put("ml.babel.BASE_URL", url);
-        configProperties.put("ml.babel.GENERATE_ARTIFACTS_URL", "generate");
+        configProperties.put("ml.babel.GENERATE_ARTIFACTS_URL", "/generate");
         configProperties.put("ml.aai.RESTCLIENT_CONNECT_TIMEOUT", "12000");
         configProperties.put("ml.aai.RESTCLIENT_READ_TIMEOUT", "12000");
         BabelServiceClient client =
@@ -102,11 +99,11 @@
 
     @Test
     public void testRestClientHttp() throws BabelServiceClientException, IOException, URISyntaxException {
-        String url = server.getURI().toString();
+        String url = "http://localhost:" + wiremockPort;
         Properties configProperties = new Properties();
         configProperties.put("ml.babel.USE_HTTPS", "false");
         configProperties.put("ml.babel.BASE_URL", url);
-        configProperties.put("ml.babel.GENERATE_ARTIFACTS_URL", "generate");
+        configProperties.put("ml.babel.GENERATE_ARTIFACTS_URL", "/generate");
         configProperties.put("ml.aai.RESTCLIENT_CONNECT_TIMEOUT", "3000");
         configProperties.put("ml.aai.RESTCLIENT_READ_TIMEOUT", "3000");
         BabelServiceClient client =
@@ -121,23 +118,4 @@
     private byte[] readBytesFromFile(String resourceFile) throws IOException, URISyntaxException {
         return Files.readAllBytes(Paths.get(ClassLoader.getSystemResource(resourceFile).toURI()));
     }
-
-    /**
-     * Creates an {@link AbstractHandler handler} returning an arbitrary String as a response.
-     * 
-     * @return never <code>null</code>.
-     */
-    private Handler getMockHandler() {
-        Handler handler = new AbstractHandler() {
-            @Override
-            public void handle(String target, Request request, HttpServletRequest servletRequest,
-                    HttpServletResponse response) throws IOException, ServletException {
-                response.setStatus(SC_OK);
-                response.setContentType("text/xml;charset=utf-8");
-                write(responseBody, response.getOutputStream(), Charset.defaultCharset());
-                request.setHandled(true);
-            }
-        };
-        return handler;
-    }
 }
diff --git a/src/test/java/org/onap/aai/modelloader/restclient/TracingTest.java b/src/test/java/org/onap/aai/modelloader/restclient/TracingTest.java
new file mode 100644
index 0000000..3bfceb5
--- /dev/null
+++ b/src/test/java/org/onap/aai/modelloader/restclient/TracingTest.java
@@ -0,0 +1,63 @@
+/**
+ * ============LICENSE_START=======================================================
+ * org.onap.aai
+ * ================================================================================
+ * Copyright © 2024 Deutsche Telekom AG Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *       http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+package org.onap.aai.modelloader.restclient;
+
+import org.junit.jupiter.api.Test;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.cloud.contract.wiremock.AutoConfigureWireMock;
+import org.springframework.http.HttpStatus;
+import org.springframework.web.client.RestTemplate;
+
+import com.github.tomakehurst.wiremock.client.WireMock;
+
+@SpringBootTest(properties = {
+  "spring.sleuth.enabled=true",
+  "spring.zipkin.baseUrl=http://localhost:${wiremock.server.port}"
+})
+@AutoConfigureWireMock(port = 0)
+public class TracingTest {
+
+  @Value("${wiremock.server.port}")
+  private int wiremockPort;
+
+  @Autowired RestTemplate restTemplate;
+  
+  @Test
+  public void thatArtifactsCanBePushed() {
+    WireMock.stubFor(
+      WireMock.post(WireMock.urlEqualTo("/api/v2/spans"))
+          .willReturn(
+              WireMock.aResponse()
+                  .withStatus(HttpStatus.OK.value())));
+
+    WireMock.stubFor(
+      WireMock.get(WireMock.urlEqualTo("/"))
+          .withHeader("X-B3-TraceId", WireMock.matching(".*"))
+          .willReturn(
+              WireMock.aResponse()
+                  .withStatus(HttpStatus.OK.value())));
+
+
+    String response = restTemplate.getForObject("http://localhost:" + wiremockPort + "/", String.class);
+  }
+  
+}
diff --git a/src/test/java/org/onap/aai/modelloader/service/TestArtifactInfoImpl.java b/src/test/java/org/onap/aai/modelloader/service/TestArtifactInfoImpl.java
deleted file mode 100644
index d1d46f0..0000000
--- a/src/test/java/org/onap/aai/modelloader/service/TestArtifactInfoImpl.java
+++ /dev/null
@@ -1,123 +0,0 @@
-/**
- * ============LICENSE_START=======================================================
- * org.onap.aai
- * ================================================================================
- * Copyright © 2017-2018 AT&T Intellectual Property. All rights reserved.
- * Copyright © 2017-2018 European Software Marketing Ltd.
- * ================================================================================
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *       http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ============LICENSE_END=========================================================
- */
-package org.onap.aai.modelloader.service;
-
-import static org.hamcrest.CoreMatchers.equalTo;
-import static org.hamcrest.CoreMatchers.is;
-import static org.hamcrest.CoreMatchers.not;
-import static org.hamcrest.CoreMatchers.nullValue;
-import static org.hamcrest.MatcherAssert.assertThat;
-import static org.hamcrest.Matchers.empty;
-
-import org.junit.jupiter.api.Test;
-
-/**
- * Tests for NotificationDataImpl class
- *
- */
-public class TestArtifactInfoImpl {
-
-    @Test
-    public void testGettersAndSetters() {
-        ArtifactInfoImpl info = new ArtifactInfoImpl();
-        String artifactName = "testname";
-
-        info.setArtifactName(artifactName);
-        assertThat(info.getArtifactName(), is(equalTo(artifactName)));
-
-        String artifactType = "test-type";
-        info.setArtifactType(artifactType);
-        assertThat(info.getArtifactType(), is(equalTo(artifactType)));
-
-        String artifactVersion = "v1";
-        info.setArtifactVersion(artifactVersion);
-        assertThat(info.getArtifactVersion(), is(equalTo(artifactVersion)));
-
-        String artifactDescription = "test description";
-        info.setArtifactDescription(artifactDescription);
-        assertThat(info.getArtifactDescription(), is(equalTo(artifactDescription)));
-
-        assertThat(info.getArtifactChecksum(), is(nullValue()));
-        assertThat(info.getArtifactTimeout(), is(nullValue()));
-        assertThat(info.getArtifactURL(), is(nullValue()));
-        assertThat(info.getArtifactUUID(), is(nullValue()));
-        assertThat(info.getGeneratedArtifact(), is(nullValue()));
-        assertThat(info.getRelatedArtifacts(), is(empty()));
-    }
-
-
-    @Test
-    public void testEquality() {
-        ArtifactInfoImpl info = new ArtifactInfoImpl();
-        assertThat(info, is(not(equalTo(null))));
-        assertThat(info, is(not(equalTo("")))); // NOSONAR
-        assertThat(info, is(equalTo(info)));
-
-        ArtifactInfoImpl other = new ArtifactInfoImpl();
-        assertThat(info, is(equalTo(other)));
-        assertThat(info.hashCode(), is(equalTo(other.hashCode())));
-
-        // Artifact Name
-        other.setArtifactName("");
-        assertThat(info, is(not(equalTo(other))));
-
-        info.setArtifactName("1234");
-        assertThat(info, is(not(equalTo(other))));
-
-        other.setArtifactName("1234");
-        assertThat(info, is(equalTo(other)));
-        assertThat(info.hashCode(), is(equalTo(other.hashCode())));
-
-        // Artifact Type
-        other.setArtifactType("");
-        assertThat(info, is(not(equalTo(other))));
-
-        info.setArtifactType("type");
-        assertThat(info, is(not(equalTo(other))));
-
-        other.setArtifactType("type");
-        assertThat(info, is(equalTo(other)));
-        assertThat(info.hashCode(), is(equalTo(other.hashCode())));
-
-        // Artifact Description
-        other.setArtifactDescription("");
-        assertThat(info, is(not(equalTo(other))));
-
-        info.setArtifactDescription("type");
-        assertThat(info, is(not(equalTo(other))));
-
-        other.setArtifactDescription("type");
-        assertThat(info, is(equalTo(other)));
-        assertThat(info.hashCode(), is(equalTo(other.hashCode())));
-
-        // Artifact Version
-        other.setArtifactVersion("");
-        assertThat(info, is(not(equalTo(other))));
-
-        info.setArtifactVersion("v1");
-        assertThat(info, is(not(equalTo(other))));
-
-        other.setArtifactVersion("v1");
-        assertThat(info, is(equalTo(other)));
-        assertThat(info.hashCode(), is(equalTo(other.hashCode())));
-    }
-
-}
diff --git a/src/test/resources/__files/artifactTypes.json b/src/test/resources/__files/artifactTypes.json
new file mode 100644
index 0000000..de3cfce
--- /dev/null
+++ b/src/test/resources/__files/artifactTypes.json
@@ -0,0 +1,63 @@
+[
+  "AAI_SERVICE_MODEL",
+  "AAI_VF_INSTANCE_MODEL",
+  "AAI_VF_MODEL",
+  "AAI_VF_MODULE_MODEL",
+  "ANSIBLE_PLAYBOOK",
+  "APPC_CONFIG",
+  "BPEL",
+  "CHEF",
+  "CLOUD_TECHNOLOGY_SPECIFIC_ARTIFACT",
+  "CONTROLLER_BLUEPRINT_ARCHIVE",
+  "DCAE_DOC",
+  "DCAE_EVENT",
+  "DCAE_INVENTORY_BLUEPRINT",
+  "DCAE_INVENTORY_DOC",
+  "DCAE_INVENTORY_EVENT",
+  "DCAE_INVENTORY_JSON",
+  "DCAE_INVENTORY_POLICY",
+  "DCAE_INVENTORY_TOSCA",
+  "DCAE_JSON",
+  "DCAE_POLICY",
+  "DCAE_TOSCA",
+  "DG_XML",
+  "ETSI_PACKAGE",
+  "ASD_PACKAGE",
+  "GUIDE",
+  "HEAT_ARTIFACT",
+  "HEAT_ENV",
+  "HEAT",
+  "HEAT_NESTED",
+  "HEAT_NET",
+  "HEAT_VOL",
+  "HELM",
+  "ICON",
+  "LIFECYCLE_OPERATIONS",
+  "MODEL_INVENTORY_PROFILE",
+  "MODEL_QUERY_SPEC",
+  "MURANO_PKG",
+  "NETWORK_CALL_FLOW",
+  "ONBOARDED_PACKAGE",
+  "OTHER",
+  "PERFORMANCE_COUNTER",
+  "PLAN",
+  "PM_DICTIONARY",
+  "PNF_SW_INFORMATION",
+  "PUPPET",
+  "SHELL_SCRIPT",
+  "SHELL",
+  "SNMP_POLL",
+  "SNMP_TRAP",
+  "TOSCA_CSAR",
+  "TOSCA_TEMPLATE",
+  "UCPE_LAYER_2_CONFIGURATION",
+  "VENDOR_LICENSE",
+  "VES_EVENTS",
+  "VF_LICENSE",
+  "VF_MODULES_METADATA",
+  "VNF_CATALOG",
+  "WORKFLOW",
+  "YANG_MODULE",
+  "YANG_XML",
+  "YANG"
+]
\ No newline at end of file
diff --git a/src/test/resources/__files/kafkaBootstrap.json b/src/test/resources/__files/kafkaBootstrap.json
new file mode 100644
index 0000000..1820ade
--- /dev/null
+++ b/src/test/resources/__files/kafkaBootstrap.json
@@ -0,0 +1,5 @@
+{
+  "kafkaBootStrapServer": "localhost:9092",
+  "distrNotificationTopicName": "SDC-DISTR-NOTIF-TOPIC-AUTO",
+  "distrStatusTopicName": "SDC-DISTR-STATUS-TOPIC-AUTO"
+}
\ No newline at end of file
diff --git a/src/test/resources/__files/modelResponse.xml b/src/test/resources/__files/modelResponse.xml
new file mode 100644
index 0000000..36d07d8
--- /dev/null
+++ b/src/test/resources/__files/modelResponse.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<model xmlns="http://org.onap.aai.inventory/v28">
+  <model-invariant-id>3a40ab73-6694-4e75-bb6d-9a4a86ce35b3</model-invariant-id>
+  <model-type>service</model-type>
+  <model-role>Network Service</model-role>
+  <resource-version>1710523260974</resource-version>
+</model>
\ No newline at end of file
diff --git a/src/test/resources/__files/service-TestSvc-csar-babel-response.json b/src/test/resources/__files/service-TestSvc-csar-babel-response.json
new file mode 100644
index 0000000..7103156
--- /dev/null
+++ b/src/test/resources/__files/service-TestSvc-csar-babel-response.json
@@ -0,0 +1 @@
+[{"name":"AAI-test-svc-service-2.0.xml","type":"MODEL","payload":"<model xmlns=\"http://org.onap.aai.inventory/v28\">\n    <model-invariant-id>3c8bc8e7-e387-46ed-8616-70e99e2206dc</model-invariant-id>\n    <model-type>service</model-type>\n    <model-role>Network L1-3</model-role>\n    <model-vers>\n        <model-ver>\n            <model-version-id>71f47717-b100-4eac-940b-7d4e86a4cbb7</model-version-id>\n            <model-name>test-svc</model-name>\n            <model-version>2.0</model-version>\n            <model-description>test-svc</model-description>\n            <model-elements>\n                <model-element>\n                    <new-data-del-flag>T</new-data-del-flag>\n                    <cardinality>unbounded</cardinality>\n                    <model-elements/>\n                    <relationship-list>\n                        <relationship>\n                            <related-to>model-ver</related-to>\n                            <relationship-data>\n                                <relationship-key>model-ver.model-version-id</relationship-key>\n                                <relationship-value>46b92144-923a-4d20-b85a-3cbd847668a9</relationship-value>\n                            </relationship-data>\n                            <relationship-data>\n                                <relationship-key>model.model-invariant-id</relationship-key>\n                                <relationship-value>82194af1-3c2c-485a-8f44-420e22a9eaa4</relationship-value>\n                            </relationship-data>\n                        </relationship>\n                    </relationship-list>\n                </model-element>\n            </model-elements>\n        </model-ver>\n    </model-vers>\n</model>"}]
\ No newline at end of file
diff --git a/src/test/resources/__files/service-TestSvc-csar.csar b/src/test/resources/__files/service-TestSvc-csar.csar
new file mode 100644
index 0000000..711f068
--- /dev/null
+++ b/src/test/resources/__files/service-TestSvc-csar.csar
Binary files differ
diff --git a/src/test/resources/application.properties b/src/test/resources/application.properties
index 96816ce..69f4ff7 100644
--- a/src/test/resources/application.properties
+++ b/src/test/resources/application.properties
@@ -1,10 +1,11 @@
 CONFIG_HOME=src/test/resources
 spring.kafka.consumer.auto-offset-reset=earliest
 spring.kafka.consumer.group-id=aai
-spring.kafka.consumer.client-id=aai-model-loader
-      
-test.topic=SDC-DISTR-NOTIF-TOPIC
+spring.kafka.consumer.client-id=aai-model-loader   
+topics.distribution.notification=SDC-DISTR-NOTIF-TOPIC-AUTO
 
 spring.sleuth.enabled=false
 
-ml.distribution.connection.enabled=false # avoid having the distribution client running in the background (requires active kafka)
\ No newline at end of file
+ml.distribution.connection.enabled=false # avoid having the distribution client running in the background (requires active kafka)
+
+spring.main.allow-bean-definition-overriding=true
\ No newline at end of file
diff --git a/src/test/resources/logback-test.xml b/src/test/resources/logback-test.xml
index aef38e6..4bf73da 100644
--- a/src/test/resources/logback-test.xml
+++ b/src/test/resources/logback-test.xml
@@ -11,7 +11,7 @@
 		<appender-ref ref="STDOUT" />
 	</logger>
 
-	<root level="debug">
+	<root level="INFO">
 		<appender-ref ref="STDOUT" />
 	</root>
 </configuration>
diff --git a/src/test/resources/model-loader.properties b/src/test/resources/model-loader.properties
index 4c24679..2db7c09 100644
--- a/src/test/resources/model-loader.properties
+++ b/src/test/resources/model-loader.properties
@@ -1,16 +1,20 @@
 # Model Loader Distribution Client Configuration
 ml.distribution.ACTIVE_SERVER_TLS_AUTH=false
 ml.distribution.ASDC_ADDRESS=localhost:8443
+ml.distribution.ASDC_USE_HTTPS=false
 ml.distribution.CONSUMER_GROUP=aai-ml-group-test
 ml.distribution.CONSUMER_ID=aai-ml-id-test
-ml.distribution.ENVIRONMENT_NAME=env
+ml.distribution.ENVIRONMENT_NAME=AUTO
 ml.distribution.KEYSTORE_PASSWORD=
 ml.distribution.KEYSTORE_FILE=
 ml.distribution.PASSWORD=Aa123456
-ml.distribution.POLLING_INTERVAL=5
+ml.distribution.POLLING_INTERVAL=15
 ml.distribution.POLLING_TIMEOUT=3
 ml.distribution.USER=ci
 ml.distribution.ARTIFACT_TYPES=MODEL_QUERY_SPEC,TOSCA_CSAR
+ml.distribution.SASL_JAAS_CONFIG=org.apache.kafka.common.security.scram.ScramLoginModule required username="aai-modelloader-ku" password="somePassword";
+ml.distribution.SECURITY_PROTOCOL=PLAINTEXT
+ml.distribution.SASL_MECHANISM=PLAIN
 
 # Disable ASDC polling & enable REST interface
 ml.distribution.ASDC_CONNECTION_DISABLE=true