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

Commit

Permalink
add integration test for complex schemas
Browse files Browse the repository at this point in the history
  • Loading branch information
amckenzie committed Aug 15, 2017
1 parent 7e46f84 commit 20e12a6
Show file tree
Hide file tree
Showing 19 changed files with 672 additions and 60 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
package uk.gov.justice.generation.pojo.integration.test;

import static java.util.stream.Collectors.toList;

import uk.gov.justice.generation.pojo.core.DefinitionBuilderVisitor;
import uk.gov.justice.generation.pojo.core.GenerationContext;
import uk.gov.justice.generation.pojo.core.JsonSchemaWrapper;
import uk.gov.justice.generation.pojo.core.RootFieldNameGenerator;
import uk.gov.justice.generation.pojo.generators.ClassGeneratable;
import uk.gov.justice.generation.pojo.generators.JavaGeneratorFactory;
import uk.gov.justice.generation.pojo.integration.utils.ClassCompiler;
import uk.gov.justice.generation.pojo.integration.utils.JsonSchemaLoader;
import uk.gov.justice.generation.pojo.write.SourceWriter;

import java.io.File;
import java.util.List;

import org.everit.json.schema.ObjectSchema;
import org.junit.Test;

public class ComplexSchemaIT {

private final SourceWriter sourceWriter = new SourceWriter();
private final ClassCompiler classCompiler = new ClassCompiler();
private final JavaGeneratorFactory javaGeneratorFactory = new JavaGeneratorFactory();
private final RootFieldNameGenerator rootFieldNameGenerator = new RootFieldNameGenerator();

@Test
public void shouldParseAVeryComplexSchemaDocument() throws Exception {

final File jsonSchemaFile = new File("src/test/resources/schemas/context.command.complex-data.json");
final ObjectSchema schema = JsonSchemaLoader.loadSchema(jsonSchemaFile, ObjectSchema.class);
final String fieldName = rootFieldNameGenerator.generateNameFrom(jsonSchemaFile);

final DefinitionBuilderVisitor definitionBuilderVisitor = new DefinitionBuilderVisitor("uk.gov.justice.pojo");
final JsonSchemaWrapper jsonSchemaWrapper = new JsonSchemaWrapper(schema);

jsonSchemaWrapper.accept(fieldName, definitionBuilderVisitor);

final List<ClassGeneratable> classGeneratables = definitionBuilderVisitor.getDefinitions()
.stream()
.map(javaGeneratorFactory::createClassGeneratorFor)
.collect(toList());


final File sourceOutputDirectory = new File("./target/test-generation");
final File classesOutputDirectory = new File("./target/test-classes");

sourceOutputDirectory.delete();

final GenerationContext generationContext = new GenerationContext(sourceOutputDirectory);

classGeneratables.forEach(classGeneratable -> {
sourceWriter.write(classGeneratable, generationContext);
classCompiler.compile(classGeneratable, sourceOutputDirectory, classesOutputDirectory);
});
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
import uk.gov.justice.generation.pojo.core.DefinitionBuilderVisitor;
import uk.gov.justice.generation.pojo.core.GenerationContext;
import uk.gov.justice.generation.pojo.core.JsonSchemaWrapper;
import uk.gov.justice.generation.pojo.core.RootFieldNameGenerator;
import uk.gov.justice.generation.pojo.dom.ClassDefinition;
import uk.gov.justice.generation.pojo.generators.ClassGeneratable;
import uk.gov.justice.generation.pojo.generators.JavaGeneratorFactory;
Expand All @@ -28,16 +29,19 @@ public class DefinitionBuilderIT {
private final SourceWriter sourceWriter = new SourceWriter();
private final ClassCompiler classCompiler = new ClassCompiler();
private final ObjectMapper objectMapper = new ObjectMapperProducer().objectMapper();
private final RootFieldNameGenerator rootFieldNameGenerator = new RootFieldNameGenerator();

@Test
public void shouldBuildTypeSpecFromSchema() throws Exception {
final File schemaFile = new File("src/test/resources/schemas/person-schema.json");
final ObjectSchema schema = JsonSchemaLoader
.loadSchema("src/test/resources/schemas/person-schema.json", ObjectSchema.class);
.loadSchema(schemaFile, ObjectSchema.class);
final String fieldName = rootFieldNameGenerator.generateNameFrom(schemaFile);

final DefinitionBuilderVisitor definitionBuilderVisitor = new DefinitionBuilderVisitor("uk.gov.justice.pojo");
final JsonSchemaWrapper jsonSchemaWrapper = new JsonSchemaWrapper(schema);

jsonSchemaWrapper.accept(definitionBuilderVisitor);
final JsonSchemaWrapper jsonSchemaWrapper = new JsonSchemaWrapper(schema);
jsonSchemaWrapper.accept(fieldName, definitionBuilderVisitor);

final ClassDefinition personClassDefinition = definitionBuilderVisitor.getDefinitions().get(0);
final ClassGeneratable personClassGenerator = new JavaGeneratorFactory().createClassGeneratorFor(personClassDefinition);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -77,18 +77,4 @@ private ClassDefinition addressDefinition(final String packageName) {

return addressDefinition;
}

private ClassDefinition employeeDefinition(final String packageName, final ClassDefinition addressDefinition) {
final ClassDefinition employeeDefinition = new ClassDefinition("employee", new ClassName(packageName, "Employee"));
employeeDefinition.addFieldDefinition(new FieldDefinition("firstName", new ClassName(String.class)));
employeeDefinition.addFieldDefinition(new FieldDefinition("lastName", new ClassName(String.class)));
employeeDefinition.addFieldDefinition(new FieldDefinition("poundsPerHour", new ClassName(BigDecimal.class)));
employeeDefinition.addFieldDefinition(new FieldDefinition("startDate", new ClassName(ZonedDateTime.class)));
employeeDefinition.addFieldDefinition(new FieldDefinition("favouriteColours", new ClassName(List.class), new ClassName(String.class)));
employeeDefinition.addFieldDefinition(addressDefinition);

return employeeDefinition;
}


}
Original file line number Diff line number Diff line change
Expand Up @@ -10,8 +10,11 @@

public class FileLoader {

public String loadAsJsonSting(final String pathname) {
final File file = new File(pathname);
public String loadAsJsonString(final String pathname) {
return loadAsJsonString(new File(pathname));
}

public String loadAsJsonString(final File file) {
try(final FileInputStream input = new FileInputStream(file)) {
return IOUtils.toString(input, defaultCharset());
} catch (IOException e) {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
package uk.gov.justice.generation.pojo.integration.utils;

import java.io.File;

import javax.inject.Inject;

import org.everit.json.schema.ArraySchema;
Expand All @@ -23,14 +25,10 @@ public class JsonSchemaLoader {
* @return the schema
*/
@SuppressWarnings("unchecked")
public static <T extends Schema> T loadSchema(final String path, @SuppressWarnings("unused") final Class<T> clazz) {
public static <T extends Schema> T loadSchema(final File path, @SuppressWarnings("unused") final Class<T> clazz) {

// TODO: load from classpath rather than working directory
final JSONObject schemaJsonObject = new JSONObject(new FileLoader().loadAsJsonSting(path));
final JSONObject schemaJsonObject = new JSONObject(new FileLoader().loadAsJsonString(path));
return (T) SchemaLoader.load(schemaJsonObject);
}

public static ArraySchema loadArraySchema(final String path) {
return loadSchema(path, ArraySchema.class);
}
}
Loading

0 comments on commit 20e12a6

Please sign in to comment.