package org.activityinfo.legacy.shared.adapter;
import org.activityinfo.fixtures.InjectionSupport;
import org.activityinfo.legacy.shared.command.GetSites;
import org.activityinfo.legacy.shared.model.SiteDTO;
import org.activityinfo.model.form.FormClass;
import org.activityinfo.model.form.FormField;
import org.activityinfo.model.form.FormInstance;
import org.activityinfo.model.legacy.CuidAdapter;
import org.activityinfo.model.resource.ResourceId;
import org.activityinfo.model.type.ReferenceValue;
import org.activityinfo.model.type.time.LocalDate;
import org.activityinfo.server.command.CommandTestCase2;
import org.activityinfo.server.database.OnDataSet;
import org.hamcrest.Matcher;
import org.hamcrest.Matchers;
import org.junit.Test;
import org.junit.runner.RunWith;
import static org.activityinfo.core.client.PromiseMatchers.assertResolves;
import static org.hamcrest.Matchers.*;
import static org.junit.Assert.assertThat;
@RunWith(InjectionSupport.class)
public class ActivityFormClassBuilderTest extends CommandTestCase2 {
public static final int BAVON_USER_ID = 2;
@Test @OnDataSet("/dbunit/sites-simple1.db.xml")
public void partnersFieldIsNotVisibleIfThereIsOnlyOneChoice() {
setUser(BAVON_USER_ID);
ResourceLocatorAdaptor locator = new ResourceLocatorAdaptor(getDispatcher());
FormClass formClass = assertResolves(locator.getFormClass(CuidAdapter.activityFormClass(1)));
ResourceId partnerFieldId = CuidAdapter.field(formClass.getId(), CuidAdapter.PARTNER_FIELD);
FormField partnerField = formClass.getField(partnerFieldId);
assertThat(partnerField, hasProperty("visible", equalTo(false)));
// Make sure we can update if partner is not specified
FormInstance instance = new FormInstance(CuidAdapter.newLegacyFormInstanceId(formClass.getId()), formClass.getId());
instance.set(CuidAdapter.field(formClass.getId(), CuidAdapter.START_DATE_FIELD), new LocalDate(2014, 1, 1));
instance.set(CuidAdapter.field(formClass.getId(), CuidAdapter.END_DATE_FIELD), new LocalDate(2014, 1, 2));
instance.set(CuidAdapter.field(formClass.getId(), CuidAdapter.LOCATION_FIELD),
new ReferenceValue(CuidAdapter.locationInstanceId(1)));
assertResolves(locator.persist(instance));
}
@Test @OnDataSet("/dbunit/chad-form.db.xml")
public void nullLocationTypeIsNotVisible() {
setUser(9944);
ResourceLocatorAdaptor locator = new ResourceLocatorAdaptor(getDispatcher());
FormClass formClass = assertResolves(locator.getFormClass(CuidAdapter.activityFormClass(11218)));
ResourceId locationFieldId = CuidAdapter.field(formClass.getId(), CuidAdapter.LOCATION_FIELD);
assertThat(formClass.getFields(), not(hasItem(withId(locationFieldId))));
// Make sure we can update if location is not specified
FormInstance instance = new FormInstance(CuidAdapter.newLegacyFormInstanceId(formClass.getId()), formClass.getId());
instance.set(CuidAdapter.field(formClass.getId(), CuidAdapter.START_DATE_FIELD), new LocalDate(2014, 1, 1));
instance.set(CuidAdapter.field(formClass.getId(), CuidAdapter.END_DATE_FIELD), new LocalDate(2014, 1, 2));
assertResolves(locator.persist(instance));
// Make sure the null location object is visible to legacy code
SiteDTO site = execute(GetSites.byId(CuidAdapter.getLegacyIdFromCuid(instance.getId()))).getData().get(0);
assertThat(site.getLocationName(), equalTo("Chad"));
}
private Matcher<FormField> withId(ResourceId locationFieldId) {
return Matchers.<FormField>hasProperty("id", equalTo(locationFieldId));
}
}