Skip to content
This repository has been archived by the owner on May 26, 2020. It is now read-only.

Commit

Permalink
Merge pull request #2 from CJSCommonPlatform/test-generation-boolean-…
Browse files Browse the repository at this point in the history
…number

Add tests for generation of Boolean and Number
  • Loading branch information
allanmckenzie committed Aug 11, 2017
2 parents 8920223 + d68fb0c commit 4ae5121
Show file tree
Hide file tree
Showing 7 changed files with 205 additions and 18 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@

import java.io.File;
import java.lang.reflect.Constructor;
import java.math.BigDecimal;

import com.fasterxml.jackson.databind.ObjectMapper;
import org.everit.json.schema.ObjectSchema;
Expand Down Expand Up @@ -52,16 +53,22 @@ public void shouldBuildTypeSpecFromSchema() throws Exception {

final String lastName = "lastName";
final String firstName = "firstName";
final Boolean required = true;
final Integer signedInCount = 25;
final BigDecimal ratio = BigDecimal.valueOf(2.5);

final Constructor<?> personConstructor = personClass.getConstructor(String.class, String.class);
final Constructor<?> personConstructor = personClass.getConstructor(String.class, String.class, Boolean.class, Integer.class, BigDecimal.class);

final Object person = personConstructor.newInstance(firstName, lastName);
final Object person = personConstructor.newInstance(firstName, lastName, required, signedInCount, ratio);

final String personJson = objectMapper.writeValueAsString(person);

with(personJson)
.assertThat("$.firstName", is(firstName))
.assertThat("$.lastName", is(lastName))
.assertThat("$.required", is(required))
.assertThat("$.signedInCount", is(signedInCount))
.assertThat("$.ratio", is(ratio.doubleValue()))
;
}
}
17 changes: 16 additions & 1 deletion integration-test/src/test/resources/schemas/person-schema.json
Original file line number Diff line number Diff line change
Expand Up @@ -10,11 +10,26 @@
"lastName": {
"type": "string",
"id": "lastName"
},
"required": {
"type": "boolean",
"id": "required"
},
"signedInCount": {
"type": "integer",
"id": "signedInCount"
},
"ratio": {
"type": "number",
"id": "ratio"
}
},
"additionalProperties": false,
"required": [
"firstName",
"lastName"
"lastName",
"required",
"signedInCount",
"ratio"
]
}
Original file line number Diff line number Diff line change
Expand Up @@ -8,9 +8,9 @@
import uk.gov.justice.generation.pojo.dom.FieldDefinition;

import java.math.BigDecimal;
import java.util.ArrayDeque;
import java.util.ArrayList;
import java.util.Deque;
import java.util.LinkedList;
import java.util.List;

import org.everit.json.schema.ArraySchema;
Expand All @@ -27,7 +27,7 @@

