package com.constellio.app.ui.acceptation.components; import static org.assertj.core.api.Assertions.assertThat; import static org.junit.Assert.fail; import static org.mockito.Matchers.any; import static org.mockito.Mockito.doThrow; import static org.mockito.Mockito.never; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; import java.util.Arrays; import java.util.HashMap; import java.util.Locale; import java.util.Map; import org.apache.commons.lang.exception.ExceptionUtils; import org.junit.Before; import org.junit.Test; import org.mockito.ArgumentCaptor; import org.mockito.Mock; 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.MetadataVO; import com.constellio.app.ui.entities.MetadataValueVO; import com.constellio.app.ui.entities.RecordVO; import com.constellio.app.ui.entities.RecordVO.VIEW_MODE; import com.constellio.app.ui.framework.components.RecordForm; import com.constellio.app.ui.pages.base.BaseViewImpl; import com.constellio.app.ui.tools.ApplicationRuntimeException; import com.constellio.app.ui.tools.RecordFormWebElement; import com.constellio.model.entities.schemas.MetadataValueType; import com.constellio.model.frameworks.validation.ValidationException; import com.constellio.sdk.tests.ConstellioTest; import com.constellio.sdk.tests.annotations.InDevelopmentTest; import com.constellio.sdk.tests.annotations.UiTest; import com.constellio.sdk.tests.selenium.adapters.constellio.ConstellioWebDriver; 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.VerticalLayout; @UiTest public class RecordFormAcceptanceTest extends ConstellioTest { private boolean throwExceptionOnDummyViewInit; boolean REQUIRED = true; boolean MULTIVALUE = true; boolean READONLY = true; boolean FACULTATIVE = false; boolean SINGLEVALUE = false; boolean READWRITE = false; String dummyPage = "dummyPage"; @Mock DummyViewPresenter presenter; @Mock DummyViewPresenter otherFormPresenter; ConstellioWebDriver driver; RecordVO dummyViewRecord; MetadataSchemaVO schema; @Before public void setUp() throws Exception { withSpiedServices(AppLayerFactory.class); prepareSystem( withZeCollection().withConstellioRMModule().withAllTestUsers() ); AppLayerFactory factory = getAppLayerFactory(); NavigatorConfigurationService navigatorConfigurationService = new NavigatorConfigurationService() { @Override public void configure(Navigator navigator) { super.configure(navigator); navigator.addView(dummyPage, new DummyView()); } }; when(factory.getNavigatorConfigurationService()).thenReturn(navigatorConfigurationService); driver = newWebDriver(loggedAsUserInCollection(admin, zeCollection)); schema = new MetadataSchemaVO("zeSchema", zeCollection, asLocaleMap("The schema", "Ze schema")); throwExceptionOnDummyViewInit = false; } @Test public void givenRequiredStringMetadataWhenSubmittedWithEmptyValueThenValidationFailAndSaveNeverCalledOnPresenter() throws Exception { MetadataVO metadata = new MetadataVO("m1", MetadataValueType.STRING, zeCollection, schema, REQUIRED, SINGLEVALUE, READWRITE, asLocaleMap("The m1", "Ze M1"), null, null, null, null, null, null, null, null, false); dummyViewRecord = new RecordVO("zeId", Arrays.asList(new MetadataValueVO(metadata)), VIEW_MODE.FORM); driver.navigateTo().url(dummyPage); RecordFormWebElement form = new RecordFormWebElement(driver.find("zeForm")); form.clickSaveButtonAndWaitForPageReload(); verify(presenter, never()).saveButtonClick(any(RecordVO.class)); //waitUntilICloseTheBrowsers(); } @Test public void givenOtherFormSelectedWhenClickButtonThenClickInSameForm() throws Exception { MetadataVO metadata = new MetadataVO("m1", MetadataValueType.STRING, zeCollection, schema, FACULTATIVE, SINGLEVALUE, READWRITE, asLocaleMap("The m1", "Ze M1"), null, null, null, null, null, null, null, null, false); dummyViewRecord = new RecordVO("zeId", Arrays.asList(new MetadataValueVO(metadata)), VIEW_MODE.FORM); driver.navigateTo().url(dummyPage); RecordFormWebElement otherForm = new RecordFormWebElement(driver.find("anotherForm")); otherForm.clickSaveButtonAndWaitForPageReload(); verify(otherFormPresenter).saveButtonClick(any(RecordVO.class)); } @Test public void givenFacultativeStringMetadataWhenSubmittedWithEmptyValueThenSaveCalledOnPresenter() throws Exception { MetadataVO metadata = new MetadataVO("m1", MetadataValueType.STRING, zeCollection, schema, FACULTATIVE, SINGLEVALUE, READWRITE, asLocaleMap("The m1", "Ze M1"), null, null, null, null, null, null, null, null, false); dummyViewRecord = new RecordVO("zeId", Arrays.asList(new MetadataValueVO(metadata)), VIEW_MODE.FORM); driver.navigateTo().url(dummyPage); RecordFormWebElement form = new RecordFormWebElement(driver.find("zeForm")); form.clickSaveButtonAndWaitForPageReload(); verify(presenter).saveButtonClick(any(RecordVO.class)); } //@Test public void givenUnexpectedRuntimeExceptionThrownByPresenterThen() throws Exception { RuntimeException runtimeException = new RuntimeException("Boom!"); doThrow(runtimeException).when(presenter).saveButtonClick(any(RecordVO.class)); MetadataVO metadata = new MetadataVO("m1", MetadataValueType.STRING, zeCollection, schema, FACULTATIVE, SINGLEVALUE, READWRITE, asLocaleMap("The m1", "Ze M1"), null, null, null, null, null, null, null, null, false); dummyViewRecord = new RecordVO("zeId", Arrays.asList(new MetadataValueVO(metadata)), VIEW_MODE.FORM); driver.navigateTo().url(dummyPage); RecordFormWebElement form = new RecordFormWebElement(driver.find("zeForm")); try { //Devrait détecter qu'une exception est lancer et à son tour lancer une exception form.clickSaveButtonAndWaitForPageReload(); //waitUntilICloseTheBrowsers(); fail("ApplicationRuntimeException expected"); } catch (ApplicationRuntimeException e) { String fullStackTrace = ExceptionUtils.getFullStackTrace(e); assertThat(fullStackTrace).contains("Boom!"); } } @Test public void givenViewThrowsAnExceptionUponInitalizationThenApplicationRuntimeExceptionThrown() throws Exception { throwExceptionOnDummyViewInit = true; try { driver.navigateTo().url(dummyPage); fail("ApplicationRuntimeException expected"); } catch (ApplicationRuntimeException e) { //OK } } @Test @InDevelopmentTest //TODO Vincent Ne passe plus public void whenModifyingValuesInFormThenSetInComponentsAndRetrievable() throws Exception { ArgumentCaptor<RecordVO> recordVOArgumentCaptor = ArgumentCaptor.forClass(RecordVO.class); MetadataVO metadata1 = new MetadataVO("metadata1", MetadataValueType.STRING, zeCollection, schema, FACULTATIVE, SINGLEVALUE, READWRITE, asLocaleMap("The m1", "Ze M1"), null, null, null, null, null, null, null, null, false); MetadataVO metadata2 = new MetadataVO("metadata2", MetadataValueType.STRING, zeCollection, schema, FACULTATIVE, SINGLEVALUE, READWRITE, asLocaleMap("The m2", "Ze M2"), null, null, null, null, null, null, null, null, false); MetadataValueVO metadata1Value = new MetadataValueVO(metadata1, "metadata1InitialValue"); MetadataValueVO metadata2Value = new MetadataValueVO(metadata2, "metadata2InitialValue"); dummyViewRecord = new RecordVO("zeId", Arrays.asList(metadata1Value, metadata2Value), VIEW_MODE.FORM); driver.navigateTo().url(dummyPage); RecordFormWebElement form = new RecordFormWebElement(driver.find("zeForm")); assertThat(form.getValue("metadata1")).isEqualTo("metadata1InitialValue"); assertThat(form.getValue("metadata2")).isEqualTo("metadata2InitialValue"); String newMetadata1Value = null; String newMetadata2Value = null; for (int i = 0; i < 10; i++) { newMetadata1Value = "metadata1ModifiedValue" + i; newMetadata2Value = "metadata2ModifiedValue" + i; form.setValue("metadata1", newMetadata1Value); form.setValue("metadata2", newMetadata2Value); assertThat(form.getValue("metadata1")).isEqualTo(newMetadata1Value); assertThat(form.getValue("metadata2")).isEqualTo(newMetadata2Value); } form.clickSaveButtonAndWaitForPageReload(); verify(presenter).saveButtonClick(recordVOArgumentCaptor.capture()); RecordVO receivedRecordVO = recordVOArgumentCaptor.getValue(); assertThat(receivedRecordVO.get("metadata1")).isEqualTo(newMetadata1Value); assertThat(receivedRecordVO.get("metadata2")).isEqualTo(newMetadata2Value); } //TODO Maxime //@Test public void whenModifyingReferenceValuesInFormThenSetInComponentsAndRetrievable() throws Exception { ArgumentCaptor<RecordVO> recordVOArgumentCaptor = ArgumentCaptor.forClass(RecordVO.class); MetadataVO metadata1 = new MetadataVO("metadata1", MetadataValueType.REFERENCE, zeCollection, schema, FACULTATIVE, SINGLEVALUE, READWRITE, asLocaleMap("The m1", "Ze M1"), null, null, null, null, null, null, null, null, false); MetadataVO metadata2 = new MetadataVO("metadata2", MetadataValueType.REFERENCE, zeCollection, schema, FACULTATIVE, SINGLEVALUE, READWRITE, asLocaleMap("The m2", "Ze M2"), null, null, null, null, null, null, null, null, false); MetadataValueVO metadata1Value = new MetadataValueVO(metadata1, "metadata1InitialValue"); MetadataValueVO metadata2Value = new MetadataValueVO(metadata2, "metadata2InitialValue"); dummyViewRecord = new RecordVO("zeId", Arrays.asList(metadata1Value, metadata2Value), VIEW_MODE.FORM); driver.navigateTo().url(dummyPage); RecordFormWebElement form = new RecordFormWebElement(driver.find("zeForm")); assertThat(form.getValue("metadata1")).isEqualTo("metadata1InitialValue"); assertThat(form.getValue("metadata2")).isEqualTo("metadata2InitialValue"); String newMetadata1Value = null; String newMetadata2Value = null; for (int i = 0; i < 10; i++) { newMetadata1Value = "metadata1ModifiedValue" + i; newMetadata2Value = "metadata2ModifiedValue" + i; form.setValue("metadata1", newMetadata1Value); form.setValue("metadata2", newMetadata2Value); assertThat(form.getValue("metadata1")).isEqualTo(newMetadata1Value); assertThat(form.getValue("metadata2")).isEqualTo(newMetadata2Value); } form.clickSaveButtonAndWaitForPageReload(); verify(presenter).saveButtonClick(recordVOArgumentCaptor.capture()); RecordVO receivedRecordVO = recordVOArgumentCaptor.getValue(); assertThat(receivedRecordVO.get("metadata1")).isEqualTo(newMetadata1Value); assertThat(receivedRecordVO.get("metadata2")).isEqualTo(newMetadata2Value); } /* @Test public void a() throws Exception { givenFacultativeStringMetadataWhenSubmittedWithEmptyValueThenSaveCalledOnPresenter(); } @Test public void b() throws Exception { givenFacultativeStringMetadataWhenSubmittedWithEmptyValueThenSaveCalledOnPresenter(); } @Test public void c() throws Exception { givenFacultativeStringMetadataWhenSubmittedWithEmptyValueThenSaveCalledOnPresenter(); } @Test public void d() throws Exception { givenFacultativeStringMetadataWhenSubmittedWithEmptyValueThenSaveCalledOnPresenter(); } @Test public void e() throws Exception { givenFacultativeStringMetadataWhenSubmittedWithEmptyValueThenSaveCalledOnPresenter(); } @Test public void f() throws Exception { givenFacultativeStringMetadataWhenSubmittedWithEmptyValueThenSaveCalledOnPresenter(); } @Test public void g() throws Exception { givenFacultativeStringMetadataWhenSubmittedWithEmptyValueThenSaveCalledOnPresenter(); } @Test public void h() throws Exception { givenFacultativeStringMetadataWhenSubmittedWithEmptyValueThenSaveCalledOnPresenter(); } @Test public void i() throws Exception { givenFacultativeStringMetadataWhenSubmittedWithEmptyValueThenSaveCalledOnPresenter(); } @Test public void j() throws Exception { givenFacultativeStringMetadataWhenSubmittedWithEmptyValueThenSaveCalledOnPresenter(); } @Test public void k() throws Exception { givenFacultativeStringMetadataWhenSubmittedWithEmptyValueThenSaveCalledOnPresenter(); } @Test public void l() throws Exception { givenFacultativeStringMetadataWhenSubmittedWithEmptyValueThenSaveCalledOnPresenter(); } @Test public void m() throws Exception { givenFacultativeStringMetadataWhenSubmittedWithEmptyValueThenSaveCalledOnPresenter(); } @Test public void n() throws Exception { givenFacultativeStringMetadataWhenSubmittedWithEmptyValueThenSaveCalledOnPresenter(); } @Test public void o() throws Exception { givenFacultativeStringMetadataWhenSubmittedWithEmptyValueThenSaveCalledOnPresenter(); } @Test public void p() throws Exception { givenFacultativeStringMetadataWhenSubmittedWithEmptyValueThenSaveCalledOnPresenter(); } @Test public void q() throws Exception { givenFacultativeStringMetadataWhenSubmittedWithEmptyValueThenSaveCalledOnPresenter(); } @Test public void r() throws Exception { givenFacultativeStringMetadataWhenSubmittedWithEmptyValueThenSaveCalledOnPresenter(); } @Test public void s() throws Exception { givenFacultativeStringMetadataWhenSubmittedWithEmptyValueThenSaveCalledOnPresenter(); } @Test public void t() throws Exception { givenFacultativeStringMetadataWhenSubmittedWithEmptyValueThenSaveCalledOnPresenter(); } @Test public void u() throws Exception { givenFacultativeStringMetadataWhenSubmittedWithEmptyValueThenSaveCalledOnPresenter(); } @Test public void v() throws Exception { givenFacultativeStringMetadataWhenSubmittedWithEmptyValueThenSaveCalledOnPresenter(); } @Test public void w() throws Exception { givenFacultativeStringMetadataWhenSubmittedWithEmptyValueThenSaveCalledOnPresenter(); } @Test public void x() throws Exception { givenFacultativeStringMetadataWhenSubmittedWithEmptyValueThenSaveCalledOnPresenter(); } @Test public void y() throws Exception { givenFacultativeStringMetadataWhenSubmittedWithEmptyValueThenSaveCalledOnPresenter(); } @Test public void z() throws Exception { givenFacultativeStringMetadataWhenSubmittedWithEmptyValueThenSaveCalledOnPresenter(); } */ 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; } private static class DummyViewPresenter { protected void saveButtonClick(RecordVO record) throws ValidationException { } protected void cancelButtonClick(RecordVO record) { } } public class DummyView extends BaseViewImpl implements View { @Override protected String getTitle() { return "RecordFormAcceptanceTest"; } @Override protected Component buildMainComponent(ViewChangeEvent event) { if (throwExceptionOnDummyViewInit) { throw new RuntimeException("throwExceptionOnDummyViewInit"); } System.out.println("session id > " + ConstellioUI.getCurrent().getSession().getSession().getId()); VerticalLayout verticalLayout = new VerticalLayout(); RecordForm anotherForm = new RecordForm(dummyViewRecord) { @Override protected void saveButtonClick(RecordVO record) throws ValidationException { simulateLatency(); otherFormPresenter.saveButtonClick(record); } @Override protected void cancelButtonClick(RecordVO record) { simulateLatency(); otherFormPresenter.cancelButtonClick(record); } }; RecordForm form = new RecordForm(dummyViewRecord) { @Override protected void saveButtonClick(RecordVO record) throws ValidationException { simulateLatency(); presenter.saveButtonClick(record); } @Override protected void cancelButtonClick(RecordVO record) { simulateLatency(); presenter.cancelButtonClick(record); } }; anotherForm.addStyleName("anotherForm"); verticalLayout.addComponent(anotherForm); form.addStyleName("zeForm"); verticalLayout.addComponent(form); return verticalLayout; } } private void simulateLatency() { try { Thread.sleep(400); } catch (InterruptedException e) { throw new RuntimeException(e); } } }