Merge "Added test for AAIProducerTask"
diff --git a/pom.xml b/pom.xml
index 20d01aa..4b4d369 100644
--- a/pom.xml
+++ b/pom.xml
@@ -226,7 +226,7 @@
               <exclude>**/*IT.java</exclude>
             </excludes>
             <!-- Sets the VM argument line used when unit tests are run. -->
-            <argLine>${surefireArgLine}</argLine>
+            <argLine>${argLine}</argLine>
           </configuration>
           <dependencies>
             <dependency>
@@ -321,6 +321,50 @@
           <artifactId>maven-resources-plugin</artifactId>
           <version>${resource.maven.plugin.version}</version>
         </plugin>
+        <plugin>
+          <groupId>org.jacoco</groupId>
+          <artifactId>jacoco-maven-plugin</artifactId>
+          <executions>
+            <execution>
+              <id>default-prepare-agent</id>
+              <goals>
+                <goal>prepare-agent</goal>
+              </goals>
+            </execution>
+            <execution>
+              <id>report</id>
+              <phase>prepare-package</phase>
+              <goals>
+                <goal>report</goal>
+              </goals>
+            </execution>
+            <execution>
+              <id>check</id>
+              <goals>
+                <goal>check</goal>
+              </goals>
+              <configuration>
+                <rules>
+                  <rule>
+                    <element>CLASS</element>
+                    <limits>
+                      <limit>
+                        <counter>LINE</counter>
+                        <value>COVEREDRATIO</value>
+                        <!--<minimum>0.70</minimum>-->
+                      </limit>
+                      <limit>
+                        <counter>BRANCH</counter>
+                        <value>COVEREDRATIO</value>
+                        <!--<minimum>0.70</minimum>-->
+                      </limit>
+                    </limits>
+                  </rule>
+                </rules>
+              </configuration>
+            </execution>
+          </executions>
+        </plugin>
       </plugins>
     </pluginManagement>
     <plugins>
@@ -354,6 +398,10 @@
         <artifactId>maven-javadoc-plugin</artifactId>
       </plugin>
 
+      <plugin>
+        <groupId>org.jacoco</groupId>
+        <artifactId>jacoco-maven-plugin</artifactId>
+      </plugin>
     </plugins>
   </build>
 
diff --git a/prh-app-server/src/main/java/org/onap/dcaegen2/services/prh/tasks/AAIProducerTask.java b/prh-app-server/src/main/java/org/onap/dcaegen2/services/prh/tasks/AAIProducerTask.java
index 8545949..23d5e93 100644
--- a/prh-app-server/src/main/java/org/onap/dcaegen2/services/prh/tasks/AAIProducerTask.java
+++ b/prh-app-server/src/main/java/org/onap/dcaegen2/services/prh/tasks/AAIProducerTask.java
@@ -28,5 +28,5 @@
 
     protected abstract V publish(U message) throws AAINotFoundException;
 
-    protected abstract T resolveConfiguration();
+    protected abstract T resolveClient();
 }
diff --git a/prh-app-server/src/main/java/org/onap/dcaegen2/services/prh/tasks/AAIProducerTaskImpl.java b/prh-app-server/src/main/java/org/onap/dcaegen2/services/prh/tasks/AAIProducerTaskImpl.java
index 505d2a9..3f78e7c 100644
--- a/prh-app-server/src/main/java/org/onap/dcaegen2/services/prh/tasks/AAIProducerTaskImpl.java
+++ b/prh-app-server/src/main/java/org/onap/dcaegen2/services/prh/tasks/AAIProducerTaskImpl.java
@@ -19,6 +19,7 @@
  */
 package org.onap.dcaegen2.services.prh.tasks;
 
+import java.io.IOException;
 import org.onap.dcaegen2.services.config.AAIClientConfiguration;
 import org.onap.dcaegen2.services.model.ConsumerDmaapModel;
 import org.onap.dcaegen2.services.prh.configuration.AppConfig;
@@ -31,18 +32,16 @@
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 
-import java.io.IOException;
-
 /**
  * @author <a href="mailto:przemyslaw.wasala@nokia.com">Przemysław Wąsala</a> on 4/13/18
  */
 @Component
