package org.resthub.web.validation.controller;
import org.apache.commons.io.IOUtils;
import org.fest.assertions.api.Assertions;
import org.resthub.test.AbstractWebTest;
import org.resthub.web.JsonHelper;
import org.resthub.web.Response;
import org.resthub.web.validation.ModelConstraint;
import org.resthub.web.validation.ValidationConstraint;
import org.resthub.web.validation.model.*;
import org.testng.annotations.Test;
import java.io.IOException;
import java.io.InputStream;
import java.io.StringWriter;
import java.util.List;
import java.util.Map;
public class JsonValidationControllerIntegrationTest extends AbstractWebTest {
public JsonValidationControllerIntegrationTest() {
super("resthub-web-server, resthub-validation", 9798);
this.startServerOnce = false;
}
private void compareConstraints(ModelConstraint expected, ModelConstraint actual) {
Map<String, List<ValidationConstraint>> actualConstraints = actual.getConstraints();
for (Map.Entry<String, List<ValidationConstraint>> entry: expected.getConstraints().entrySet()) {
Assertions.assertThat(actualConstraints).containsKey(entry.getKey());
List<ValidationConstraint> actualPropConstraints = actualConstraints.get(entry.getKey());
comparePropConstraints(entry.getValue(), actualPropConstraints);
}
}
private void comparePropConstraints(List<ValidationConstraint> expected, List<ValidationConstraint> actual) {
Assertions.assertThat(actual).isNotNull();
Assertions.assertThat(actual.size()).isEqualTo(expected.size());
for (ValidationConstraint constraint: expected) {
Assertions.assertThat(actual).contains(constraint);
ValidationConstraint actualConstraint = actual.get(actual.indexOf(constraint));
compareConstraint(constraint, actualConstraint);
}
}
private void compareConstraint(ValidationConstraint expected, ValidationConstraint actual) {
Assertions.assertThat(actual.getType()).isEqualTo(expected.getType());
Assertions.assertThat(actual.getMessage()).isEqualTo(expected.getMessage());
compareAttributes(expected, actual);
}
private void compareAttributes(ValidationConstraint expected, ValidationConstraint actual) {
Map<String, Object> actualAttributes = actual.getAttributes();
if (expected.getAttributes() == null) {
Assertions.assertThat(actual.getAttributes()).isNull();
} else {
Assertions.assertThat(actualAttributes).isNotNull();
Assertions.assertThat(actualAttributes.size()).isEqualTo(expected.getAttributes().size());
for (Map.Entry<String, Object> attrEntry: expected.getAttributes().entrySet()) {
Assertions.assertThat(actualAttributes).containsKey(attrEntry.getKey());
}
}
}
@Test
public void testInheritanceAndCompositionModelWithLocale() {
InputStream in = this.getClass().getClassLoader().getResourceAsStream("validation/aModel.json");
StringWriter writer = new StringWriter();
try {
IOUtils.copy(in, writer);
} catch (IOException e) {
Assertions.fail("cannot read file", e);
}
String jsonFile = writer.toString();
ModelConstraint expected = JsonHelper.deserialize(jsonFile, ModelConstraint.class);
Response response = this.request("api/validation/" + AModel.class.getCanonicalName()).setQueryParameter("locale", "en").get();
ModelConstraint actual = response.resource(ModelConstraint.class);
Assertions.assertThat(actual).isNotNull();
Assertions.assertThat(actual.getModelRef()).isNotNull().isEqualTo(expected.getModelRef());
Assertions.assertThat(actual.getConstraints()).isNotNull().isNotEmpty();
Assertions.assertThat(actual.getConstraints().size()).isEqualTo(expected.getConstraints().size());
compareConstraints(expected, actual);
}
@Test
public void testInheritanceAndCompositionModelWithoutLocale() {
Response response = this.request("api/validation/" + AModel.class.getCanonicalName()).get();
Assertions.assertThat(response.getBody()).contains("constraints");
}
@Test
public void testInheritanceAndCompositionModelWithLocales() {
InputStream in = this.getClass().getClassLoader().getResourceAsStream("validation/aModel.json");
StringWriter writer = new StringWriter();
try {
IOUtils.copy(in, writer);
} catch (IOException e) {
Assertions.fail("cannot read file", e);
}
String jsonFile = writer.toString();
ModelConstraint expected = JsonHelper.deserialize(jsonFile, ModelConstraint.class);
Response response = this.request("api/validation/" + AModel.class.getCanonicalName()).setQueryParameter("locale", "en-en").get();
ModelConstraint actual = response.resource(ModelConstraint.class);
Assertions.assertThat(actual).isNotNull();
Assertions.assertThat(actual.getModelRef()).isNotNull().isEqualTo(expected.getModelRef());
Assertions.assertThat(actual.getConstraints()).isNotNull().isNotEmpty();
Assertions.assertThat(actual.getConstraints().size()).isEqualTo(expected.getConstraints().size());
compareConstraints(expected, actual);
}
@Test
public void testNonSupportedClassLevelConstraint() {
Response response = this.request("api/validation/" + ClassLevelConstraintModel.class.getCanonicalName()).get();
Assertions.assertThat(response.getBody()).contains("org.resthub.web.validation.model.ClassLevelConstraintModel")
.contains("\"constraints\" : { }");
}
@Test
public void testNonSupportedInheritedClassLevelConstraint() {
Response response = this.request("api/validation/" + InheritedClassLevelConstraintModel.class.getCanonicalName()).get();
Assertions.assertThat(response.getBody()).contains("org.resthub.web.validation.model.InheritedClassLevelConstraintModel")
.contains("\"type\" : \"Size\"");
}
@Test
public void testAbstractModel() {
Response response = this.request("api/validation/" + AbstractModel.class.getCanonicalName()).get();
Assertions.assertThat(response.getBody()).contains("org.resthub.web.validation.model.AbstractModel")
.contains("\"constraints\" : { }");
}
@Test
public void testNoConstraintsModel() {
Response response = this.request("api/validation/" + NoConstraintsModel.class.getCanonicalName()).get();
Assertions.assertThat(response.getBody()).contains("org.resthub.web.validation.model.NoConstraintsModel")
.contains("\"constraints\" : { }");
}
}