blob: 28e899ea9fd5848e6316c9a4cad8ed0f38d8e78a [file] [log] [blame]
/*-
* ============LICENSE_START=======================================================
* OSAM
* ================================================================================
* Copyright (C) 2018 AT&T
* ================================================================================
* 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.osam.client;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.google.common.collect.ImmutableMap;
import com.xebialabs.restito.semantics.Condition;
import com.xebialabs.restito.server.StubServer;
import io.joshworks.restclient.http.HttpResponse;
import io.joshworks.restclient.http.JsonNode;
import org.glassfish.grizzly.http.util.HttpStatus;
import com.xebialabs.restito.semantics.Action;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.AfterMethod;
import org.glassfish.grizzly.http.Method;
import org.testng.annotations.Test;
import java.util.Collections;
import java.util.Map;
import static com.xebialabs.restito.builder.verify.VerifyHttp.verifyHttp;
import static com.xebialabs.restito.builder.stub.StubHttp.whenHttp;
import static com.xebialabs.restito.semantics.Action.stringContent;
import static com.xebialabs.restito.semantics.Action.contentType;
import static com.xebialabs.restito.semantics.Action.status;
import static com.xebialabs.restito.semantics.Action.ok;
import static org.testng.Assert.assertEquals;
public class SyncRestClientForHttpServerTest {
private static final SyncRestClientModel.TestModel testObject = new SyncRestClientModel.TestModel(1, "test");
private static final String NOT_EXISTING_OBJECT = "NOT EXISTING OBJECT";
private StubServer stubServer;
private ObjectMapper objectMapper = new ObjectMapper();
private SyncRestClient syncRestClient;
@BeforeMethod
public void setUp() {
stubServer = new StubServer();
stubServer.run();
syncRestClient = new SyncRestClient();
}
@AfterMethod
public void tearDown() {
stubServer.stop();
syncRestClient.destroy();
}
@Test
public void testJsonResponseFromGet() throws JsonProcessingException {
// given
stubGetCall();
String url = "http://0.0.0.0:" + stubServer.getPort() + "/test";
// when
HttpResponse<JsonNode> jsonNodeHttpResponse = syncRestClient
.get(url, Collections.emptyMap(), Collections.emptyMap());
// then
verifyHttp(stubServer).once(Condition.method(Method.GET), Condition.url(url));
assertEquals(jsonNodeHttpResponse.getStatus(), 200);
assertEquals(jsonNodeHttpResponse.getBody().getObject().get("key"), 1);
assertEquals(jsonNodeHttpResponse.getBody().getObject().get("value"), "test");
}
@Test
public void testObjectResponseFromGet() throws JsonProcessingException {
// given
stubGetCall();
String url = "http://0.0.0.0:" + stubServer.getPort() + "/test";
// when
HttpResponse<SyncRestClientModel.TestModel> testModelHttpResponse = syncRestClient
.get(url, Collections.emptyMap(), Collections.emptyMap(), SyncRestClientModel.TestModel.class);
// then
verifyHttp(stubServer).once(Condition.method(Method.GET), Condition.url(url));
assertEquals(testModelHttpResponse.getStatus(), 200);
assertEquals(testModelHttpResponse.getBody().getKey(), 1);
assertEquals(testModelHttpResponse.getBody().getValue(), "test");
}
@Test
public void testJsonResponseFromPost() throws JsonProcessingException {
// given
stubPostCall();
String url = "http://0.0.0.0:" + stubServer.getPort() + "/test";
// when
HttpResponse<JsonNode> jsonNodeHttpResponse = syncRestClient.post(url, Collections.emptyMap(), testObject);
// then
verifyHttp(stubServer).once(Condition.method(Method.POST), Condition.url(url));
assertEquals(jsonNodeHttpResponse.getStatus(), 200);
assertEquals(jsonNodeHttpResponse.getBody().getObject().get("key"), 1);
assertEquals(jsonNodeHttpResponse.getBody().getObject().get("value"), "test");
}
@Test
public void test404JsonResponseFromPost() throws JsonProcessingException {
// given
stubPostCall();
String url = "http://0.0.0.0:" + stubServer.getPort() + "/test";
// when
HttpResponse<JsonNode> jsonNodeHttpResponse = syncRestClient
.post(url, Collections.emptyMap(), NOT_EXISTING_OBJECT);
// then
assertEquals(jsonNodeHttpResponse.getStatus(), 404);
assertEquals(jsonNodeHttpResponse.getStatusText(), "Not Found");
}
@Test
public void testHeadersWerePassedToPost() throws JsonProcessingException {
// given
stubPostCall();
Map headers = ImmutableMap.<String, String>builder().put("Authorization", "Basic anyHash").build();
String url = "http://0.0.0.0:" + stubServer.getPort() + "/test";
// when
HttpResponse<JsonNode> jsonNodeHttpResponse = syncRestClient.post(url, headers, testObject);
// then
verifyHttp(stubServer).once(Condition.withHeader("Authorization"));
assertEquals(jsonNodeHttpResponse.getStatus(), 200);
}
@Test(expectedExceptions = {Exception.class})
public void testFailedJsonResponseFromPost() throws JsonProcessingException {
// given
stubPostCall();
String url = "http://0.0.0.0:" + stubServer.getPort() + "/test";
// when
stubServer.stop();
syncRestClient.post(url, Collections.emptyMap(), testObject);
}
@Test
public void testObjectResponseFromPost() throws JsonProcessingException {
// given
stubPostCall();
String url = "http://0.0.0.0:" + stubServer.getPort() + "/test";
// when
HttpResponse<SyncRestClientModel.TestModel> objectHttpResponse = syncRestClient
.post(url, Collections.emptyMap(), testObject, SyncRestClientModel.TestModel.class);
// then
verifyHttp(stubServer).once(Condition.method(Method.POST), Condition.url(url));
assertEquals(objectHttpResponse.getStatus(), 200);
assertEquals(objectHttpResponse.getBody().getKey(), 1);
assertEquals(objectHttpResponse.getBody().getValue(), "test");
}
@Test
public void testJsonResponseFromPut() throws JsonProcessingException {
// given
stubPutCall();
String url = "http://0.0.0.0:" + stubServer.getPort() + "/test";
// when
HttpResponse<JsonNode> jsonNodeHttpResponse = syncRestClient.put(url, Collections.emptyMap(), testObject);
// then
verifyHttp(stubServer).once(Condition.method(Method.PUT), Condition.url(url));
assertEquals(jsonNodeHttpResponse.getStatus(), 201);
assertEquals(jsonNodeHttpResponse.getBody().getObject().get("key"), 1);
assertEquals(jsonNodeHttpResponse.getBody().getObject().get("value"), "test");
}
@Test
public void testObjectResponseFromPut() throws JsonProcessingException {
// given
stubPutCall();
String url = "http://0.0.0.0:" + stubServer.getPort() + "/test";
// when
HttpResponse<SyncRestClientModel.TestModel> modelHttpResponse = syncRestClient
.put(url, Collections.emptyMap(), testObject, SyncRestClientModel.TestModel.class);
// then
verifyHttp(stubServer).once(Condition.method(Method.PUT), Condition.url(url));
assertEquals(modelHttpResponse.getStatus(), 201);
assertEquals(modelHttpResponse.getBody().getKey(), 1);
assertEquals(modelHttpResponse.getBody().getValue(), "test");
}
@Test
public void testJsonResponseFromDelete() throws JsonProcessingException {
// given
stubDeleteCall();
String url = "http://0.0.0.0:" + stubServer.getPort() + "/test";
// when
HttpResponse<JsonNode> jsonNodeHttpResponse = syncRestClient.delete(url, Collections.emptyMap());
// then
verifyHttp(stubServer).once(Condition.method(Method.DELETE), Condition.url(url));
assertEquals(jsonNodeHttpResponse.getStatus(), 200);
assertEquals(jsonNodeHttpResponse.getBody().getObject().get("key"), 1);
assertEquals(jsonNodeHttpResponse.getBody().getObject().get("value"), "test");
}
@Test
public void testObjectResponseFromDelete() throws JsonProcessingException {
// given
stubDeleteCall();
String url = "http://0.0.0.0:" + stubServer.getPort() + "/test";
// when
HttpResponse<SyncRestClientModel.TestModel> modelHttpResponse = syncRestClient
.delete(url, Collections.emptyMap(), SyncRestClientModel.TestModel.class);
// then
verifyHttp(stubServer).once(Condition.method(Method.DELETE), Condition.url(url));
assertEquals(modelHttpResponse.getStatus(), 200);
assertEquals(modelHttpResponse.getBody().getKey(), 1);
assertEquals(modelHttpResponse.getBody().getValue(), "test");
}
@Test
public void testRedirectToHttp() throws JsonProcessingException {
// given
stubGetCall();
String secured_url = "https://0.0.0.0:" + stubServer.getPort() + "/test";
String available_url = "http://0.0.0.0:" + stubServer.getPort() + "/test";
// when
HttpResponse<JsonNode> jsonNodeHttpResponse = syncRestClient
.get(secured_url, Collections.emptyMap(), Collections.emptyMap());
// then
verifyHttp(stubServer).once(Condition.method(Method.GET), Condition.url(available_url),
Condition.not(Condition.url(secured_url)));
assertEquals(jsonNodeHttpResponse.getStatus(), 200);
}
private void stubGetCall() throws JsonProcessingException {
whenHttp(stubServer)
.match(Condition.get("/test"))
.then(ok(), jsonContent(), contentType("application/json"));
}
private void stubDeleteCall() throws JsonProcessingException {
whenHttp(stubServer)
.match(Condition.delete("/test"))
.then(ok(), jsonContent(), contentType("application/json"));
}
private void stubPostCall() throws JsonProcessingException {
whenHttp(stubServer)
.match(Condition.post("/test"),
Condition.withPostBodyContaining(objectMapper.writeValueAsString(testObject)))
.then(ok(), jsonContent(), contentType("application/json"));
}
private void stubPutCall() throws JsonProcessingException {
whenHttp(stubServer)
.match(Condition.put("/test"),
Condition.withPostBodyContaining(objectMapper.writeValueAsString(testObject)))
.then(status(HttpStatus.CREATED_201), jsonContent(), contentType("application/json"));
}
private Action jsonContent() throws JsonProcessingException {
return stringContent(objectMapper.writeValueAsString(testObject));
}
}