1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27 package gov.nist.secauto.metaschema.databind.model;
28
29 import static org.junit.jupiter.api.Assertions.assertAll;
30 import static org.junit.jupiter.api.Assertions.assertEquals;
31 import static org.junit.jupiter.api.Assertions.assertIterableEquals;
32 import static org.junit.jupiter.api.Assertions.assertNull;
33 import static org.junit.jupiter.api.Assertions.assertTrue;
34
35 import com.fasterxml.jackson.core.JsonFactory;
36 import com.fasterxml.jackson.core.JsonParseException;
37 import com.fasterxml.jackson.core.JsonParser;
38
39 import gov.nist.secauto.metaschema.core.model.IModule;
40 import gov.nist.secauto.metaschema.databind.IBindingContext;
41 import gov.nist.secauto.metaschema.databind.io.json.MetaschemaJsonReader;
42 import gov.nist.secauto.metaschema.databind.model.info.IDataTypeHandler;
43 import gov.nist.secauto.metaschema.databind.model.test.MultiFieldAssembly;
44 import gov.nist.secauto.metaschema.databind.model.test.SimpleAssembly;
45
46 import org.jmock.auto.Mock;
47 import org.jmock.junit5.JUnit5Mockery;
48 import org.junit.jupiter.api.Test;
49 import org.junit.jupiter.api.extension.RegisterExtension;
50
51 import java.io.IOException;
52 import java.util.Collections;
53 import java.util.LinkedList;
54
55 class DefaultFieldPropertyTest {
56 @RegisterExtension
57 JUnit5Mockery context = new JUnit5Mockery();
58
59 @Mock
60 private IModule module;
61 @Mock
62 private IAssemblyClassBinding classBinding;
63 @Mock
64 private IBindingContext bindingContext;
65
66 @Test
67 void testJsonReadFlag()
68 throws JsonParseException, IOException {
69 String json = "{ \"test\": { \"id\": \"theId\", \"number\": 1 } }";
70 JsonFactory factory = new JsonFactory();
71 try (JsonParser jsonParser = factory.createParser(json)) {
72 assert jsonParser != null;
73
74 IBindingContext bindingContext = IBindingContext.instance();
75 IAssemblyClassBinding classBinding = (IAssemblyClassBinding) bindingContext.getClassBinding(SimpleAssembly.class);
76 assert classBinding != null;
77
78 MetaschemaJsonReader parser = new MetaschemaJsonReader(jsonParser);
79
80 SimpleAssembly obj = parser.read(classBinding);
81 assert obj != null;
82
83 assertAll(
84 () -> assertEquals("theId", obj.getId()));
85 }
86 }
87
88 @Test
89 void testJsonReadField()
90 throws JsonParseException, IOException {
91
92 String json = "{ \"field1\": \"field1value\", \"fields2\": [ \"field2value\" ] }";
93 JsonFactory factory = new JsonFactory();
94 try (JsonParser jsonParser = factory.createParser(json)) {
95 assert jsonParser != null;
96
97 jsonParser.nextToken();
98
99 IBindingContext bindingContext = IBindingContext.instance();
100 IClassBinding classBinding = bindingContext.getClassBinding(MultiFieldAssembly.class);
101 assert classBinding != null;
102
103 MetaschemaJsonReader parser = new MetaschemaJsonReader(jsonParser);
104
105
106 IDataTypeHandler dataTypeHandler = IDataTypeHandler.newDataTypeHandler(classBinding);
107
108
109 MultiFieldAssembly obj = dataTypeHandler.readItem(null, parser);
110
111 assertAll(
112 () -> assertEquals("field1value", obj.getField1()),
113 () -> assertTrue(obj.getField2() instanceof LinkedList),
114 () -> assertIterableEquals(Collections.singleton("field2value"), obj.getField2()));
115
116
117
118
119 }
120 }
121
122 @Test
123 void testJsonReadMissingFieldValue()
124 throws JsonParseException, IOException {
125 String json = "{ \"fields2\": [\n"
126 + " \"field2value\"\n"
127 + " ]\n"
128 + "}\n";
129 JsonFactory factory = new JsonFactory();
130 try (JsonParser jsonParser = factory.createParser(json)) {
131 assert jsonParser != null;
132
133 jsonParser.nextToken();
134
135 IBindingContext bindingContext = IBindingContext.instance();
136 IClassBinding classBinding = bindingContext.getClassBinding(MultiFieldAssembly.class);
137 assert classBinding != null;
138
139 MetaschemaJsonReader parser = new MetaschemaJsonReader(jsonParser);
140
141
142 IDataTypeHandler dataTypeHandler = IDataTypeHandler.newDataTypeHandler(classBinding);
143
144
145 MultiFieldAssembly obj = dataTypeHandler.readItem(null, parser);
146
147 assertAll(
148 () -> assertNull(obj.getField1()),
149 () -> assertTrue(obj.getField2() instanceof LinkedList),
150 () -> assertIterableEquals(Collections.singleton("field2value"), obj.getField2()));
151 }
152 }
153
154 @Test
155 void testJsonReadFieldValueKey()
156 throws JsonParseException, IOException {
157 String json = "{ \"field-value-key\": { \"a-value\": \"theValue\" } }";
158 JsonFactory factory = new JsonFactory();
159 try (JsonParser jsonParser = factory.createParser(json)) {
160 assert jsonParser != null;
161
162 jsonParser.nextToken();
163
164 IBindingContext bindingContext = IBindingContext.instance();
165 IClassBinding classBinding = bindingContext.getClassBinding(MultiFieldAssembly.class);
166 assert classBinding != null;
167
168 MetaschemaJsonReader parser = new MetaschemaJsonReader(jsonParser);
169
170
171 IDataTypeHandler dataTypeHandler = IDataTypeHandler.newDataTypeHandler(classBinding);
172
173
174 MultiFieldAssembly obj = dataTypeHandler.readItem(null, parser);
175
176 assertAll(
177 () -> assertEquals("theValue", obj.getField3().getValue()));
178 }
179 }
180
181 @Test
182 void testJsonReadFieldDefaultValueKey()
183 throws JsonParseException, IOException {
184 String json = "{ \"field-default-value-key\": { \"STRVALUE\": \"theValue\" } }";
185 JsonFactory factory = new JsonFactory();
186 try (JsonParser jsonParser = factory.createParser(json)) {
187 assert jsonParser != null;
188
189 jsonParser.nextToken();
190
191 IBindingContext bindingContext = IBindingContext.instance();
192 IClassBinding classBinding = bindingContext.getClassBinding(MultiFieldAssembly.class);
193 assert classBinding != null;
194
195 MetaschemaJsonReader parser = new MetaschemaJsonReader(jsonParser);
196
197
198 IDataTypeHandler dataTypeHandler = IDataTypeHandler.newDataTypeHandler(classBinding);
199
200
201 MultiFieldAssembly obj = dataTypeHandler.readItem(null, parser);
202
203 assertAll(
204 () -> assertEquals("theValue", obj.getField4().getValue()));
205 }
206 }
207 }