From b972ede6f59bb057505e000178364c24fa85f77c Mon Sep 17 00:00:00 2001 From: liamfallon Date: Tue, 8 Nov 2022 20:06:23 +0000 Subject: Remove duplication in REST Controller Tests Issue-ID: POLICY-4138 Change-Id: I796942a33031d572bac931861faa5dc736128c9b Signed-off-by: liamfallon --- .../server/rest/AcmRuntimeRestControllerTest.java | 132 ++-------------- .../gui/server/rest/BaseRestControllerTest.java | 169 +++++++++++++++++++++ .../server/rest/PolicyApiRestControllerTest.java | 132 ++-------------- 3 files changed, 191 insertions(+), 242 deletions(-) create mode 100644 gui-server/src/test/java/org/onap/policy/gui/server/rest/BaseRestControllerTest.java diff --git a/gui-server/src/test/java/org/onap/policy/gui/server/rest/AcmRuntimeRestControllerTest.java b/gui-server/src/test/java/org/onap/policy/gui/server/rest/AcmRuntimeRestControllerTest.java index 56a805d..56368c2 100644 --- a/gui-server/src/test/java/org/onap/policy/gui/server/rest/AcmRuntimeRestControllerTest.java +++ b/gui-server/src/test/java/org/onap/policy/gui/server/rest/AcmRuntimeRestControllerTest.java @@ -20,33 +20,13 @@ package org.onap.policy.gui.server.rest; -import static org.onap.policy.gui.server.filters.ClientSslHeaderFilter.SSL_CERT_HEADER_NAME; -import static org.onap.policy.gui.server.test.util.X509RequestPostProcessor.x509; -import static org.onap.policy.gui.server.util.X509CertificateEncoder.urlEncodeCert; -import static org.springframework.test.web.client.match.MockRestRequestMatchers.header; -import static org.springframework.test.web.client.match.MockRestRequestMatchers.method; -import static org.springframework.test.web.client.match.MockRestRequestMatchers.requestTo; -import static org.springframework.test.web.client.response.MockRestResponseCreators.withStatus; -import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; -import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.forwardedUrl; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.redirectedUrl; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; - -import java.security.cert.X509Certificate; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Test; -import org.onap.policy.gui.server.test.util.KeyStoreHelper; +import java.net.URI; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.http.HttpHeaders; -import org.springframework.http.HttpMethod; -import org.springframework.http.HttpStatus; import org.springframework.test.web.client.MockRestServiceServer; -import org.springframework.test.web.servlet.MockMvc; import org.springframework.web.client.RestTemplate; @SpringBootTest( @@ -59,107 +39,17 @@ import org.springframework.web.client.RestTemplate; "runtime-ui.acm.disable-ssl-validation=true" }) @AutoConfigureMockMvc -class AcmRuntimeRestControllerTest { - - @Autowired - private MockMvc mvc; - +class AcmRuntimeRestControllerTest extends BaseRestControllerTest { @Autowired - @Qualifier("acmRuntimeRestTemplate") - private RestTemplate restTemplate; - - private MockRestServiceServer mockServer; - - @BeforeEach - public void init() { - mockServer = MockRestServiceServer.createServer(restTemplate); + public void setBaseMockServer(@Qualifier("acmRuntimeRestTemplate") RestTemplate restTemplate) { + super.setMockServer(MockRestServiceServer.createServer(restTemplate)); } - @Test - void testStaticContentUrls() throws Exception { - mvc.perform(get("/runtime-ui/")) - .andExpect(status().isOk()) - .andExpect(forwardedUrl("/runtime-ui/index.html")); - - mvc.perform(get("/runtime-ui")) - .andExpect(status().is3xxRedirection()) - .andExpect(redirectedUrl("/runtime-ui/")); - } - - /* - * This is a happy path test to verify that calls to /** - * are relayed to the server, and that the server receives the - * client certificate encoded in a header. More extensive tests of the - * certificate cert filter are in ClientSslHeaderFilterTest. - */ - @Test - void testServerProxyWithClientCert() throws Exception { - X509Certificate cert = KeyStoreHelper.loadValidCert(); - - mockServer.expect( - requestTo("https://runtime-acm:8443/junit/test")) - .andExpect(header(SSL_CERT_HEADER_NAME, urlEncodeCert(cert))) - .andRespond(withStatus(HttpStatus.OK).body("admin")); - - mvc.perform( - get("/runtime-ui/acm/restservices/junit/test") - .with(x509(cert))) - .andExpect(status().isOk()) - .andExpect(content().string("admin")); - - mockServer.verify(); - } - - /* - * This test verifies that HTTP headers are preserved for requests to the - * server (including multi-value headers). - */ - @Test - void verifyServerProxyPassesHeaders() throws Exception { - // Single value header - final String userAgent = "User-Agent"; - final String userAgentValue = "JUnit"; - // Multi-value header - final String acceptLanguage = "Accept-Language"; - final String enUs = "en-US"; - final String enIe = "en-IE"; - - mockServer.expect( - requestTo("https://runtime-acm:8443/junit/test")) - .andExpect(method(HttpMethod.GET)) - .andExpect(header(userAgent, userAgentValue)) - .andExpect(header(acceptLanguage, enUs, enIe)) - .andRespond(withStatus(HttpStatus.OK)); - - HttpHeaders requestHeaders = new HttpHeaders(); - requestHeaders.set(userAgent, userAgentValue); - requestHeaders.add(acceptLanguage, enUs); - requestHeaders.add(acceptLanguage, enIe); - mvc.perform( - get("/runtime-ui/acm/restservices/junit/test") - .headers(requestHeaders)) - .andExpect(status().isOk()); - - mockServer.verify(); - } - - /* - * This test verifies that error messages from the server are - * delivered to the client (as opposed to 500 "Internal Server Error"). - */ - @Test - void verifyServerProxyReturnsBackendErrorCode() throws Exception { - final String errorMessage = "This appliance cannot brew coffee"; - - mockServer.expect( - requestTo("https://runtime-acm:8443/coffee")) - .andRespond(withStatus(HttpStatus.I_AM_A_TEAPOT).body(errorMessage)); - - mvc.perform( - post("/runtime-ui/acm/restservices/coffee").secure(true)) - .andExpect(status().is(HttpStatus.I_AM_A_TEAPOT.value())) - .andExpect(content().string(errorMessage)); - - mockServer.verify(); + @Autowired + public void setBaseMapping( + @Value("${runtime-ui.acm.mapping-path}") String mappingPath, + @Value("${runtime-ui.acm.url}") URI url) { + super.setMappingPath(mappingPath); + super.setUrl(url); } } diff --git a/gui-server/src/test/java/org/onap/policy/gui/server/rest/BaseRestControllerTest.java b/gui-server/src/test/java/org/onap/policy/gui/server/rest/BaseRestControllerTest.java new file mode 100644 index 0000000..10e04e3 --- /dev/null +++ b/gui-server/src/test/java/org/onap/policy/gui/server/rest/BaseRestControllerTest.java @@ -0,0 +1,169 @@ +/*- + * ============LICENSE_START======================================================= + * Copyright (C) 2022 Nordix Foundation. + * ================================================================================ + * 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. + * + * SPDX-License-Identifier: Apache-2.0 + * ============LICENSE_END========================================================= + */ + +package org.onap.policy.gui.server.rest; + +import static org.onap.policy.gui.server.filters.ClientSslHeaderFilter.SSL_CERT_HEADER_NAME; +import static org.onap.policy.gui.server.test.util.X509RequestPostProcessor.x509; +import static org.onap.policy.gui.server.util.X509CertificateEncoder.urlEncodeCert; +import static org.springframework.test.web.client.match.MockRestRequestMatchers.header; +import static org.springframework.test.web.client.match.MockRestRequestMatchers.method; +import static org.springframework.test.web.client.match.MockRestRequestMatchers.requestTo; +import static org.springframework.test.web.client.response.MockRestResponseCreators.withStatus; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.forwardedUrl; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.redirectedUrl; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + +import java.net.URI; +import java.security.cert.X509Certificate; +import lombok.Setter; +import org.junit.jupiter.api.Test; +import org.onap.policy.gui.server.test.util.KeyStoreHelper; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpHeaders; +import org.springframework.http.HttpMethod; +import org.springframework.http.HttpStatus; +import org.springframework.test.web.client.MockRestServiceServer; +import org.springframework.test.web.servlet.MockMvc; + +class BaseRestControllerTest { + @Autowired + private MockMvc mvc; + + @Setter + private MockRestServiceServer mockServer; + + @Setter + private String mappingPath; + + @Setter + private URI url; + + @Test + void testStaticContentUrls() throws Exception { + // Don't run test if this base class is called directly form JUnit + if (mockServer == null) { + return; + } + + mvc.perform(get("/runtime-ui/")) + .andExpect(status().isOk()) + .andExpect(forwardedUrl("/runtime-ui/index.html")); + + mvc.perform(get("/runtime-ui")) + .andExpect(status().is3xxRedirection()) + .andExpect(redirectedUrl("/runtime-ui/")); + } + + /* + * This is a happy path test to verify that calls to /** + * are relayed to the server, and that the server receives the + * client certificate encoded in a header. More extensive tests of the + * certificate cert filter are in ClientSslHeaderFilterTest. + */ + @Test + void testServerProxyWithClientCert() throws Exception { + // Don't run test if this base class is called directly form JUnit + if (mockServer == null) { + return; + } + + X509Certificate cert = KeyStoreHelper.loadValidCert(); + + mockServer.expect( + requestTo(url + "junit/test")) + .andExpect(header(SSL_CERT_HEADER_NAME, urlEncodeCert(cert))) + .andRespond(withStatus(HttpStatus.OK).body("admin")); + + mvc.perform( + get(mappingPath + "junit/test") + .with(x509(cert))) + .andExpect(status().isOk()) + .andExpect(content().string("admin")); + + mockServer.verify(); + } + + /* + * This test verifies that HTTP headers are preserved for requests to the + * server (including multi-value headers). + */ + @Test + void verifyServerProxyPassesHeaders() throws Exception { + // Don't run test if this base class is called directly form JUnit + if (mockServer == null) { + return; + } + + // Single value header + final String userAgent = "User-Agent"; + final String userAgentValue = "JUnit"; + // Multi-value header + final String acceptLanguage = "Accept-Language"; + final String enUs = "en-US"; + final String enIe = "en-IE"; + + mockServer.expect( + requestTo(url + "junit/test")) + .andExpect(method(HttpMethod.GET)) + .andExpect(header(userAgent, userAgentValue)) + .andExpect(header(acceptLanguage, enUs, enIe)) + .andRespond(withStatus(HttpStatus.OK)); + + HttpHeaders requestHeaders = new HttpHeaders(); + requestHeaders.set(userAgent, userAgentValue); + requestHeaders.add(acceptLanguage, enUs); + requestHeaders.add(acceptLanguage, enIe); + mvc.perform( + get(mappingPath + "junit/test") + .headers(requestHeaders)) + .andExpect(status().isOk()); + + mockServer.verify(); + } + + /* + * This test verifies that error messages from the server are + * delivered to the client (as opposed to 500 "Internal Server Error"). + */ + @Test + void verifyServerProxyReturnsBackendErrorCode() throws Exception { + // Don't run test if this base class is called directly form JUnit + if (mockServer == null) { + return; + } + + final String errorMessage = "This appliance cannot brew coffee"; + + mockServer.expect( + requestTo(url + "coffee")) + .andRespond(withStatus(HttpStatus.I_AM_A_TEAPOT).body(errorMessage)); + + mvc.perform( + post(mappingPath + "coffee").secure(true)) + .andExpect(status().is(HttpStatus.I_AM_A_TEAPOT.value())) + .andExpect(content().string(errorMessage)); + + mockServer.verify(); + } +} diff --git a/gui-server/src/test/java/org/onap/policy/gui/server/rest/PolicyApiRestControllerTest.java b/gui-server/src/test/java/org/onap/policy/gui/server/rest/PolicyApiRestControllerTest.java index e7c8db6..a862dc8 100644 --- a/gui-server/src/test/java/org/onap/policy/gui/server/rest/PolicyApiRestControllerTest.java +++ b/gui-server/src/test/java/org/onap/policy/gui/server/rest/PolicyApiRestControllerTest.java @@ -20,33 +20,13 @@ package org.onap.policy.gui.server.rest; -import static org.onap.policy.gui.server.filters.ClientSslHeaderFilter.SSL_CERT_HEADER_NAME; -import static org.onap.policy.gui.server.test.util.X509RequestPostProcessor.x509; -import static org.onap.policy.gui.server.util.X509CertificateEncoder.urlEncodeCert; -import static org.springframework.test.web.client.match.MockRestRequestMatchers.header; -import static org.springframework.test.web.client.match.MockRestRequestMatchers.method; -import static org.springframework.test.web.client.match.MockRestRequestMatchers.requestTo; -import static org.springframework.test.web.client.response.MockRestResponseCreators.withStatus; -import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; -import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.forwardedUrl; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.redirectedUrl; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; - -import java.security.cert.X509Certificate; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Test; -import org.onap.policy.gui.server.test.util.KeyStoreHelper; +import java.net.URI; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.http.HttpHeaders; -import org.springframework.http.HttpMethod; -import org.springframework.http.HttpStatus; import org.springframework.test.web.client.MockRestServiceServer; -import org.springframework.test.web.servlet.MockMvc; import org.springframework.web.client.RestTemplate; @SpringBootTest( @@ -59,107 +39,17 @@ import org.springframework.web.client.RestTemplate; "runtime-ui.acm.disable-ssl-validation=true" }) @AutoConfigureMockMvc -class PolicyApiRestControllerTest { - - @Autowired - private MockMvc mvc; - +class PolicyApiRestControllerTest extends BaseRestControllerTest { @Autowired - @Qualifier("policyApiRestTemplate") - private RestTemplate restTemplate; - - private MockRestServiceServer mockServer; - - @BeforeEach - public void init() { - mockServer = MockRestServiceServer.createServer(restTemplate); + public void setBaseMockServer(@Qualifier("policyApiRestTemplate") RestTemplate restTemplate) { + super.setMockServer(MockRestServiceServer.createServer(restTemplate)); } - @Test - void testStaticContentUrls() throws Exception { - mvc.perform(get("/runtime-ui/")) - .andExpect(status().isOk()) - .andExpect(forwardedUrl("/runtime-ui/index.html")); - - mvc.perform(get("/runtime-ui")) - .andExpect(status().is3xxRedirection()) - .andExpect(redirectedUrl("/runtime-ui/")); - } - - /* - * This is a happy path test to verify that calls to /** - * are relayed to the server, and that the server receives the - * client certificate encoded in a header. More extensive tests of the - * certificate cert filter are in ClientSslHeaderFilterTest. - */ - @Test - void testServerProxyWithClientCert() throws Exception { - X509Certificate cert = KeyStoreHelper.loadValidCert(); - - mockServer.expect( - requestTo("https://policy-api:9876/junit/test")) - .andExpect(header(SSL_CERT_HEADER_NAME, urlEncodeCert(cert))) - .andRespond(withStatus(HttpStatus.OK).body("admin")); - - mvc.perform( - get("/runtime-ui/policy/restservices/junit/test") - .with(x509(cert))) - .andExpect(status().isOk()) - .andExpect(content().string("admin")); - - mockServer.verify(); - } - - /* - * This test verifies that HTTP headers are preserved for requests to the - * server (including multi-value headers). - */ - @Test - void verifyServerProxyPassesHeaders() throws Exception { - // Single value header - final String userAgent = "User-Agent"; - final String userAgentValue = "JUnit"; - // Multi-value header - final String acceptLanguage = "Accept-Language"; - final String enUs = "en-US"; - final String enIe = "en-IE"; - - mockServer.expect( - requestTo("https://policy-api:9876/junit/test")) - .andExpect(method(HttpMethod.GET)) - .andExpect(header(userAgent, userAgentValue)) - .andExpect(header(acceptLanguage, enUs, enIe)) - .andRespond(withStatus(HttpStatus.OK)); - - HttpHeaders requestHeaders = new HttpHeaders(); - requestHeaders.set(userAgent, userAgentValue); - requestHeaders.add(acceptLanguage, enUs); - requestHeaders.add(acceptLanguage, enIe); - mvc.perform( - get("/runtime-ui/policy/restservices/junit/test") - .headers(requestHeaders)) - .andExpect(status().isOk()); - - mockServer.verify(); - } - - /* - * This test verifies that error messages from the server are - * delivered to the client (as opposed to 500 "Internal Server Error"). - */ - @Test - void verifyServerProxyReturnsBackendErrorCode() throws Exception { - final String errorMessage = "This appliance cannot brew coffee"; - - mockServer.expect( - requestTo("https://policy-api:9876/coffee")) - .andRespond(withStatus(HttpStatus.I_AM_A_TEAPOT).body(errorMessage)); - - mvc.perform( - post("/runtime-ui/policy/restservices/coffee").secure(true)) - .andExpect(status().is(HttpStatus.I_AM_A_TEAPOT.value())) - .andExpect(content().string(errorMessage)); - - mockServer.verify(); + @Autowired + public void setBaseMapping( + @Value("${runtime-ui.policy.mapping-path}") String mappingPath, + @Value("${runtime-ui.policy.url}") URI url) { + super.setMappingPath(mappingPath); + super.setUrl(url); } } -- cgit 1.2.3-korg