-public class AAIProducerTaskImpl extends AAIProducerTask<AAIClientConfiguration, ConsumerDmaapModel, Object> {
+public class AAIProducerTaskImpl extends AAIProducerTask<AAIProducerClient, ConsumerDmaapModel, Object> {
 
     private static final Logger logger = LoggerFactory.getLogger(AAIProducerTaskImpl.class);
 
     private final Config prhAppConfig;
-
+    private AAIProducerClient aaiProducerClient;
 
     @Autowired
     public AAIProducerTaskImpl(AppConfig prhAppConfig) {
@@ -51,11 +50,12 @@
 
     @Override
     protected Object publish(ConsumerDmaapModel consumerDmaapModel) throws AAINotFoundException {
-        logger.trace("Method %M called with arg {}", consumerDmaapModel);
-        AAIProducerClient producerClient = new AAIProducerClient(resolveConfiguration());
+        logger.trace("Method called with arg {}", consumerDmaapModel);
+
         try {
-            return  producerClient.getHttpResponse(consumerDmaapModel)
-                    .filter(HttpUtils::isSuccessfulResponseCode);
+            return aaiProducerClient.getHttpResponse(consumerDmaapModel)
+                .filter(HttpUtils::isSuccessfulResponseCode).map(response -> consumerDmaapModel).orElseThrow(() ->
+                    new AAINotFoundException("Incorrect response code for continuation of tasks workflow"));
         } catch (IOException e) {
             logger.warn("Patch request not successful", e);
             throw new AAINotFoundException("Patch request not successful");
@@ -64,7 +64,8 @@
 
     @Override
     public Object execute(Object object) throws AAINotFoundException {
-        logger.trace("Method %M called with arg {}", object);
+        setAAIClientConfig();
+        logger.trace("Method called with arg {}", object);
 
         if (object instanceof ConsumerDmaapModel) {
             return publish((ConsumerDmaapModel) object);
@@ -78,8 +79,16 @@
         logger.trace("initConfigs for AAIProducerTaskImpl not needed/supported");
     }
 
-    @Override
+    protected void setAAIClientConfig() {
+        aaiProducerClient = resolveClient();
+    }
+
     protected AAIClientConfiguration resolveConfiguration() {
         return prhAppConfig.getAAIClientConfiguration();
     }
+
+    @Override
+    protected AAIProducerClient resolveClient() {
+        return new AAIProducerClient(resolveConfiguration());
+    }
 }
diff --git a/prh-app-server/src/main/java/org/onap/dcaegen2/services/prh/tasks/DmaapConsumerTaskImpl.java b/prh-app-server/src/main/java/org/onap/dcaegen2/services/prh/tasks/DmaapConsumerTaskImpl.java
index 69911f3..e9f8ec4 100644
--- a/prh-app-server/src/main/java/org/onap/dcaegen2/services/prh/tasks/DmaapConsumerTaskImpl.java
+++ b/prh-app-server/src/main/java/org/onap/dcaegen2/services/prh/tasks/DmaapConsumerTaskImpl.java
@@ -51,13 +51,13 @@
 
     @Override
     protected ConsumerDmaapModel consume(String message) throws DmaapNotFoundException {
-        logger.trace("Method %M called with arg {}", message);
+        logger.trace("Method called with arg {}", message);
         return DmaapConsumerJsonParser.getJsonObject(message);
     }
 
     @Override
     public Object execute(Object object) throws PrhTaskException {
-        logger.trace("Method %M called with arg {}", object);
+        logger.trace("Method called with arg {}", object);
         ExtendedDmaapConsumerHttpClientImpl dmaapConsumerHttpClient = new ExtendedDmaapConsumerHttpClientImpl(
             resolveConfiguration());
         return consume((dmaapConsumerHttpClient.getHttpConsumerResponse().orElseThrow(() ->
diff --git a/prh-app-server/src/main/java/org/onap/dcaegen2/services/prh/tasks/DmaapPublisherTaskImpl.java b/prh-app-server/src/main/java/org/onap/dcaegen2/services/prh/tasks/DmaapPublisherTaskImpl.java
index 4fef035..27742d1 100644
--- a/prh-app-server/src/main/java/org/onap/dcaegen2/services/prh/tasks/DmaapPublisherTaskImpl.java
+++ b/prh-app-server/src/main/java/org/onap/dcaegen2/services/prh/tasks/DmaapPublisherTaskImpl.java
@@ -51,7 +51,7 @@
 
     @Override
     protected String publish(ConsumerDmaapModel consumerDmaapModel) throws DmaapNotFoundException {
-        logger.trace("Method %M called with arg {}", consumerDmaapModel);
+        logger.trace("Method called with arg {}", consumerDmaapModel);
         ExtendedDmaapProducerHttpClientImpl dmaapProducerHttpClient = new ExtendedDmaapProducerHttpClientImpl(
                 resolveConfiguration());
 
@@ -63,7 +63,7 @@
     @Override
     public Object execute(Object object) throws PrhTaskException {
         if (object instanceof ConsumerDmaapModel) {
-            logger.trace("Method %M called with arg {}", object);
+            logger.trace("Method called with arg {}", object);
             return publish((ConsumerDmaapModel) object);
         }
         throw new DmaapNotFoundException("Incorrect object type");
diff --git a/prh-app-server/src/test/java/org/onap/dcaegen2/services/prh/tasks/AAIProducerTaskImplTest.java b/prh-app-server/src/test/java/org/onap/dcaegen2/services/prh/tasks/AAIProducerTaskImplTest.java
new file mode 100644
index 0000000..4b48196
--- /dev/null
+++ b/prh-app-server/src/test/java/org/onap/dcaegen2/services/prh/tasks/AAIProducerTaskImplTest.java
@@ -0,0 +1,175 @@
+/*
+ * ============LICENSE_START=======================================================
+ * PNF-REGISTRATION-HANDLER
+ * ================================================================================
+ * Copyright (C) 2018 NOKIA 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.dcaegen2.services.prh.tasks;
+
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.Mockito.doReturn;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.times;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.verifyNoMoreInteractions;
+import static org.mockito.Mockito.when;
+
+import java.io.IOException;
+import java.util.Optional;
+import org.junit.jupiter.api.Assertions;
+import org.junit.jupiter.api.BeforeAll;
+import org.junit.jupiter.api.Test;
+import org.onap.dcaegen2.services.config.AAIClientConfiguration;
+import org.onap.dcaegen2.services.config.ImmutableAAIClientConfiguration;
+import org.onap.dcaegen2.services.model.ConsumerDmaapModel;
+import org.onap.dcaegen2.services.model.ImmutableConsumerDmaapModel;
+import org.onap.dcaegen2.services.prh.configuration.AppConfig;
+import org.onap.dcaegen2.services.prh.exceptions.AAINotFoundException;
+import org.onap.dcaegen2.services.prh.exceptions.PrhTaskException;
+import org.onap.dcaegen2.services.service.AAIProducerClient;
+
+/**
+ * @author <a href="mailto:przemyslaw.wasala@nokia.com">Przemysław Wąsala</a> on 5/14/18
+ */
+class AAIProducerTaskImplTest {
+
+    private static ConsumerDmaapModel consumerDmaapModel;
+    private static AAIProducerTaskImpl aaiProducerTask;
+
+    private static final String AAI_HOST = "/aai/v11/network/pnfs/pnf/NOKQTFCOC540002E";
+    private static final Integer PORT = 1234;
+    private static final String PROTOCOL = "https";
+    private static final String USER_NAME_PASSWORD = "PRH";
+    private static final String BASE_PATH = "/aai/v11";
+    private static final String PNF_PATH = "/network/pnfs/pnf";
+
+    private static AAIClientConfiguration aaiClientConfiguration;
+    private static AAIProducerClient aaiProducerClient;
+    private static AppConfig appConfig;
+
+    @BeforeAll
+    public static void setUp() {
+        aaiClientConfiguration = new ImmutableAAIClientConfiguration.Builder()
+            .aaiHost(AAI_HOST)
+            .aaiHostPortNumber(PORT)
+            .aaiProtocol(PROTOCOL)
+            .aaiUserName(USER_NAME_PASSWORD)
+            .aaiUserPassword(USER_NAME_PASSWORD)
+            .aaiIgnoreSSLCertificateErrors(true)
+            .aaiBasePath(BASE_PATH)
+            .aaiPnfPath(PNF_PATH)
+            .build();
+        consumerDmaapModel = ImmutableConsumerDmaapModel.builder().ipv4("10.16.123.234")
+            .ipv6("0:0:0:0:0:FFFF:0A10:7BEA")
+            .pnfName("NOKQTFCOC540002E").build();
+        appConfig = mock(AppConfig.class);
+
+    }
+
+    @Test
+    public void whenPassedObjectDoesntFit_ThrowsPrhTaskException() throws IOException {
+        //given
+        Object response = null;
+
+        //when
+        when(appConfig.getAAIClientConfiguration()).thenReturn(aaiClientConfiguration);
+        try {
+            aaiProducerTask = new AAIProducerTaskImpl(appConfig);
+            response = aaiProducerTask.execute("Some string");
+        } catch (PrhTaskException e) {
+            e.printStackTrace();
+        }
+
+        //then
+        Assertions.assertNull(response);
+    }
+
+    @Test
+    public void whenPassedObjectFits_ReturnsCorrectStatus() throws AAINotFoundException, IOException {
+        //given
+        Object response;
+        aaiProducerClient = mock(AAIProducerClient.class);
+
+        //when
+        when(aaiProducerClient.getHttpResponse(consumerDmaapModel)).thenReturn(Optional.of(200));
+        when(appConfig.getAAIClientConfiguration()).thenReturn(aaiClientConfiguration);
+        aaiProducerTask = spy(new AAIProducerTaskImpl(appConfig));
+        when(aaiProducerTask.resolveConfiguration()).thenReturn(aaiClientConfiguration);
+        doReturn(aaiProducerClient).when(aaiProducerTask).resolveClient();
+        aaiProducerTask.setAAIClientConfig();
+        aaiProducerTask.initConfigs();
+        response = aaiProducerTask.execute(consumerDmaapModel);
+
+        //then
+        verify(aaiProducerClient, times(1)).getHttpResponse(any(ConsumerDmaapModel.class));
+        verifyNoMoreInteractions(aaiProducerClient);
+        Assertions.assertNotNull(response);
+        Assertions.assertEquals(consumerDmaapModel, response);
+
+    }
+
+    @Test
+    public void whenPassedObjectFits_butIncorrectResponseReturns() throws IOException {
+        //given
+        Object response = null;
+        aaiProducerClient = mock(AAIProducerClient.class);
+        //when
+        when(aaiProducerClient.getHttpResponse(consumerDmaapModel)).thenReturn(Optional.of(400));
+        when(appConfig.getAAIClientConfiguration()).thenReturn(aaiClientConfiguration);
+        aaiProducerTask = spy(new AAIProducerTaskImpl(appConfig));
+        when(aaiProducerTask.resolveConfiguration()).thenReturn(aaiClientConfiguration);
+        doReturn(aaiProducerClient).when(aaiProducerTask).resolveClient();
+        aaiProducerTask.setAAIClientConfig();
+        aaiProducerTask.initConfigs();
+        try {
+            response = aaiProducerTask.execute(consumerDmaapModel);
+        } catch (AAINotFoundException e) {
+            e.printStackTrace();
+        }
+
+        //then
+        verify(aaiProducerClient, times(1)).getHttpResponse(any(ConsumerDmaapModel.class));
+        verifyNoMoreInteractions(aaiProducerClient);
+        Assertions.assertNull(response);
+    }
+
+    @Test
+    public void whenPassedObjectFits_ThrowsIOException() throws IOException {
+        //given
+        Object response = null;
+        aaiProducerClient = mock(AAIProducerClient.class);
+        //when
+        when(appConfig.getAAIClientConfiguration()).thenReturn(aaiClientConfiguration);
+        when(aaiProducerClient.getHttpResponse(consumerDmaapModel)).thenThrow(IOException.class);
+        aaiProducerTask = spy(new AAIProducerTaskImpl(appConfig));
+        when(aaiProducerTask.resolveConfiguration()).thenReturn(aaiClientConfiguration);
+        doReturn(aaiProducerClient).when(aaiProducerTask).resolveClient();
+        aaiProducerTask.setAAIClientConfig();
+        aaiProducerTask.initConfigs();
+        try {
+            response = aaiProducerTask.execute(consumerDmaapModel);
+        } catch (AAINotFoundException e) {
+            e.printStackTrace();
+        }
+
+        //then
+        verify(aaiProducerClient, times(1)).getHttpResponse(any(ConsumerDmaapModel.class));
+        verifyNoMoreInteractions(aaiProducerClient);
+        Assertions.assertNull(response);
+    }
+}
\ No newline at end of file
diff --git a/prh-app-server/src/test/java/org/onap/dcaegen2/services/prh/tasks/AAIPublisherTaskSpy.java b/prh-app-server/src/test/java/org/onap/dcaegen2/services/prh/tasks/AAIPublisherTaskSpy.java
index 77323ab..1e843d9 100644
--- a/prh-app-server/src/test/java/org/onap/dcaegen2/services/prh/tasks/AAIPublisherTaskSpy.java
+++ b/prh-app-server/src/test/java/org/onap/dcaegen2/services/prh/tasks/AAIPublisherTaskSpy.java
@@ -21,6 +21,7 @@
 
 import org.onap.dcaegen2.services.config.AAIClientConfiguration;
 import org.onap.dcaegen2.services.prh.configuration.AppConfig;
+import org.onap.dcaegen2.services.service.AAIProducerClient;
 import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
 import org.springframework.context.annotation.Primary;
@@ -36,8 +37,12 @@
     @Bean
     @Primary
     public AAIProducerTask registerSimpleAAIPublisherTask() {
-        AppConfig appConfig = mock(AppConfig.class);
-        when(appConfig.getAAIClientConfiguration()).thenReturn(mock(AAIClientConfiguration.class));
-        return spy(new AAIProducerTaskImpl(appConfig));
+        AppConfig appConfig = spy(AppConfig.class);
+        doReturn(mock(AAIClientConfiguration.class)).when(appConfig).getAAIClientConfiguration();
+        AAIProducerTaskImpl aaiProducerTask = spy(new AAIProducerTaskImpl(appConfig));
+        AAIProducerClient aaiProducerClient = mock(AAIProducerClient.class);
+        doReturn(mock(AAIClientConfiguration.class)).when(aaiProducerTask).resolveConfiguration();
+        doReturn(aaiProducerClient).when(aaiProducerTask).resolveClient();
+        return aaiProducerTask;
     }
 }