001 package org.kuali.student.common.assembly.dictionary;
002
003 import java.io.File;
004 import java.io.FileNotFoundException;
005 import java.io.FileOutputStream;
006 import java.io.OutputStream;
007 import java.io.PrintStream;
008 import java.util.Date;
009 import java.util.HashSet;
010 import java.util.LinkedHashMap;
011 import java.util.LinkedHashSet;
012 import static org.junit.Assert.assertTrue;
013 import static org.junit.Assert.assertEquals;
014 import static org.junit.Assert.assertFalse;
015 import static org.junit.Assert.assertNotNull;
016 import static org.junit.Assert.assertNull;
017
018 import java.util.Map;
019 import java.util.Set;
020
021 import org.junit.Test;
022 import org.kuali.student.common.assembly.data.ConstraintMetadata;
023 import org.kuali.student.common.assembly.data.Metadata;
024 import org.kuali.student.common.assembly.dictionary.MetadataFormatter;
025 import org.kuali.student.common.assembly.dictionary.MetadataServiceImpl;
026 import org.kuali.student.common.dictionary.service.impl.DictionaryServiceImpl;
027
028 public class TestMetadataServiceImpl {
029
030 DictionaryServiceImpl dictionaryDelegate = new DictionaryServiceImpl("classpath:test-validator-context.xml");
031 private static final String SIMPLE_STUDENT = "simpleStudent";
032 private static final String ADDRESS_INFO = "addressInfo";
033 private static final String US_ADDRESS_TYPE = "US";
034 private static final String CANADIAN_ADDRESS_TYPE = "CAN";
035
036 @Test
037 public void testMetadataService() {
038 MockDictionaryService mockDictionaryService = new MockDictionaryService();
039 mockDictionaryService.setDictionaryServiceDelegate(dictionaryDelegate);
040
041 MetadataServiceImpl metadataService = new MetadataServiceImpl(
042 mockDictionaryService);
043 metadataService.setUiLookupContext("classpath:test-lookup-context.xml");
044 Metadata metadata = metadataService.getMetadata(SIMPLE_STUDENT);
045
046 Map<String, Metadata> properties = metadata.getProperties();
047 assertTrue(properties.containsKey("firstName"));
048 assertTrue(properties.containsKey("dob"));
049 assertTrue(properties.containsKey("gpa"));
050
051 assertEquals(1, properties.get("firstName").getConstraints().size());
052 assertEquals(1, properties.get("dob").getConstraints().size());
053 assertEquals(1, properties.get("gpa").getConstraints().size());
054
055 ConstraintMetadata nameConstraints = properties.get("firstName").getConstraints().get(0);
056 assertTrue(nameConstraints.getMinLength() == 2);
057 assertTrue(nameConstraints.getMaxLength() == 20);
058
059 // Check requiredness for default state of draft
060 ConstraintMetadata gpaConstraints = properties.get("gpa").getConstraints().get(0);
061 assertTrue(gpaConstraints.isRequiredForNextState());
062 assertEquals("ACTIVE", gpaConstraints.getNextState());
063
064 // Check requiredness for state of RETIRED (there should be no next state)
065 metadata = metadataService.getMetadata(SIMPLE_STUDENT, "RETIRED");
066 gpaConstraints = metadata.getProperties().get("gpa").getConstraints().get(0);
067 assertFalse(gpaConstraints.isRequiredForNextState());
068 assertNull(gpaConstraints.getNextState());
069
070
071 //Check requiredness by workflow Node
072 metadata = metadataService.getMetadataByWorkflowNode(SIMPLE_STUDENT, "NODE A", null);
073 gpaConstraints = metadata.getProperties().get("gpa").getConstraints().get(0);
074 assertFalse(gpaConstraints.isRequiredForNextState());
075 assertNull(gpaConstraints.getNextState());
076 assertEquals(0, gpaConstraints.getMinOccurs().intValue());
077
078 metadata = metadataService.getMetadataByWorkflowNode(SIMPLE_STUDENT, "NODE B", null);
079 gpaConstraints = metadata.getProperties().get("gpa").getConstraints().get(0);
080 assertTrue(gpaConstraints.isRequiredForNextState());
081 assertEquals("APPROVED", gpaConstraints.getNextState());
082 assertTrue(gpaConstraints.getMinOccurs()==0);
083
084 metadata = metadataService.getMetadataByWorkflowNode(SIMPLE_STUDENT, "NODE C", null);
085 gpaConstraints = metadata.getProperties().get("gpa").getConstraints().get(0);
086 assertFalse(gpaConstraints.isRequiredForNextState());
087 assertNull(gpaConstraints.getNextState());
088 assertTrue(gpaConstraints.getMinOccurs()==1);
089
090
091 // Check type and nested state
092 metadata = metadataService.getMetadata(ADDRESS_INFO);
093 ConstraintMetadata addrLineConstraint = metadata.getProperties().get("line1").getConstraints().get(0);
094 assertEquals(2, addrLineConstraint.getMinLength().intValue());
095 assertEquals(1, addrLineConstraint.getMinOccurs().intValue());
096 assertEquals(30, addrLineConstraint.getMaxLength().intValue());
097
098 metadata = metadataService.getMetadata(ADDRESS_INFO, US_ADDRESS_TYPE, "ACTIVE");
099 addrLineConstraint = metadata.getProperties().get("line1").getConstraints().get(0);
100 assertEquals(2, addrLineConstraint.getMinLength().intValue());
101 assertEquals(1, addrLineConstraint.getMinOccurs().intValue());
102 assertEquals(30, addrLineConstraint.getMaxLength().intValue());
103
104 metadata = metadataService.getMetadata(ADDRESS_INFO, US_ADDRESS_TYPE, "DRAFT");
105 addrLineConstraint = metadata.getProperties().get("line1").getConstraints().get(0);
106 assertEquals(2, addrLineConstraint.getMinLength().intValue());
107 assertEquals(1, addrLineConstraint.getMinOccurs().intValue());
108 assertEquals(30, addrLineConstraint.getMaxLength().intValue());
109
110 metadata = metadataService.getMetadata(ADDRESS_INFO, CANADIAN_ADDRESS_TYPE, "DRAFT");
111 addrLineConstraint = metadata.getProperties().get("line1").getConstraints().get(0);
112 assertEquals(2, addrLineConstraint.getMinLength().intValue());
113 assertEquals(1, addrLineConstraint.getMinOccurs().intValue());
114 assertEquals(30, addrLineConstraint.getMaxLength().intValue());
115 }
116
117 @Test
118 public void testMetadataFormatter() {
119
120 Set<String> startingObjects = new LinkedHashSet<String>();
121 Map<String, Set<String>> types = new LinkedHashMap<String, Set<String>>();
122
123 startingObjects.add(SIMPLE_STUDENT);
124 startingObjects.add(ADDRESS_INFO);
125
126 MockDictionaryService mockDictionaryService = new MockDictionaryService();
127 mockDictionaryService.setDictionaryServiceDelegate(dictionaryDelegate);
128
129 MetadataServiceImpl metadataService = new MetadataServiceImpl(mockDictionaryService);
130 metadataService.setUiLookupContext("classpath:test-lookup-context.xml");
131 // startingClasses.add (StatementTreeViewInfo.class);
132
133 Set<String> typesForClass = new LinkedHashSet<String>();
134 types.put(ADDRESS_INFO, typesForClass);
135 typesForClass.add(US_ADDRESS_TYPE);
136 typesForClass.add(CANADIAN_ADDRESS_TYPE);
137
138 String outFile = "target/test-metadata.txt";
139 File file = new File(outFile);
140 OutputStream outputStream = null;
141 try {
142 outputStream = new FileOutputStream(file, false);
143 } catch (FileNotFoundException ex) {
144 throw new RuntimeException(ex);
145 }
146 PrintStream out = new PrintStream(outputStream);
147 out.println("(!) This page was automatically generated on " + new Date());
148 out.println("DO NOT UPDATE MANUALLY!");
149 out.println("");
150 out.println("This page represents a formatted view of the test dictionary");
151 for (String objectKey : startingObjects) {
152 out.println("# " + objectKey);
153 }
154 out.println("");
155 out.println("----");
156 out.println("{toc}");
157 out.println("----");
158
159 for (String objectKey : startingObjects) {
160 // out.println ("getting meta data for " + clazz.getName ());
161 Metadata metadata = metadataService.getMetadata(objectKey);
162 assertNotNull(metadata);
163 MetadataFormatter formatter = new MetadataFormatter(objectKey,
164 metadata, null, null, new HashSet<Metadata>(), 1);
165 out.println(formatter.formatForWiki());
166 if (types.get(objectKey) == null) {
167 continue;
168 }
169 for (String type : types.get(objectKey)) {
170 System.out.println("*** Generating formatted version for " + type);
171 metadata = metadataService.getMetadata(objectKey, type, (String) null);
172 assertNotNull(metadata);
173 formatter = new MetadataFormatter(objectKey, metadata, type, null, new HashSet<Metadata>(), 1);
174 out.println(formatter.formatForWiki());
175 }
176 }
177 }
178 }