public class DefinitionBuilderVisitor implements Visitor {

private final Deque<Entry> definitions = new LinkedList<>();
private final Deque<Entry> definitions = new ArrayDeque<>();
private final List<ClassDefinition> classDefinitions = new ArrayList<>();
private final String packageName;

Expand All @@ -37,6 +37,8 @@ public DefinitionBuilderVisitor(final String packageName) {

@Override
public void visitEnter(final ObjectSchema schema) {
validate(schema);

final String fieldName = schema.getId();
final ClassDefinition definition = new ClassDefinition(fieldName, new ClassName(packageName, capitalize(fieldName)));

Expand All @@ -45,36 +47,34 @@ public void visitEnter(final ObjectSchema schema) {

@Override
public void visitLeave(final ObjectSchema schema) {
final Deque<Definition> tmpStack = new LinkedList<>();
final Deque<Definition> fieldDefinitions = new ArrayDeque<>();

while (definitions.peek().getSchema() != schema) {
tmpStack.push(definitions.pop().getDefinition());
fieldDefinitions.push(definitions.pop().getDefinition());
}

final ClassDefinition classDefinition = (ClassDefinition) definitions.peek().getDefinition();

while (!tmpStack.isEmpty()) {
final Definition definition = tmpStack.pop();
classDefinition.addFieldDefinition(definition);
}

fieldDefinitions.forEach(classDefinition::addFieldDefinition);
classDefinitions.add(classDefinition);
}

@Override
public void visit(final StringSchema schema) {
validate(schema);
definitions.push(new Entry(schema, new FieldDefinition(schema.getId(), new ClassName(String.class))));
}

@Override
public void visit(final BooleanSchema schema) {
validate(schema);
definitions.push(new Entry(schema, new FieldDefinition(schema.getId(), new ClassName(Boolean.class))));
}

@Override
public void visit(final NumberSchema schema) {
final ClassName className = schema.requiresInteger() ? new ClassName(Integer.class) : new ClassName(BigDecimal.class);
validate(schema);

final ClassName className = schema.requiresInteger() ? new ClassName(Integer.class) : new ClassName(BigDecimal.class);
definitions.push(new Entry(schema, new FieldDefinition(schema.getId(), className)));
}

Expand Down Expand Up @@ -113,6 +113,12 @@ public List<ClassDefinition> getDefinitions() {
return classDefinitions;
}

private void validate(final Schema schema) {
if (schema.getId() == null || schema.getId().isEmpty()) {
throw new UnsupportedSchemaException("Invalid Schema: all schema value types must have the id set for correct source generation.");
}
}

private class Entry {

private final Schema schema;
Expand All @@ -131,4 +137,4 @@ Definition getDefinition() {
return definition;
}
}
}
}
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
package uk.gov.justice.generation.pojo.core;

import static java.lang.String.format;

import org.everit.json.schema.ArraySchema;
import org.everit.json.schema.BooleanSchema;
import org.everit.json.schema.CombinedSchema;
Expand Down Expand Up @@ -59,7 +61,7 @@ public void accept(final Visitor visitor) {
visitor.visit((CombinedSchema) schema);
break;
default:
throw new UnsupportedSchemaException(String.format("Schema of type: %s is not supported.", schema.getClass().getSimpleName()));
throw new UnsupportedSchemaException(format("Schema of type: %s is not supported.", schema.getClass().getSimpleName()));
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,18 +7,26 @@

import java.util.List;

import org.everit.json.schema.BooleanSchema;
import org.everit.json.schema.NumberSchema;
import org.everit.json.schema.ObjectSchema;
import org.everit.json.schema.StringSchema;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.ExpectedException;
import org.junit.runner.RunWith;
import org.mockito.runners.MockitoJUnitRunner;


@RunWith(MockitoJUnitRunner.class)
public class DefinitionBuilderVisitorTest {

private static final String INVALID_SCHEMA_ID_MESSAGE = "Invalid Schema: all schema value types must have the id set for correct source generation.";
@Rule
public ExpectedException expectedException = ExpectedException.none();

@Test
public void shouldGenerateClassDefinitions() throws Exception {
public void shouldGenerateClassDefinitionsWithStringSchemaProperties() throws Exception {
final String packageName = "org.bloggs.fred";
final String outerClass = "OuterClass";
final String innerClass = "InnerClass";
Expand All @@ -40,7 +48,7 @@ public void shouldGenerateClassDefinitions() throws Exception {
final List<ClassDefinition> definitions = definitionBuilderVisitor.getDefinitions();

assertThat(definitions.size(), is(2));

assertThat(definitions.get(0).getClassName().getPackageName(), is(packageName));
assertThat(definitions.get(0).getClassName().getSimpleName(), is(innerClass));
assertThat(definitions.get(0).getFieldDefinitions().get(0).getFieldName(), is("innerProperty"));
Expand All @@ -52,4 +60,108 @@ public void shouldGenerateClassDefinitions() throws Exception {
assertThat(definitions.get(1).getFieldDefinitions().get(1).getClassName().getFullyQualifiedName(), is("java.lang.String"));
}

@Test
public void shouldGenerateClassDefinitionWithBooleanSchemaProperty() throws Exception {
final String packageName = "org.bloggs.fred";
final String outerClass = "OuterClass";
final DefinitionBuilderVisitor definitionBuilderVisitor = new DefinitionBuilderVisitor(packageName);

final BooleanSchema outerProperty = BooleanSchema.builder().id("outerProperty").build();
final ObjectSchema objectSchema = ObjectSchema.builder().addPropertySchema("outerProperty", outerProperty).id(outerClass).build();

definitionBuilderVisitor.visitEnter(objectSchema);
definitionBuilderVisitor.visit(outerProperty);
definitionBuilderVisitor.visitLeave(objectSchema);

final List<ClassDefinition> definitions = definitionBuilderVisitor.getDefinitions();

assertThat(definitions.size(), is(1));

assertThat(definitions.get(0).getClassName().getPackageName(), is(packageName));
assertThat(definitions.get(0).getClassName().getSimpleName(), is(outerClass));
assertThat(definitions.get(0).getFieldDefinitions().get(0).getFieldName(), is("outerProperty"));
assertThat(definitions.get(0).getFieldDefinitions().get(0).getClassName().getFullyQualifiedName(), is("java.lang.Boolean"));
}

@Test
public void shouldGenerateClassDefinitionWithNumberSchemaProperty() throws Exception {
final String packageName = "org.bloggs.fred";
final String outerClass = "OuterClass";
final DefinitionBuilderVisitor definitionBuilderVisitor = new DefinitionBuilderVisitor(packageName);

final NumberSchema numberProperty = NumberSchema.builder().id("numberProperty").build();
final NumberSchema integerProperty = NumberSchema.builder().requiresInteger(true).id("integerProperty").build();

final ObjectSchema objectSchema = ObjectSchema.builder()
.addPropertySchema("numberProperty", numberProperty)
.addPropertySchema("integerProperty", integerProperty)
.id(outerClass)
.build();

definitionBuilderVisitor.visitEnter(objectSchema);
definitionBuilderVisitor.visit(numberProperty);
definitionBuilderVisitor.visit(integerProperty);
definitionBuilderVisitor.visitLeave(objectSchema);

final List<ClassDefinition> definitions = definitionBuilderVisitor.getDefinitions();

assertThat(definitions.size(), is(1));

assertThat(definitions.get(0).getClassName().getPackageName(), is(packageName));
assertThat(definitions.get(0).getClassName().getSimpleName(), is(outerClass));

assertThat(definitions.get(0).getFieldDefinitions().get(0).getFieldName(), is("numberProperty"));
assertThat(definitions.get(0).getFieldDefinitions().get(0).getClassName().getFullyQualifiedName(), is("java.math.BigDecimal"));

assertThat(definitions.get(0).getFieldDefinitions().get(1).getFieldName(), is("integerProperty"));
assertThat(definitions.get(0).getFieldDefinitions().get(1).getClassName().getFullyQualifiedName(), is("java.lang.Integer"));
}

@Test
public void shouldThrowExceptionIfSchemaIdIsNotSetOnObjectSchema() throws Exception {
expectedException.expect(UnsupportedSchemaException.class);
expectedException.expectMessage(INVALID_SCHEMA_ID_MESSAGE);

final String packageName = "org.bloggs.fred";
final DefinitionBuilderVisitor definitionBuilderVisitor = new DefinitionBuilderVisitor(packageName);
final ObjectSchema objectSchema = ObjectSchema.builder().build();

definitionBuilderVisitor.visitEnter(objectSchema);
}

@Test
public void shouldThrowExceptionIfSchemaIdIsNotSetOnStringSchema() throws Exception {
expectedException.expect(UnsupportedSchemaException.class);
expectedException.expectMessage(INVALID_SCHEMA_ID_MESSAGE);

final String packageName = "org.bloggs.fred";
final DefinitionBuilderVisitor definitionBuilderVisitor = new DefinitionBuilderVisitor(packageName);
final StringSchema stringSchema = StringSchema.builder().build();

definitionBuilderVisitor.visit(stringSchema);
}

@Test
public void shouldThrowExceptionIfSchemaIdIsNotSetOnBooleanSchema() throws Exception {
expectedException.expect(UnsupportedSchemaException.class);
expectedException.expectMessage(INVALID_SCHEMA_ID_MESSAGE);

final String packageName = "org.bloggs.fred";
final DefinitionBuilderVisitor definitionBuilderVisitor = new DefinitionBuilderVisitor(packageName);
final BooleanSchema booleanSchema = BooleanSchema.builder().build();

definitionBuilderVisitor.visit(booleanSchema);
}

@Test
public void shouldThrowExceptionIfSchemaIdIsNotSetOnNumberSchema() throws Exception {
expectedException.expect(UnsupportedSchemaException.class);
expectedException.expectMessage(INVALID_SCHEMA_ID_MESSAGE);

final String packageName = "org.bloggs.fred";
final DefinitionBuilderVisitor definitionBuilderVisitor = new DefinitionBuilderVisitor(packageName);
final NumberSchema numberSchema = NumberSchema.builder().build();

definitionBuilderVisitor.visit(numberSchema);
}
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package uk.gov.justice.generation.pojo.core;

import static org.everit.json.schema.CombinedSchema.ANY_CRITERION;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.verify;

import org.everit.json.schema.ArraySchema;
Expand All @@ -12,8 +13,11 @@
import org.everit.json.schema.NumberSchema;
import org.everit.json.schema.ObjectSchema;
import org.everit.json.schema.ReferenceSchema;
import org.everit.json.schema.Schema;
import org.everit.json.schema.StringSchema;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.ExpectedException;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.runners.MockitoJUnitRunner;
Expand All @@ -22,6 +26,9 @@
@RunWith(MockitoJUnitRunner.class)
public class JsonSchemaWrapperTest {

@Rule
public ExpectedException expectedException = ExpectedException.none();

@Mock
private Visitor visitor;

Expand Down Expand Up @@ -152,4 +159,26 @@ public void shouldVisitObjectAndCombinedSchema() {
verify(visitor).visitLeave(objectSchema);
}

@Test
public void shouldThrowExceptionIfUnknownSchemaProcessed() throws Exception {
expectedException.expect(UnsupportedSchemaException.class);
expectedException.expectMessage("Schema of type: DummySchema is not supported.");

final Schema.Builder builder = mock(Schema.Builder.class);
final DummySchema dummySchema = new DummySchema(builder);

new JsonSchemaWrapper(dummySchema).accept(mock(Visitor.class));
}

private class DummySchema extends Schema {

DummySchema(final Builder<?> builder) {
super(builder);
}

@Override
public void validate(final Object o) {
//do nothing
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
package uk.gov.justice.generation.pojo.core;

import static org.hamcrest.CoreMatchers.is;
import static org.junit.Assert.assertThat;

import org.junit.Test;

public class UnsupportedSchemaExceptionTest {

@Test
public void shouldConstructUnsupportedSchemaExceptionWithMessage() throws Exception {
final UnsupportedSchemaException schemaException = new UnsupportedSchemaException("Test message");

assertThat(schemaException.getMessage(), is("Test message"));
}
}

0 comments on commit 4ae5121

Please sign in to comment.