Enhance ModelDistributionTest in resources to test redistribution 51/138851/3
authorFiete Ostkamp <Fiete.Ostkamp@telekom.de>
Tue, 27 Aug 2024 09:34:56 +0000 (11:34 +0200)
committerFiete Ostkamp <Fiete.Ostkamp@telekom.de>
Tue, 27 Aug 2024 15:56:02 +0000 (17:56 +0200)
- use WebTestClient in ModelDistributionTest
- add test for redistribution

Issue-ID: AAI-3977
Change-Id: I1db72bd9af50931a487e31576b2f14d21fc3b4c1
Signed-off-by: Fiete Ostkamp <Fiete.Ostkamp@telekom.de>
aai-resources/pom.xml
aai-resources/src/test/java/org/onap/aai/entities/Model.java [new file with mode: 0644]
aai-resources/src/test/java/org/onap/aai/entities/ModelElement.java [new file with mode: 0644]
aai-resources/src/test/java/org/onap/aai/entities/ModelVersion.java [new file with mode: 0644]
aai-resources/src/test/java/org/onap/aai/rest/ModelDistributionTest.java
aai-resources/src/test/resources/payloads/models/model-version.xml [new file with mode: 0644]
aai-resources/src/test/resources/payloads/models/network-service.xml

index 51f9651..51c9621 100644 (file)
             <groupId>org.apache.httpcomponents</groupId>
             <artifactId>httpclient</artifactId>
         </dependency>
+        <dependency>
+            <groupId>org.assertj</groupId>
+            <artifactId>assertj-core</artifactId>
+            <version>3.21.0</version>
+            <scope>test</scope>
+        </dependency>
+
         <dependency>
             <groupId>org.skyscreamer</groupId>
             <artifactId>jsonassert</artifactId>
diff --git a/aai-resources/src/test/java/org/onap/aai/entities/Model.java b/aai-resources/src/test/java/org/onap/aai/entities/Model.java
new file mode 100644 (file)
index 0000000..d33d2d0
--- /dev/null
@@ -0,0 +1,62 @@
+/**
+ * ============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.entities;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import java.util.List;
+
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+/**
+ * Describes the model returned by aai-resources
+ */
+@Data
+@Builder
+@AllArgsConstructor
+@NoArgsConstructor
+public class Model {
+
+  @JsonProperty("model-invariant-id")
+  private String modelInvariantId;
+
+  @JsonProperty("model-role")
+  private String modelRole;
+
+  @JsonProperty("model-type")
+  private String modelType;
+
+  @JsonProperty("data-owner")
+  private String dataOwner;
+
+  @JsonProperty("data-source")
+  private String dataSource;
+
+  @JsonProperty("data-source-version")
+  private String dataSourceVersion;
+
+  @JsonProperty("resource-version")
+  private String resourceVersion;
+
+  @JsonProperty("model-vers")
+  List<ModelVersion> modelVersions;
+}
diff --git a/aai-resources/src/test/java/org/onap/aai/entities/ModelElement.java b/aai-resources/src/test/java/org/onap/aai/entities/ModelElement.java
new file mode 100644 (file)
index 0000000..ae85780
--- /dev/null
@@ -0,0 +1,48 @@
+/**
+ * ============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.entities;
+
+import java.util.List;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+@Data
+@Builder
+@AllArgsConstructor
+@NoArgsConstructor
+public class ModelElement {
+
+  @JsonProperty("model-element-uuid")
+  private String modelElementUuid;
+
+  @JsonProperty("new-data-del-flag")
+  private String newDataDelFlag;
+
+  @JsonProperty("cardinality")
+  private String cardinality;
+
+  @JsonProperty("model-description")
+  private String modelDescription;
+}
diff --git a/aai-resources/src/test/java/org/onap/aai/entities/ModelVersion.java b/aai-resources/src/test/java/org/onap/aai/entities/ModelVersion.java
new file mode 100644 (file)
index 0000000..2e0a68c
--- /dev/null
@@ -0,0 +1,72 @@
+/**
+ * ============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.entities;
+
+import java.util.List;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+@Data
+@Builder
+@AllArgsConstructor
+@NoArgsConstructor
+public class ModelVersion {
+
+  @JsonProperty("model-version-id")
+  private String modelVersionId;
+
+  @JsonProperty("model-name")
+  private String modelName;
+
+  @JsonProperty("model-version")
+  private String modelVersion;
+
+  @JsonProperty("distribution-status")
+  private String distributionStatus;
+
+  @JsonProperty("model-description")
+  private String modelDescription;
+
+  @JsonProperty("sdnc-model-name")
+  private String sdncModelName;
+
+  @JsonProperty("sdnc-model-version")
+  private String sdncModelVersion;
+
+  @JsonProperty("data-owner")
+  private String dataOwner;
+
+  @JsonProperty("data-source")
+  private String dataSource;
+
+  @JsonProperty("data-source-version")
+  private String dataSourceVersion;
+
+  @JsonProperty("resource-version")
+  private String resourceVersion;
+
+  @JsonProperty("model-elements")
+  List<ModelElement> modelElements;
+}
index 6679c0b..9ea7f7e 100644 (file)
  */
 package org.onap.aai.rest;
 
