sqt/assignment-w13/comments-api/src/test/java/comments/CommentsTest.java

207 lines
6.8 KiB
Java

package comments;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
import comments.main.Application;
import comments.model.Comment;
import io.restassured.RestAssured;
import io.restassured.http.Header;
import io.restassured.response.Response;
import io.restassured.response.ValidatableResponse;
import net.minidev.json.JSONObject;
import org.junit.*;
import org.junit.jupiter.api.Assertions;
import java.lang.reflect.Type;
import java.util.List;
import java.util.Map;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.fail;
public class CommentsTest {
private static final String BASE_URI_COMMENTS = "http://localhost:8080/api/comments";
private static final ObjectMapper OBJECT_MAPPER = new ObjectMapper();
private Integer responseStatusCode;
private String responseBody;
@BeforeClass
public static void setup() {
Application.main(new String[]{});
}
@Before
public void setupTest() {
responseStatusCode = null;
responseBody = null;
}
@After
public void tearDown() {
Assert.assertNotNull(responseStatusCode);
if (responseStatusCode == 204) Assert.assertEquals("", responseBody);
else Assert.assertNotEquals("", responseBody);
}
public <T> T assertOkResponseOfType(final TypeReference<T> type) {
Assert.assertEquals(2, responseStatusCode / 100);
try {
return OBJECT_MAPPER.readValue(responseBody, type);
} catch (final Throwable e) {
fail(e.getMessage());
return null;
}
}
@Test
public void getAllComments() {
ValidatableResponse response = RestAssured.given().log().all()
.when()
.get(BASE_URI_COMMENTS)
.then().log().all();
responseStatusCode = response.extract().statusCode();
responseBody = response.extract().body().asPrettyString();
assertOkResponseOfType(new TypeReference<List<Comment>>() {});
}
@Test
public void getOneComment() {
ValidatableResponse response = RestAssured.given().log().all()
.when()
.get(BASE_URI_COMMENTS + "/c1")
.then().log().all();
responseStatusCode = response.extract().statusCode();
responseBody = response.extract().body().asPrettyString();
assertOkResponseOfType(new TypeReference<Comment>() {});
}
@Test
public void getOneNonExistingComment() {
ValidatableResponse response = RestAssured.given().log().all()
.when()
.get(BASE_URI_COMMENTS + "/fsfasdf")
.then().log().all();
responseStatusCode = response.extract().statusCode();
responseBody = response.extract().body().asPrettyString();
Assert.assertEquals(404, responseStatusCode.intValue());
}
@Test
public void putComment() {
JSONObject requestParam = new JSONObject();
requestParam.put("id", "c1");
requestParam.put("userName", "Prueba");
requestParam.put("text", "Hello my name is John Doe");
requestParam.put("date", "2015-01-16T20:44:53.950");
requestParam.put("type", "Complain");
Header acceptJson = new Header("content-type", "application/json");
ValidatableResponse response = RestAssured.given().log().all()
.header(acceptJson)
.body(requestParam.toJSONString())
.when()
.put(BASE_URI_COMMENTS)
.then().log().all();
responseStatusCode = response.extract().statusCode();
responseBody = response.extract().body().asPrettyString();
final JSONObject expectedResponse = new JSONObject();
expectedResponse.put("date", "2017-06-16T20:44:53.950");
expectedResponse.put("id", "c1");
expectedResponse.put("text", "Hello my name is John Doe");
expectedResponse.put("userName", "johnSmith");
expectedResponse.put("type", "Review");
final JSONObject c = assertOkResponseOfType(new TypeReference<JSONObject>() {});
assertEquals(expectedResponse, c);
}
@Test
public void postComment() {
JSONObject requestParam = new JSONObject();
requestParam.put("id", "c1");
requestParam.put("userName", "Prueba");
requestParam.put("text", "Hello my name is John Doe");
requestParam.put("date", "2015-01-16T20:44:53.950");
Header acceptJson = new Header("content-type", "application/json");
ValidatableResponse response = RestAssured.given().log().all()
.header(acceptJson)
.body(requestParam.toJSONString())
.when()
.post(BASE_URI_COMMENTS)
.then().log().all();
responseStatusCode = response.extract().statusCode();
responseBody = response.extract().body().asPrettyString();
final JSONObject c = assertOkResponseOfType(new TypeReference<JSONObject>() {});
Assert.assertEquals(201, responseStatusCode.intValue());
requestParam.put("type", null);
requestParam.put("id", "c12");
Assert.assertEquals(requestParam, c);
}
@Test
public void deleteOneComment() {
ValidatableResponse response = RestAssured.given().log().all()
.when()
.delete(BASE_URI_COMMENTS + "/c2")
.then().log().all();
responseStatusCode = response.extract().statusCode();
responseBody = response.extract().body().asPrettyString();
Assert.assertEquals(204, responseStatusCode.intValue());
Assert.assertEquals("", responseBody);
}
@Test
public void postAndGetComment() {
JSONObject requestParam = new JSONObject();
requestParam.put("id", "c1");
requestParam.put("userName", "Prueba");
requestParam.put("text", "Hello my name is John Doe");
requestParam.put("date", "2015-01-16T20:44:53.950");
Header acceptJson = new Header("content-type", "application/json");
Response previousResponse = RestAssured.given().log().all()
.header(acceptJson)
.body(requestParam.toJSONString())
.when()
.post(BASE_URI_COMMENTS);
previousResponse.then().log().all();
ValidatableResponse response = RestAssured.given().log().all()
.when()
.get(BASE_URI_COMMENTS + "/" + previousResponse.getBody().path("id"))
.then().log().all();
responseStatusCode = response.extract().statusCode();
responseBody = response.extract().body().asPrettyString();
final JSONObject c = assertOkResponseOfType(new TypeReference<JSONObject>() {});
requestParam.put("id", "c11");
requestParam.put("type", null);
assertEquals(requestParam, c);
}
}