package io.github.ibuildthecloud.gdapi.factory.impl;
import static org.junit.Assert.*;
import io.github.ibuildthecloud.gdapi.model.Field;
import io.github.ibuildthecloud.gdapi.model.FieldType;
import io.github.ibuildthecloud.gdapi.model.Schema;
import io.github.ibuildthecloud.gdapi.testobject.TestType;
import io.github.ibuildthecloud.gdapi.testobject.TestTypeCRUD;
import io.github.ibuildthecloud.gdapi.testobject.TestTypeChild;
import io.github.ibuildthecloud.gdapi.testobject.TestTypeRename;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import org.junit.Before;
import org.junit.Ignore;
import org.junit.Test;
public class SchemaFactoryImplTest {
SchemaFactoryImpl factory;
@Before
public void setUp() {
factory = new SchemaFactoryImpl();
}
protected Schema parseSchema(Class<?> clz) {
Schema schema = factory.registerSchema(clz);
return factory.parseSchema(schema.getId());
}
@Test
public void testOrdering() {
Schema schema = parseSchema(TestType.class);
Iterator<String> fields = schema.getResourceFields().keySet().iterator();
assertEquals("first", fields.next());
assertEquals("second", fields.next());
assertEquals("a", fields.next());
}
@Test
public void testOnlyWriteable() {
Schema schema = parseSchema(TestType.class);
Iterator<String> fields = schema.getResourceFields().keySet().iterator();
assertEquals("first", fields.next());
assertEquals("second", fields.next());
assertEquals("a", fields.next());
}
@Test
public void testName() {
Schema schema = parseSchema(TestType.class);
assertEquals("testType", schema.getId());
assertEquals("schema", schema.getType());
}
@Test
public void testRename() {
Schema schema = parseSchema(TestTypeRename.class);
assertEquals("Renamed", schema.getId());
assertEquals("schema", schema.getType());
}
@Test
public void testSimpleTypes() {
Schema schema = parseSchema(TestType.class);
Map<String, Field> fields = schema.getResourceFields();
assertEquals("blob", fields.get("typeBlob").getType());
assertEquals("date", fields.get("typeDate").getType());
assertEquals("enum", fields.get("typeEnum").getType());
assertEquals("boolean", fields.get("typeBool").getType());
assertTrue(!fields.get("typeBool").isNullable());
assertEquals("boolean", fields.get("typeBoolean").getType());
assertTrue(fields.get("typeBoolean").isNullable());
assertEquals("float", fields.get("typeFloat").getType());
assertTrue(!fields.get("typeFloat").isNullable());
assertEquals("float", fields.get("typeFloatObject").getType());
assertTrue(fields.get("typeFloatObject").isNullable());
assertEquals("float", fields.get("typeDouble").getType());
assertTrue(!fields.get("typeDouble").isNullable());
assertEquals("float", fields.get("typeDoubleObject").getType());
assertTrue(fields.get("typeDoubleObject").isNullable());
assertEquals("int", fields.get("typeInt").getType());
assertTrue(!fields.get("typeInt").isNullable());
assertEquals("int", fields.get("typeInteger").getType());
assertTrue(fields.get("typeInteger").isNullable());
assertEquals("int", fields.get("typeLong").getType());
assertTrue(!fields.get("typeLong").isNullable());
assertEquals("int", fields.get("typeLongObject").getType());
assertTrue(fields.get("typeLongObject").isNullable());
assertEquals(FieldType.PASSWORD.getExternalType(), fields.get("typePassword").getType());
assertEquals(FieldType.STRING.getExternalType(), fields.get("typeString").getType());
assertEquals(FieldType.MAP, fields.get("typeMap").getTypeEnum());
assertEquals(FieldType.REFERENCE, fields.get("typeReference").getTypeEnum());
assertEquals(FieldType.ARRAY, fields.get("typeArray").getTypeEnum());
assertEquals(FieldType.ARRAY, fields.get("typeList").getTypeEnum());
assertEquals(FieldType.ARRAY, fields.get("testEnumList").getTypeEnum());
assertEquals(FieldType.ENUM, fields.get("testEnumList").getSubTypeEnums().get(0));
}
@Test
@Ignore
public void testDefaultValue() {
fail();
}
@Test
public void testComplexType_Reference_Type() {
parseSchema(TestTypeCRUD.class);
parseSchema(TestTypeRename.class);
Schema schema = parseSchema(TestType.class);
Map<String, Field> fields = schema.getResourceFields();
assertEquals("reference[testTypeCRUD]", fields.get("testTypeCrudId").getType());
assertEquals("testTypeCRUD", fields.get("testTypeCrud").getType());
}
@Test
public void testComplexType() {
parseSchema(TestTypeCRUD.class);
parseSchema(TestTypeRename.class);
Schema schema = parseSchema(TestType.class);
Map<String, Field> fields = schema.getResourceFields();
assertEquals("array[map[string]]", fields.get("typeList").getType());
assertEquals("array[string]", fields.get("typeArray").getType());
assertEquals("array[testTypeCRUD]", fields.get("typeListCrud").getType());
assertEquals("map[json]", fields.get("typeMapObject").getType());
}
@Test
public void testDefaults() {
Schema schema = parseSchema(TestType.class);
Map<String, Field> fields = schema.getResourceFields();
assertNull(fields.get("defaultSettings").getDefault());
assertEquals("DEFAULT", fields.get("defaultValue").getDefault());
}
@Test
public void testNullable() {
Schema schema = parseSchema(TestType.class);
Map<String, Field> fields = schema.getResourceFields();
assertTrue(!fields.get("defaultSettings").isNullable());
assertTrue(fields.get("nullable").isNullable());
}
@Test
public void testUnique() {
Schema schema = parseSchema(TestType.class);
Map<String, Field> fields = schema.getResourceFields();
assertTrue(!fields.get("defaultSettings").isUnique());
assertTrue(fields.get("unique").isUnique());
}
@Test
public void testValidChars() {
Schema schema = parseSchema(TestType.class);
Map<String, Field> fields = schema.getResourceFields();
assertNull(fields.get("defaultSettings").getValidChars());
assertEquals("valid", fields.get("validChars").getValidChars());
}
@Test
public void testInvalidChars() {
Schema schema = parseSchema(TestType.class);
Map<String, Field> fields = schema.getResourceFields();
assertNull(fields.get("defaultSettings").getInvalidChars());
assertEquals("invalid", fields.get("invalidChars").getInvalidChars());
}
@Test
public void testRequired() {
Schema schema = parseSchema(TestType.class);
Map<String, Field> fields = schema.getResourceFields();
assertTrue(!fields.get("defaultSettings").isRequired());
assertTrue(fields.get("required").isRequired());
}
@Test
public void testCreateUpdate() {
Schema schema = parseSchema(TestType.class);
Map<String, Field> fields = schema.getResourceFields();
assertTrue(!fields.get("defaultSettings").isCreate());
assertTrue(!fields.get("defaultSettings").isUpdate());
assertTrue(fields.get("createUpdate").isCreate());
assertTrue(fields.get("createUpdate").isUpdate());
}
@Test
public void testNameOverride() {
Schema schema = parseSchema(TestType.class);
Map<String, Field> fields = schema.getResourceFields();
assertNull(fields.get("gonnaBeNameOverride"));
assertNotNull(fields.get("nameOverride"));
}
@Test
public void testLengths() {
Schema schema = parseSchema(TestType.class);
Map<String, Field> fields = schema.getResourceFields();
assertNull(fields.get("defaultSettings").getMinLength());
assertNull(fields.get("defaultSettings").getMaxLength());
assertNull(fields.get("defaultSettings").getMin());
assertNull(fields.get("defaultSettings").getMax());
assertEquals(new Long(142), fields.get("lengths").getMinLength());
assertEquals(new Long(242), fields.get("lengths").getMaxLength());
assertEquals(new Long(342), fields.get("lengths").getMin());
assertEquals(new Long(442), fields.get("lengths").getMax());
}
@Test
public void testOptions() {
Schema schema = parseSchema(TestType.class);
Map<String, Field> fields = schema.getResourceFields();
assertNull(fields.get("defaultSettings").getOptions());
List<String> options = fields.get("typeEnum").getOptions();
assertEquals(2, options.size());
assertEquals("FIRST", options.get(0));
assertEquals("SECOND", options.get(1));
}
@Test
public void testTypeCRUD() {
List<String> resourceMethods = parseSchema(TestType.class).getResourceMethods();
List<String> collectionMethods = parseSchema(TestType.class).getCollectionMethods();
assertEquals(1, resourceMethods.size());
assertEquals(1, collectionMethods.size());
assertEquals("GET", resourceMethods.get(0));
assertEquals("GET", collectionMethods.get(0));
resourceMethods = parseSchema(TestTypeCRUD.class).getResourceMethods();
collectionMethods = parseSchema(TestTypeCRUD.class).getCollectionMethods();
assertEquals(2, resourceMethods.size());
assertTrue(resourceMethods.contains("DELETE"));
assertTrue(resourceMethods.contains("PUT"));
assertEquals(0, collectionMethods.size());
}
@Test
public void testParentClass() {
Schema parent = parseSchema(TestType.class);
Schema child = parseSchema(TestTypeChild.class);
assertEquals(parent.getId(), child.getParent());
Map<String, Field> fields = child.getResourceFields();
assertEquals("boolean", fields.get("typeBool").getType());
assertTrue(!fields.get("typeBool").isNullable());
assertEquals("boolean", fields.get("typeBoolean").getType());
assertTrue(fields.get("typeBoolean").isNullable());
}
@Test
public void testParentName() {
Schema parent = parseSchema(TestType.class);
Schema child = factory.registerSchema("child,parent=" + parent.getId());
child = factory.parseSchema(child.getId());
assertEquals(parent.getId(), child.getParent());
Map<String, Field> fields = child.getResourceFields();
assertEquals("boolean", fields.get("typeBool").getType());
assertTrue(!fields.get("typeBool").isNullable());
assertEquals("boolean", fields.get("typeBoolean").getType());
assertTrue(fields.get("typeBoolean").isNullable());
}
}