package org.activityinfo.legacy.shared.adapter; import com.google.common.base.Predicate; import com.google.common.collect.Iterables; import com.google.common.collect.Lists; import org.activityinfo.core.client.InstanceQuery; import org.activityinfo.core.client.form.tree.AsyncFormTreeBuilder; import org.activityinfo.core.shared.Projection; import org.activityinfo.core.shared.criteria.ClassCriteria; import org.activityinfo.fixtures.InjectionSupport; import org.activityinfo.model.form.FormClass; import org.activityinfo.model.form.FormInstance; import org.activityinfo.model.formTree.FieldPath; import org.activityinfo.model.formTree.FormTree; import org.activityinfo.model.legacy.CuidAdapter; import org.activityinfo.model.resource.ResourceId; import org.activityinfo.model.type.ReferenceValue; import org.activityinfo.model.type.enumerated.EnumValue; import org.activityinfo.model.type.time.LocalDate; import org.activityinfo.server.command.CommandTestCase2; import org.activityinfo.server.database.OnDataSet; import org.junit.Assert; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import javax.annotation.Nullable; import java.util.List; import static org.activityinfo.core.client.PromiseMatchers.assertResolves; @RunWith(InjectionSupport.class) @OnDataSet("/dbunit/sites-simple1.db.xml") public class SitePersisterTest extends CommandTestCase2 { private static final ResourceId PEAR_Activity = CuidAdapter.activityFormClass(1); private static final ResourceId CONTENU_DI_KIT_FIELD = CuidAdapter.attributeGroupField(2); private static final ResourceId CONTENU_DI_KIT_FIELD_ATTR_VALUE = CuidAdapter.attributeId(3); private ResourceLocatorAdaptor resourceLocator; @Before public final void setup() { resourceLocator = new ResourceLocatorAdaptor(getDispatcher()); } @Test public void test() { FormClass formClass = assertResolves(resourceLocator.getFormClass(PEAR_Activity)); FormInstance siteFormInstance = new FormInstance(CuidAdapter.generateSiteCuid(), formClass.getId()); siteFormInstance.set(CONTENU_DI_KIT_FIELD, CONTENU_DI_KIT_FIELD_ATTR_VALUE); // built-in values siteFormInstance.set(CuidAdapter.field(formClass.getId(), CuidAdapter.START_DATE_FIELD), new LocalDate(2014, 1, 1)); siteFormInstance.set(CuidAdapter.field(formClass.getId(), CuidAdapter.END_DATE_FIELD), new LocalDate(2014, 1, 2)); siteFormInstance.set(CuidAdapter.field(formClass.getId(), CuidAdapter.LOCATION_FIELD), new ReferenceValue(CuidAdapter.locationInstanceId(1))); SitePersister sitePersister = new SitePersister(getDispatcher()); assertResolves(sitePersister.persist(siteFormInstance)); // query by id FormInstance fromServer = assertResolves(resourceLocator.getFormInstance(siteFormInstance.getId())); Assert.assertNotNull(fromServer); Assert.assertEquals(fromServer.get(CONTENU_DI_KIT_FIELD), new EnumValue(CONTENU_DI_KIT_FIELD_ATTR_VALUE)); FormTree formTree = assertResolves(new AsyncFormTreeBuilder(resourceLocator).apply(formClass.getId())); final List<FieldPath> paths = Lists.newArrayList(formTree.getRootPaths()); Assert.assertTrue(paths.contains(new FieldPath(CONTENU_DI_KIT_FIELD))); // query projection InstanceQuery query = new InstanceQuery(paths, new ClassCriteria(PEAR_Activity)); Projection projection = byId(assertResolves(resourceLocator.queryProjection(query)).getProjections(), siteFormInstance.getId()); Assert.assertNotNull(projection); Assert.assertEquals(projection.getReferenceValue(CONTENU_DI_KIT_FIELD).iterator().next(), CONTENU_DI_KIT_FIELD_ATTR_VALUE); } private Projection byId(List<Projection> list, final ResourceId id) { return Iterables.find(list, new Predicate<Projection>() { @Override public boolean apply(@Nullable Projection input) { return input.getRootInstanceId().equals(id); } }); } }