-import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNull;
 
-import java.net.URI;
 import java.nio.file.Files;
 import java.nio.file.Paths;
-import java.util.Collections;
 
+import org.assertj.core.api.Assertions;
+import org.junit.jupiter.api.MethodOrderer;
+import org.junit.jupiter.api.Order;
 import org.junit.jupiter.api.Test;
-import org.springframework.http.HttpEntity;
-import org.springframework.http.HttpMethod;
-import org.springframework.http.HttpStatus;
+import org.junit.jupiter.api.TestMethodOrder;
+import org.onap.aai.config.WebClientConfiguration;
+import org.onap.aai.entities.Model;
+import org.onap.aai.entities.ModelVersion;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.boot.test.context.SpringBootTest.WebEnvironment;
+import org.springframework.context.annotation.Import;
+
 import org.springframework.http.MediaType;
-import org.springframework.http.ResponseEntity;
-import org.springframework.web.util.DefaultUriBuilderFactory;
+import org.springframework.test.web.reactive.server.WebTestClient;
 
 import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.dataformat.xml.XmlMapper;
 
 /**
- * Test designed to imitate model-loader behaviour when distributing models via xml to aai-resources.
- * Similar to test in https://gerrit.onap.org/r/gitweb?p=aai/model-loader.git;a=blob;f=src/test/java/org/onap/aai/modelloader/restclient/TestAaiRestClient.java;h=ebdfcfe45285f14efc2f706caa49f0191b108619;hb=HEAD#l46
+ * Test designed to imitate model-loader behaviour when distributing models via
+ * xml to aai-resources.
+ * Similar to test in
+ * https://gerrit.onap.org/r/gitweb?p=aai/model-loader.git;a=blob;f=src/test/java/org/onap/aai/modelloader/restclient/TestAaiRestClient.java;h=ebdfcfe45285f14efc2f706caa49f0191b108619;hb=HEAD#l46
  */
