/* * Copyright 2016 Red Hat, Inc. and/or its affiliates. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.kie.workbench.common.forms.dynamic.backend.server.context.generation.dynamic.impl; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; import org.junit.Test; import org.junit.runner.RunWith; import org.kie.workbench.common.forms.dynamic.backend.server.context.generation.dynamic.impl.model.Person; import org.kie.workbench.common.forms.dynamic.service.shared.impl.MapModelRenderingContext; import org.kie.workbench.common.forms.fields.shared.fieldTypes.relations.multipleSubform.definition.MultipleSubFormFieldDefinition; import org.kie.workbench.common.forms.model.FieldDataType; import org.kie.workbench.common.forms.model.FieldDefinition; import org.kie.workbench.common.forms.model.FormDefinition; import org.kie.workbench.common.forms.model.JavaModel; import org.mockito.runners.MockitoJUnitRunner; import static org.junit.Assert.*; @RunWith(MockitoJUnitRunner.class) public class MultipleSubformBackendFormRenderingContextManagerTest extends AbstractBackendFormRenderingContextManagerTest { protected SimpleDateFormat sdf = new SimpleDateFormat("dd-MM-yyyy"); protected List<Person> persons; @Test public void testReadNestedData() { doReadNestedData(); } protected Map<String, Object> doReadNestedData() { Map<String, Object> result = context.getRenderingContext().getModel(); assertFalse("There should be some validations for model", context.getRenderingContext().getModelConstraints().isEmpty()); assertNotNull("Result cannot be null ", result); assertTrue("Result must contain only one entry", result.size() == 1); assertTrue("Processed map must contain value for field 'persons'", result.containsKey("persons")); assertNotNull("Processed map must contain value for field 'persons'", result.get("persons")); List<Map<String, Object>> personMaps = (List<Map<String, Object>>) result.get("persons"); assertEquals("There must be 4 persons", 4, personMaps.size()); for (int i = 0; i < personMaps.size(); i++) { Person person = persons.get(i); Map<String, Object> personMap = personMaps.get(i); assertEquals("Id must be equal", person.getId(), personMap.get("id")); assertEquals("Name must be equal", person.getName(), personMap.get("name")); assertEquals("LastName must be equal", person.getLastName(), personMap.get("lastName")); assertEquals("Birthday must be equal", person.getBirthday(), personMap.get("birthday")); } return result; } @Test public void testEditExistingObjects() { Map<String, Object> formValues = doReadNestedData(); List<Map<String, Object>> personMaps = (List<Map<String, Object>>) formValues.get("persons"); String[] names = new String[]{"Tyrion", "Jaime", "Cersei", "Tywin"}; for (int i = 0; i < personMaps.size(); i++) { Map<String, Object> person = personMaps.get(i); person.put("name", names[i]); person.put("lastName", "Lannister"); person.put(MapModelRenderingContext.FORM_ENGINE_EDITED_OBJECT, Boolean.TRUE); } Map<String, Object> result = contextManager.updateContextData(context.getTimestamp(), formValues).getFormData(); assertNotNull("Result cannot be null ", result); assertTrue("Result must contain only one entry", result.size() == 1); assertTrue("Processed map must contain value for field 'person'", result.containsKey("persons")); assertNotNull("Processed map must contain value for field 'person'", result.get("persons")); assertTrue("Persons must be a List", result.get("persons") instanceof List); List value = (List) result.get("persons"); assertEquals("There should be 4 persons", 4, value.size()); for (int i = 0; i < persons.size(); i++) { assertEquals("Name must be equal", names[i], persons.get(i).getName()); assertEquals("LastName must be equal", "Lannister", persons.get(i).getLastName()); } } @Test public void testRemovingExistingInstances() { Map<String, Object> formValues = doReadNestedData(); List<Map<String, Object>> personMaps = (List<Map<String, Object>>) formValues.get("persons"); personMaps.remove(0); personMaps.remove(0); Map<String, Object> result = contextManager.updateContextData(context.getTimestamp(), formValues).getFormData(); assertNotNull("Result cannot be null ", result); assertTrue("Result must contain only one entry", result.size() == 1); assertTrue("Processed map must contain value for field 'person'", result.containsKey("persons")); assertNotNull("Processed map must contain value for field 'person'", result.get("persons")); assertTrue("Persons must be a List", result.get("persons") instanceof List); List<Person> value = (List) result.get("persons"); assertEquals("There should be 2 persons", 2, value.size()); String[] names = new String[]{"Rob", "John"}; for (int i = 0; i < value.size(); i++) { assertEquals("Name must be equal", names[i], value.get(i).getName()); } } @Test public void testWriteNestedModelWithoutModelContentMarshaller() { testCreateNestedModels(true); } @Test public void testCreateInstancesWithClassOnClassPath() { testCreateNestedModels(false); } protected void testCreateNestedModels(boolean classOnContentMarshaller) { try { initContentMarshallerClassLoader(Person.class, classOnContentMarshaller); Map<String, Object> formValues = doReadNestedData(); List<Map<String, Object>> personMaps = (List<Map<String, Object>>) formValues.get("persons"); Map<String, Object> bran = new HashMap<>(); bran.put("id", 4); bran.put("name", "Bran"); bran.put("lastName", "Stark"); bran.put("birthday", sdf.parse("14-01-2000")); Map<String, Object> sansa = new HashMap<>(); sansa.put("id", 5); sansa.put("name", "Sansa"); sansa.put("lastName", "Stark"); sansa.put("birthday", sdf.parse("14-11-2005")); personMaps.add(bran); personMaps.add(sansa); Map<String, Object> result = contextManager.updateContextData(context.getTimestamp(), formValues).getFormData(); assertNotNull("Result cannot be null ", result); assertTrue("Result must contain only one entry", result.size() == 1); assertTrue("Processed map must contain value for field 'person'", result.containsKey("persons")); assertNotNull("Processed map must contain value for field 'person'", result.get("persons")); assertTrue("Persons must be a List", result.get("persons") instanceof List); List<Person> value = (List) result.get("persons"); assertEquals("There should be 6 persons", 6, value.size()); String[] names = new String[]{"Ned", "Catelyn", "Rob", "John", "Bran", "Sansa"}; for (int i = 0; i < value.size(); i++) { assertEquals("Name must be equal", names[i], value.get(i).getName()); } } catch (Exception e) { e.printStackTrace(); } } @Override protected FormDefinition[] getNestedForms() { JavaModel model = new JavaModel() { @Override public String getType() { return Person.class.getName(); } @Override public String getName() { return "person"; } }; FormDefinition creationForm = new FormDefinition(model); creationForm.setId("person-creation"); FieldDefinition field = fieldManager.getDefinitionByDataType(new FieldDataType(Long.class.getName())); field.setName("id"); field.setBinding("id"); creationForm.getFields().add(field); field = fieldManager.getDefinitionByDataType(new FieldDataType(String.class.getName())); field.setName("name"); field.setBinding("name"); creationForm.getFields().add(field); field = fieldManager.getDefinitionByDataType(new FieldDataType(String.class.getName())); field.setName("lastName"); field.setBinding("lastName"); creationForm.getFields().add(field); field = fieldManager.getDefinitionByDataType(new FieldDataType(Date.class.getName())); field.setName("birthday"); field.setBinding("birthday"); creationForm.getFields().add(field); FormDefinition editionForm = new FormDefinition(model); editionForm.setId("person-edition"); field = fieldManager.getDefinitionByDataType(new FieldDataType(Long.class.getName())); field.setName("id"); field.setBinding("id"); editionForm.getFields().add(field); field = fieldManager.getDefinitionByDataType(new FieldDataType(String.class.getName())); field.setName("name"); field.setBinding("name"); editionForm.getFields().add(field); field = fieldManager.getDefinitionByDataType(new FieldDataType(String.class.getName())); field.setName("lastName"); field.setBinding("lastName"); editionForm.getFields().add(field); field = fieldManager.getDefinitionByDataType(new FieldDataType(Date.class.getName())); field.setName("birthday"); field.setBinding("birthday"); editionForm.getFields().add(field); return new FormDefinition[]{creationForm, editionForm}; } @Override protected FormDefinition getRootForm() { FormDefinition form = new FormDefinition(() -> "root"); form.setId("form"); FieldDefinition field = fieldManager.getDefinitionByDataType(new FieldDataType(Person.class.getName(), true, false)); field.setName("persons"); field.setBinding("persons"); MultipleSubFormFieldDefinition multpleSubForm = (MultipleSubFormFieldDefinition) field; multpleSubForm.setCreationForm("person-creation"); multpleSubForm.setEditionForm("person-edition"); form.getFields().add(field); form.setModel(() -> "default"); return form; } @Override protected Map<String, Object> generateFormData() { persons = new ArrayList<>(); try { persons.add(new Person(0, "Ned", "Stark", sdf.parse("24-02-1981"))); persons.add(new Person(1, "Catelyn", "Stark", sdf.parse("04-05-1983"))); persons.add(new Person(2, "Rob", "Stark", sdf.parse("12-04-2013"))); persons.add(new Person(3, "John", "Snow", sdf.parse("21-05-2015"))); } catch (ParseException e) { // swallow } Map<String, Object> data = new HashMap<>(); data.put("persons", persons); return data; } }