package com.constellio.app.ui.acceptation.components.fields; import static org.assertj.core.api.Assertions.assertThat; import static org.mockito.Mockito.when; import java.io.Serializable; import java.util.ArrayList; import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Locale; import java.util.Map; import org.joda.time.LocalDate; import org.junit.Before; import org.junit.Test; import com.constellio.app.modules.rm.RMTestRecords; import com.constellio.app.modules.rm.wrappers.FilingSpace; import com.constellio.app.modules.rm.wrappers.RetentionRule; import com.constellio.app.services.factories.AppLayerFactory; import com.constellio.app.ui.application.ConstellioUI; import com.constellio.app.ui.application.NavigatorConfigurationService; import com.constellio.app.ui.entities.MetadataSchemaVO; import com.constellio.app.ui.entities.RecordVO; import com.constellio.app.ui.framework.components.fields.list.ListAddRemoveDateField; import com.constellio.app.ui.framework.components.fields.list.ListAddRemoveField; import com.constellio.app.ui.framework.components.fields.list.ListAddRemoveRecordComboBox; import com.constellio.app.ui.framework.components.fields.list.ListAddRemoveRecordLookupField; import com.constellio.app.ui.framework.components.fields.list.ListAddRemoveTextField; import com.constellio.app.ui.pages.base.BaseViewImpl; import com.constellio.app.ui.tools.components.listAddRemove.ListAddRemoveDateFieldWebElement; import com.constellio.app.ui.tools.components.listAddRemove.ListAddRemoveDropDownWebElement; import com.constellio.app.ui.tools.components.listAddRemove.ListAddRemoveLookupWebElement; import com.constellio.app.ui.tools.components.listAddRemove.ListAddRemoveTextFieldWebElement; import com.constellio.sdk.tests.ConstellioTest; import com.constellio.sdk.tests.annotations.UiTest; import com.constellio.sdk.tests.selenium.adapters.constellio.ConstellioWebDriver; import com.vaadin.data.Property; import com.vaadin.navigator.Navigator; import com.vaadin.navigator.View; import com.vaadin.navigator.ViewChangeListener.ViewChangeEvent; import com.vaadin.ui.Component; import com.vaadin.ui.Label; import com.vaadin.ui.VerticalLayout; import com.vaadin.ui.themes.ValoTheme; @UiTest public class ListAddRemoveFieldAcceptanceTest extends ConstellioTest { LocalDate date1 = new LocalDate(); LocalDate date2 = date1.minusDays(42); LocalDate date3 = date2.minusDays(42); ConstellioWebDriver driver; RecordVO dummyViewRecord; MetadataSchemaVO schema; String dummyPage = "dummyPage"; DummyView dummyView; @Before public void setUp() throws Exception { withSpiedServices(AppLayerFactory.class); prepareSystem( withZeCollection().withConstellioRMModule().withAllTestUsers() ); dummyView = new DummyView(); AppLayerFactory factory = getAppLayerFactory(); NavigatorConfigurationService navigatorConfigurationService = new NavigatorConfigurationService() { @Override public void configure(Navigator navigator) { super.configure(navigator); navigator.addView(dummyPage, dummyView); } }; when(factory.getNavigatorConfigurationService()).thenReturn(navigatorConfigurationService); driver = newWebDriver(loggedAsUserInCollection(admin, zeCollection)); } private static Map<Locale, String> asLocaleMap(String englishValue, String frenchValue) { Map<Locale, String> map = new HashMap<>(); map.put(Locale.ENGLISH, englishValue); map.put(Locale.FRENCH, frenchValue); return map; } @Test public void givenStringListForTextFieldThenControllableByWebElement() { DummyProperty<String> dummyStringProperty = new DummyProperty<String>(new ArrayList<String>()); ListAddRemoveTextField addRemoveTextField = new ListAddRemoveTextField(); addRemoveTextField.setPropertyDataSource(dummyStringProperty); addRemoveTextField.setStyleName("zeDisplay"); addRemoveTextField.setCaption("ListAddRemoveTextField"); dummyView.addListAddRemoveField(addRemoveTextField); driver.navigateTo().url(dummyPage); validateCanAddRemoveStringValuesIn("zeDisplay"); } @Test public void givenDateListForDateFieldThenControllableByWebElement() { DummyProperty<Date> dummyDateProperty = new DummyProperty<Date>(new ArrayList<Date>()); ListAddRemoveDateField addRemoveDateField = new ListAddRemoveDateField(); addRemoveDateField.setPropertyDataSource(dummyDateProperty); addRemoveDateField.setStyleName("zeDisplay"); addRemoveDateField.setCaption("ListAddRemoveDateField"); dummyView.addListAddRemoveField(addRemoveDateField); driver.navigateTo().url(dummyPage); validateCanAddRemoveDateValuesIn("zeDisplay"); } //@Test public void givenRecordLookupFieldThenControllableByWebElement() throws Exception { RMTestRecords records = new RMTestRecords(zeCollection).setup(getAppLayerFactory()); DummyProperty<String> dummyReferenceProperty = new DummyProperty<>(new ArrayList<String>()); ListAddRemoveRecordLookupField addRemoveLookupField = new ListAddRemoveRecordLookupField(FilingSpace.DEFAULT_SCHEMA); addRemoveLookupField.setPropertyDataSource(dummyReferenceProperty); addRemoveLookupField.setStyleName("zeDisplay"); addRemoveLookupField.setCaption("ListAddRemoveLookupField"); dummyView.addListAddRemoveField(addRemoveLookupField); driver.navigateTo().url(dummyPage); validateCanAddRemoveRecordsUsingLookupValuesIn("zeDisplay", records); } //@Test public void givenRecordComboboxThenControllableByWebElement() throws Exception { RMTestRecords records = new RMTestRecords(zeCollection).setup(getAppLayerFactory()); DummyProperty<String> dummyReferenceProperty = new DummyProperty<>(new ArrayList<String>()); ListAddRemoveRecordComboBox addRemoveLookupField = new ListAddRemoveRecordComboBox(RetentionRule.DEFAULT_SCHEMA); addRemoveLookupField.setPropertyDataSource(dummyReferenceProperty); addRemoveLookupField.setStyleName("zeDisplay"); addRemoveLookupField.setCaption("ListAddRemoveLookupField"); dummyView.addListAddRemoveField(addRemoveLookupField); driver.navigateTo().url(dummyPage); validateCanAddRemoveRecordsUsingDropDownValuesIn("zeDisplay", records); } @Test public void givenTwoListFieldsThenBothControllableByWebElement() { DummyProperty<String> dummyStringProperty = new DummyProperty<String>(new ArrayList<String>()); ListAddRemoveTextField addRemoveTextField = new ListAddRemoveTextField(); addRemoveTextField.setPropertyDataSource(dummyStringProperty); addRemoveTextField.setStyleName("stringList"); addRemoveTextField.setCaption("ListAddRemoveTextField"); dummyView.addListAddRemoveField(addRemoveTextField); DummyProperty<Date> dummyDateProperty = new DummyProperty<Date>(new ArrayList<Date>()); ListAddRemoveDateField addRemoveDateField = new ListAddRemoveDateField(); addRemoveDateField.setPropertyDataSource(dummyDateProperty); addRemoveDateField.setStyleName("dateList"); addRemoveDateField.setCaption("ListAddRemoveDateField"); dummyView.addListAddRemoveField(addRemoveDateField); driver.navigateTo().url(dummyPage); // validateCanAddRemoveStringValuesIn("stringList"); // validateCanAddRemoveDateValuesIn("dateList"); } private void validateCanAddRemoveStringValuesIn(String style) { ListAddRemoveTextFieldWebElement addRemoveField = new ListAddRemoveTextFieldWebElement(driver.find(style)); addRemoveField.setValue("Édouard"); addRemoveField.setValue("Chuck Norris"); addRemoveField.clickAdd(); assertThat(addRemoveField.getValues()).containsOnlyOnce("Chuck Norris"); addRemoveField.add("Dakota L'indien"); assertThat(addRemoveField.getValues()).containsExactly("Chuck Norris", "Dakota L'indien"); addRemoveField.modifyTo(1, "Édouard Lechat"); assertThat(addRemoveField.getValues()).containsExactly("Chuck Norris", "Édouard Lechat"); // addRemoveField.remove(1); // assertThat(addRemoveField.getValues()).containsOnlyOnce("Chuck Norris"); } private void validateCanAddRemoveDateValuesIn(String style) { ListAddRemoveDateFieldWebElement addRemoveField = new ListAddRemoveDateFieldWebElement(driver.find(style)); addRemoveField.getInputComponent().setValue(date2); addRemoveField.getInputComponent().setValue(date1); addRemoveField.clickAdd(); assertThat(addRemoveField.getValues()).containsOnlyOnce(date1.toString()); addRemoveField.getInputComponent().setValue(date2); addRemoveField.clickAdd(); assertThat(addRemoveField.getValues()).containsExactly(date1.toString(), date2.toString()); addRemoveField.clickModify(1); addRemoveField.getInputComponent().setValue(date3); addRemoveField.clickAdd(); assertThat(addRemoveField.getValues()).containsExactly(date1.toString(), date3.toString()); // addRemoveField.remove(1); // assertThat(addRemoveField.getValues()).containsOnlyOnce(date1.toString()); } private void validateCanAddRemoveRecordsUsingDropDownValuesIn(String style, RMTestRecords records) { ListAddRemoveDropDownWebElement addRemoveField = new ListAddRemoveDropDownWebElement(driver.find(style)); addRemoveField.add(records.getRule1().getTitle()); assertThat(addRemoveField.getValues()).containsOnlyOnce(records.getRule1().getTitle()); addRemoveField.add(records.getRule2().getTitle()); assertThat(addRemoveField.getValues()).containsExactly(records.getRule1().getTitle(), records.getRule2().getTitle()); addRemoveField.modify(0, records.getRule3().getTitle()); assertThat(addRemoveField.getValues()).containsExactly(records.getRule3().getTitle(), records.getRule2().getTitle()); addRemoveField.remove(1); assertThat(addRemoveField.getValues()).containsOnlyOnce(records.getRule3().getTitle()); } private void validateCanAddRemoveRecordsUsingLookupValuesIn(String style, RMTestRecords records) { ListAddRemoveLookupWebElement addRemoveField = new ListAddRemoveLookupWebElement(driver.find(style)); addRemoveField.addElementByChoosingFirstChoice(records.getRule1().getTitle()); assertThat(addRemoveField.getValues()).containsOnlyOnce(records.getRule1().getTitle()); addRemoveField.addElementByChoosingFirstChoice(records.getRule2().getTitle()); assertThat(addRemoveField.getValues()).containsExactly(records.getRule1().getTitle(), records.getRule2().getTitle()); addRemoveField.modifyElementByChoosingFirstChoice(0, records.getRule3().getTitle()); assertThat(addRemoveField.getValues()).containsExactly(records.getRule3().getTitle(), records.getRule2().getTitle()); addRemoveField.remove(1); assertThat(addRemoveField.getValues()).containsOnlyOnce(records.getRule3().getTitle()); } private class DummyProperty<T extends Serializable> implements Property<List<T>> { private List<T> value; public DummyProperty(List<T> value) { this.value = value; } @Override public List<T> getValue() { return value; } @Override public void setValue(List<T> newValue) throws com.vaadin.data.Property.ReadOnlyException { this.value = newValue; } @SuppressWarnings("unchecked") @Override public Class<? extends List<T>> getType() { return (Class) List.class; } @Override public boolean isReadOnly() { return false; } @Override public void setReadOnly(boolean newStatus) { if (newStatus) { throw new UnsupportedOperationException("Never read-only"); } } } public class DummyView extends BaseViewImpl implements View { private List<ListAddRemoveField<?, ?>> listAddRemoveFields = new ArrayList<ListAddRemoveField<?, ?>>(); public void addListAddRemoveField(ListAddRemoveField<?, ?> listAddRemoveField) { this.listAddRemoveFields.add(listAddRemoveField); } @Override protected String getTitle() { return "ListAddRemoveFieldAcceptanceTest"; } @Override protected Component buildMainComponent(ViewChangeEvent event) { System.out.println("session id > " + ConstellioUI.getCurrent().getSession().getSession().getId()); VerticalLayout mainLayout = new VerticalLayout(); mainLayout.setWidth("100%"); mainLayout.setSpacing(true); Label titleLabel = new Label(ListAddRemoveFieldAcceptanceTest.class.getSimpleName()); titleLabel.addStyleName(ValoTheme.LABEL_H1); mainLayout.addComponent(titleLabel); for (ListAddRemoveField<?, ?> listAddRemoveField : listAddRemoveFields) { listAddRemoveField.setWidth("100%"); mainLayout.addComponent(listAddRemoveField); } return mainLayout; } } }