-public class ModelDistributionTest extends AbstractSpringRestTest {
+@Import(WebClientConfiguration.class)
+@TestMethodOrder(MethodOrderer.OrderAnnotation.class)
+@SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT)
+public class ModelDistributionTest {
+
+    ObjectMapper objectMapper = new XmlMapper();
+
+    @Autowired
+    WebTestClient webClient;
+    final String MODEL_FILE = "src/test/resources/payloads/models/network-service.xml";
 
     @Test
+    @Order(1)
     public void thatModelsCanBeDistributed() throws Exception {
-        final String MODEL_FILE = "src/test/resources/payloads/models/network-service.xml";
-        String uri = baseUrl + "/aai/v29/service-design-and-creation/models/model/d821d1aa-8a69-47a4-aa63-3dae1742c47c";
+        String uri = "/aai/v29/service-design-and-creation/models/model/d821d1aa-8a69-47a4-aa63-3dae1742c47c";
 
-        headers.setAccept(Collections.singletonList(MediaType.APPLICATION_XML));
-        headers.setContentType(null);
-        ResponseEntity<String> response = restTemplate.exchange(uri, HttpMethod.GET, new HttpEntity<>(headers), String.class);
-        assertEquals(HttpStatus.NOT_FOUND, response.getStatusCode());
+        webClient.get()
+                .uri(uri)
+                .accept(MediaType.APPLICATION_XML)
+                .exchange()
+                .expectStatus()
+                .isNotFound();
 
         String modelPayload = new String(Files.readAllBytes(Paths.get(MODEL_FILE)));
-        headers.setContentType(MediaType.APPLICATION_XML);
-        headers.setAccept(Collections.singletonList(MediaType.APPLICATION_JSON));
-        response = restTemplate.exchange(uri, HttpMethod.PUT, new HttpEntity<>(modelPayload, headers), String.class);
-        assertEquals(HttpStatus.CREATED, response.getStatusCode());
-
-        headers.setAccept(Collections.singletonList(MediaType.APPLICATION_JSON));
-        response = restTemplate.exchange(uri, HttpMethod.GET, new HttpEntity<>(headers), String.class);
-        assertEquals(HttpStatus.OK, response.getStatusCode());
-
-        ObjectMapper mapper = new ObjectMapper();
-        String resourceVersion = mapper.readTree(response.getBody()).get("resource-version").asText();
-        URI resourceVersionUri = new DefaultUriBuilderFactory(uri.toString()).builder().queryParam("resource-version", resourceVersion).build();
-        response = restTemplate.exchange(resourceVersionUri, HttpMethod.DELETE, new HttpEntity<>(headers), String.class);
-        assertEquals(HttpStatus.NO_CONTENT, response.getStatusCode());
+        webClient.put()
+                .uri(uri)
+                .accept(MediaType.APPLICATION_XML)
+                .header("Content-Type", MediaType.APPLICATION_XML_VALUE)
+                .bodyValue(modelPayload)
+                .exchange()
+                .expectStatus()
+                .isCreated();
+
+        String actual = webClient.get()
+                .uri(uri)
+                .accept(MediaType.APPLICATION_XML)
+                .exchange()
+                .expectStatus()
+                .isOk()
+                .returnResult(String.class)
+                .getResponseBody()
+                .blockFirst();
+
+        Model expectedModel = objectMapper.readValue(modelPayload, Model.class);
+        expectedModel.setModelVersions(null); // model versions are not being returned by the endpoint
+        Model actualModel = objectMapper.readValue(actual, Model.class);
+        Assertions.assertThat(expectedModel)
+                .usingRecursiveComparison()
+                .ignoringFields("resourceVersion")
+                .isEqualTo(actualModel);
+
+        webClient.delete()
+                .uri(uriBuilder -> uriBuilder
+                .path(uri)
+                .queryParam("resource-version", actualModel.getResourceVersion()).build())
+                .exchange()
+                .expectStatus()
+                .isNoContent();
+
+    }
+
+    @Test
+    @Order(2)
+    public void thatModelsCanBeRedistributed() throws Exception {
+        final String UPDATE_MODEL_FILE = "src/test/resources/payloads/models/model-version.xml";
+        String modelInvariantId = "d821d1aa-8a69-47a4-aa63-3dae1742c47c";
+        String modelVersionId = "8b713350-90fc-44b1-8c6e-a2b3973aa9d3";
+        String modelUri = "/aai/v29/service-design-and-creation/models/model/" + modelInvariantId;
+        String modelVersionUri = modelUri + "/model-vers/model-ver/" + modelVersionId;
+        webClient.get()
+                .uri(modelUri)
+                .accept(MediaType.APPLICATION_XML)
+                .exchange()
+                .expectStatus()
+                .isNotFound();
+
+        String modelPayload = new String(Files.readAllBytes(Paths.get(MODEL_FILE)));
+        webClient.put()
+                .uri(modelUri)
+                .accept(MediaType.APPLICATION_XML)
+                .header("Content-Type", MediaType.APPLICATION_XML_VALUE)
+                .bodyValue(modelPayload)
+                .exchange()
+                .expectStatus()
+                .isCreated();
+
+        String modelVersionResponse = webClient.get()
+                .uri(modelVersionUri)
+                .accept(MediaType.APPLICATION_XML)
+                .exchange()
+                .expectStatus()
+                .isOk()
+                .returnResult(String.class)
+                .getResponseBody()
+                .blockFirst();
+        ModelVersion modelVersion = objectMapper.readValue(modelVersionResponse, ModelVersion.class);
+        assertNull(modelVersion.getModelElements());
+
+        String updatePayload = new String(Files.readAllBytes(Paths.get(UPDATE_MODEL_FILE)))
+                .replace("resourceVersion", modelVersion.getResourceVersion());
+        webClient.put()
+                .uri(modelVersionUri)
+                .accept(MediaType.APPLICATION_XML)
+                .header("Content-Type", MediaType.APPLICATION_XML_VALUE)
+                .bodyValue(updatePayload)
+                .exchange()
+                .expectStatus()
+                .isOk();
+
+        modelVersionResponse = webClient.get()
+                .uri(modelVersionUri)
+                .accept(MediaType.APPLICATION_XML)
+                .exchange()
+                .expectStatus()
+                .isOk()
+                .returnResult(String.class)
+                .getResponseBody()
+                .blockFirst();
+        modelVersion = objectMapper.readValue(modelVersionResponse, ModelVersion.class);
+        assertEquals("2.0", modelVersion.getModelVersion());
     }
 }
diff --git a/aai-resources/src/test/resources/payloads/models/model-version.xml b/aai-resources/src/test/resources/payloads/models/model-version.xml
new file mode 100644 (file)
index 0000000..130bc68
--- /dev/null
@@ -0,0 +1,12 @@
+<model-ver xmlns="http://org.onap.aai.inventory/v29">
+    <model-version-id>8b713350-90fc-44b1-8c6e-a2b3973aa9d3</model-version-id>
+    <model-name>test-svc-distribution</model-name>
+    <model-version>2.0</model-version>
+    <resource-version>resourceVersion</resource-version>
+    <model-elements>
+        <model-element>
+            <new-data-del-flag>T</new-data-del-flag>
+            <cardinality>unbounded</cardinality>
+        </model-element>
+    </model-elements>
+  </model-ver>
index ee04def..977c186 100644 (file)
@@ -8,19 +8,6 @@
           <model-name>test-svc-distribution</model-name>
           <model-version>1.0</model-version>
           <model-description>test-svc-distribution</model-description>
-          <model-elements>
-              <model-element>
-                  <new-data-del-flag>T</new-data-del-flag>
-                  <cardinality>unbounded</cardinality>
-                  <model-elements>
-                      <model-element>
-                          <new-data-del-flag>T</new-data-del-flag>
-                          <cardinality>unbounded</cardinality>
-                          <model-elements/>
-                      </model-element>
-                  </model-elements>
-              </model-element>
-          </model-elements>
       </model-ver>
   </model-vers>
-</model>
\ No newline at end of file
+</model>