2 * Copyright 2025 Deutsche Telekom.
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
17 package org.onap.usecaseui.server.service.csmf.impl;
19 import static com.github.tomakehurst.wiremock.client.WireMock.aResponse;
20 import static com.github.tomakehurst.wiremock.client.WireMock.equalTo;
21 import static com.github.tomakehurst.wiremock.client.WireMock.equalToJson;
22 import static com.github.tomakehurst.wiremock.client.WireMock.get;
23 import static com.github.tomakehurst.wiremock.client.WireMock.getRequestedFor;
24 import static com.github.tomakehurst.wiremock.client.WireMock.post;
25 import static com.github.tomakehurst.wiremock.client.WireMock.stubFor;
26 import static com.github.tomakehurst.wiremock.client.WireMock.urlEqualTo;
27 import static com.github.tomakehurst.wiremock.client.WireMock.verify;
28 import static org.junit.jupiter.api.Assertions.assertEquals;
29 import static org.junit.jupiter.api.Assertions.assertNotNull;
31 import java.nio.charset.StandardCharsets;
32 import java.nio.file.Files;
33 import java.nio.file.Paths;
35 import org.junit.jupiter.api.BeforeEach;
36 import org.junit.jupiter.api.Test;
37 import org.onap.usecaseui.server.bean.csmf.OrderInfo;
38 import org.onap.usecaseui.server.bean.csmf.OrderList;
39 import org.onap.usecaseui.server.bean.csmf.ServiceCreateResult;
40 import org.onap.usecaseui.server.bean.csmf.SlicingOrder;
41 import org.onap.usecaseui.server.bean.csmf.SlicingOrderDetail;
42 import org.onap.usecaseui.server.bean.nsmf.common.ServiceResult;
43 import org.onap.usecaseui.server.config.AAIClientConfig;
44 import org.onap.usecaseui.server.config.SOClientConfig;
45 import org.onap.usecaseui.server.constant.csmf.CsmfParamConstant;
46 import org.onap.usecaseui.server.service.csmf.SlicingService;
47 import org.onap.usecaseui.server.service.csmf.config.SlicingProperties;
48 import org.onap.usecaseui.server.service.lcm.ServiceLcmService;
49 import org.onap.usecaseui.server.service.lcm.impl.DefaultServiceLcmService;
50 import org.onap.usecaseui.server.service.slicingdomain.aai.AAISliceClient;
51 import org.onap.usecaseui.server.service.slicingdomain.so.SOSliceClient;
52 import org.springframework.beans.factory.annotation.Autowired;
53 import org.springframework.beans.factory.annotation.Value;
54 import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
55 import org.springframework.boot.context.properties.EnableConfigurationProperties;
56 import org.springframework.boot.test.context.SpringBootTest;
57 import org.springframework.boot.test.context.SpringBootTest.WebEnvironment;
58 import org.springframework.boot.test.mock.mockito.MockBean;
59 import org.springframework.http.HttpHeaders;
60 import org.wiremock.spring.EnableWireMock;
62 import lombok.SneakyThrows;
64 @EnableAutoConfiguration
66 @EnableConfigurationProperties
68 webEnvironment = WebEnvironment.RANDOM_PORT,
70 AAIClientConfig.class,
72 SlicingServiceImpl.class,
73 SlicingProperties.class,
74 DefaultServiceLcmService.class,
77 "spring.main.web-application-type=none", // only temporary
78 "uui-server.client.aai.baseUrl=${wiremock.server.baseUrl}",
79 "uui-server.client.aai.username=AAI",
80 "uui-server.client.aai.password=AAI",
81 "uui-server.client.so.baseUrl=${wiremock.server.baseUrl}",
82 "uui-server.client.so.username=InfraPortalClient",
83 "uui-server.client.so.password=password1",
84 "uui-server.slicing.service-invariant-uuid=someServiceInvariantUuid",
85 "uui-server.slicing.service-uuid=someServiceUuid",
86 "uui-server.slicing.global-subscriber-id=someGlobalSubscriberId",
87 "uui-server.slicing.service-type=someServiceType",
89 public class SlicingServiceImplIntegrationTest {
91 @MockBean ServiceLcmService serviceLcmService;
92 @Autowired AAISliceClient aaiSliceClient;
93 @Autowired SOSliceClient soSliceClient;
94 @Autowired SlicingProperties slicingProperties;
96 SlicingService slicingService;
98 @Value("${uui-server.client.so.username}")
101 @Value("${uui-server.client.so.password}")
104 @Value("${uui-server.client.aai.username}")
107 @Value("${uui-server.client.aai.password}")
110 @Value("${uui-server.client.aai.apiVersion}")
115 slicingService = new SlicingServiceImpl(serviceLcmService,aaiSliceClient,soSliceClient, slicingProperties);
120 void thatSORequestsAreCorrect() {
121 byte[] requestBytes = Files.readAllBytes(Paths.get("src/test/resources/__files/requests/submitOrdersRequest.json"));
122 String expectedRequestBody = new String(requestBytes, StandardCharsets.UTF_8);
124 post("/api/so-serviceInstances/v3")
125 .withBasicAuth(soUsername, soPassword)
126 .withHeader(HttpHeaders.ACCEPT, equalTo("application/json"))
127 .withHeader("X-TransactionId", equalTo("9999"))
128 .withHeader("X-FromAppId", equalTo("onap-cli"))
129 .withRequestBody(equalToJson(expectedRequestBody))
131 aResponse().withBodyFile("submitOrdersResponse.json")
134 SlicingOrder slicingOrder = new SlicingOrder();
135 SlicingOrderDetail detail = new SlicingOrderDetail();
136 detail.setLatency(10);
137 detail.setMaxNumberofUEs(10);
138 slicingOrder.setSlicing_order_info(detail);
139 ServiceResult serviceResult = slicingService.createSlicingService(slicingOrder);
140 ServiceCreateResult result = (ServiceCreateResult) serviceResult.getResult_body();
141 assertEquals("someServiceId", result.getService_id());
142 assertEquals("someOperationId", result.getOperation_id());
146 void thatSlicingOrdersCanBeListed() {
148 get("/aai/%s/business/customers/customer/%s/service-subscriptions/service-subscription/%s/service-instances?service-role=communication-service".formatted(apiVersion, "5GCustomer", "5G"))
149 .withBasicAuth(aaiUsername, aaiPassword)
150 .withHeader(HttpHeaders.ACCEPT, equalTo("application/json"))
151 .withHeader("X-TransactionId", equalTo("7777"))
152 .withHeader("X-FromAppId", equalTo("uui"))
154 aResponse().withBodyFile("serviceInstancesResponse.json")
157 ServiceResult result = slicingService.querySlicingOrderList(CsmfParamConstant.ALL, "1","10");
159 verify(getRequestedFor(urlEqualTo("/aai/%s/business/customers/customer/%s/service-subscriptions/service-subscription/%s/service-instances?service-role=communication-service".formatted(apiVersion, "5GCustomer", "5G"))));
160 assertNotNull(result);
161 OrderList orderList = (OrderList) result.getResult_body();
162 assertEquals(2, orderList.getRecord_number());
163 OrderInfo orderInfo1 = orderList.getSlicing_order_list().get(0);
164 assertEquals("97740f7b-e205-48e9-819b-2ad997d78286", orderInfo1.getOrder_id());
165 assertEquals("1", orderInfo1.getOrder_index());
166 assertEquals("5G-smth", orderInfo1.getOrder_name());
167 assertEquals("Assigned", orderInfo1.getOrder_status());
168 assertEquals("General_Revenue-Bearing", orderInfo1.getService_snssai());
169 OrderInfo orderInfo2 = orderList.getSlicing_order_list().get(1);
170 assertEquals("97732f7b-e205-48e9-819b-2ad997d78286", orderInfo2.getOrder_id());
171 assertEquals("2", orderInfo2.getOrder_index());
172 assertEquals("5G-smth-else", orderInfo2.getOrder_name());
173 assertEquals("Assigned", orderInfo2.getOrder_status());
174 assertEquals("General_Revenue-Bearing", orderInfo2.getService_snssai());