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.Mockito.inOrder;
import static org.mockito.Mockito.when;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import org.junit.Before;
import org.junit.Test;
import org.mockito.InOrder;
import org.mockito.Mock;
import org.vaadin.dialogs.ConfirmDialog;
import com.constellio.app.modules.rm.wrappers.AdministrativeUnit;
import com.constellio.app.modules.rm.wrappers.FilingSpace;
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.VIEW_MODE;
import com.constellio.app.ui.framework.builders.MetadataSchemaToVOBuilder;
import com.constellio.app.ui.framework.builders.RecordToVOBuilder;
import com.constellio.app.ui.framework.buttons.ConfirmDialogButton;
import com.constellio.app.ui.framework.buttons.DeleteButton;
import com.constellio.app.ui.framework.buttons.DisableButton;
import com.constellio.app.ui.framework.buttons.DisplayButton;
import com.constellio.app.ui.framework.buttons.EditButton;
import com.constellio.app.ui.framework.buttons.EnableButton;
import com.constellio.app.ui.framework.buttons.IconButton;
import com.constellio.app.ui.framework.containers.ButtonsContainer;
import com.constellio.app.ui.framework.containers.ButtonsContainer.ContainerButton;
import com.constellio.app.ui.framework.containers.RecordVOLazyContainer;
import com.constellio.app.ui.framework.data.RecordVODataProvider;
import com.constellio.app.ui.pages.base.BaseViewImpl;
import com.constellio.app.ui.pages.base.SessionContext;
import com.constellio.app.ui.tools.RecordContainerWebElement;
import com.constellio.app.ui.tools.RecordContainerWebElementRuntimeException.RecordContainerWebElementRuntimeException_NoSuchRowWithValueInColumn;
import com.constellio.model.entities.records.Transaction;
import com.constellio.model.entities.schemas.MetadataSchema;
import com.constellio.model.entities.schemas.MetadataSchemaTypes;
import com.constellio.model.services.factories.ModelLayerFactory;
import com.constellio.model.services.records.RecordServices;
import com.constellio.model.services.records.RecordServicesException;
import com.constellio.model.services.schemas.MetadataSchemasManager;
import com.constellio.model.services.search.query.logical.LogicalSearchQuery;
import com.constellio.model.services.search.query.logical.LogicalSearchQueryOperators;
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.data.Container;
import com.vaadin.navigator.Navigator;
import com.vaadin.navigator.View;
import com.vaadin.navigator.ViewChangeListener.ViewChangeEvent;
import com.vaadin.server.ThemeResource;
import com.vaadin.ui.Button;
import com.vaadin.ui.Component;
import com.vaadin.ui.Table;
import com.vaadin.ui.VerticalLayout;
@InDevelopmentTest
@UiTest
public class RecordContainerAcceptanceTest extends ConstellioTest {
private static final String PROPERTY_BUTTONS_1 = "buttons1";
private static final String PROPERTY_BUTTONS_2 = "buttons2";
private static final String CUSTOM_ICON_BUTTON_STYLE = "customIconButton";
private static final String CUSTOM_CONFIRM_BUTTON_STYLE = "customConfirmButton";
MetadataSchemaTypes schemaTypes;
MetadataSchema filingSpaceSchema, administrativeUnitSchema;
String dummyPage = "dummyPage";
@Mock DummyViewPresenter presenter, anotherPresenter;
ConstellioWebDriver driver;
RecordServices recordServices;
ModelLayerFactory modelLayerFactory;
SessionContext sessionContext;
@Before
public void setUp()
throws Exception {
withSpiedServices(AppLayerFactory.class);
prepareSystem(
withZeCollection().withConstellioRMModule().withAllTestUsers()
);
inCollection(zeCollection).giveWriteAndDeleteAccessTo(dakota);
modelLayerFactory = getModelLayerFactory();
recordServices = modelLayerFactory.newRecordServices();
schemaTypes = modelLayerFactory.getMetadataSchemasManager().getSchemaTypes(zeCollection);
filingSpaceSchema = schemaTypes.getSchema(FilingSpace.DEFAULT_SCHEMA);
administrativeUnitSchema = schemaTypes.getSchema(AdministrativeUnit.DEFAULT_SCHEMA);
given200FilingSpaces();
given200AdministrativeUnits();
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);
sessionContext = loggedAsUserInCollection(dakota, zeCollection);
driver = newWebDriver(loggedAsUserInCollection(dakota, zeCollection));
}
@Test
public void givenRecordContainerThenCanClickOnAllButtons()
throws Exception {
driver.navigateTo().url(dummyPage);
RecordContainerWebElement zeTable = new RecordContainerWebElement(driver.find("zeTable"));
zeTable.getRow(0).clickButton(DisplayButton.BUTTON_STYLE);
zeTable.getRow(1).clickButtonAndConfirm(DeleteButton.BUTTON_STYLE);
zeTable.getRow(2).clickButton(EditButton.BUTTON_STYLE);
zeTable.getRow(3).clickButtonAndConfirm(DisableButton.BUTTON_STYLE);
zeTable.getRow(4).clickButtonAndConfirm(EnableButton.BUTTON_STYLE);
zeTable.getRow(5).clickButton(CUSTOM_ICON_BUTTON_STYLE);
zeTable.getRow(6).clickButtonAndConfirm(CUSTOM_CONFIRM_BUTTON_STYLE);
zeTable.getRow(6).clickButton(EditButton.BUTTON_STYLE);
zeTable.getRow(7).clickButton(DisplayButton.BUTTON_STYLE);
zeTable.getRow(8).clickButtonAndConfirm(DeleteButton.BUTTON_STYLE);
zeTable.getRow(4).clickButtonAndConfirm(EnableButton.BUTTON_STYLE);
zeTable.getRow(3).clickButtonAndConfirm(DisableButton.BUTTON_STYLE);
zeTable.getRow(6).clickButtonAndConfirm(CUSTOM_CONFIRM_BUTTON_STYLE);
zeTable.getRow(5).clickButton(CUSTOM_ICON_BUTTON_STYLE);
InOrder inOrder = inOrder(presenter);
inOrder.verify(presenter).displayButtonClick(0);
inOrder.verify(presenter).deleteButtonClick(1);
inOrder.verify(presenter).editButtonClick(2);
inOrder.verify(presenter).disableButtonClick(3);
inOrder.verify(presenter).enableButtonClick(4);
inOrder.verify(presenter).customButtonClick(5);
inOrder.verify(presenter).customConfirmButtonClick(6);
inOrder.verify(presenter).editButtonClick(6);
inOrder.verify(presenter).displayButtonClick(7);
inOrder.verify(presenter).deleteButtonClick(8);
inOrder.verify(presenter).enableButtonClick(4);
inOrder.verify(presenter).disableButtonClick(3);
inOrder.verify(presenter).customConfirmButtonClick(6);
inOrder.verify(presenter).customButtonClick(5);
}
//TODO Vincent
//@Test
public void given2RecordContainersThenCanRetrieveRowsInformationOfBoth()
throws Exception {
driver.navigateTo().url(dummyPage);
// waitUntilICloseTheBrowsers();
RecordContainerWebElement zeTable = new RecordContainerWebElement(driver.find("zeTable"));
assertThat(zeTable.getHeaderTitles()).containsOnly("Code", "Titre", PROPERTY_BUTTONS_1);
assertThat(zeTable.getRow(0)).isNotNull();
assertThat(zeTable.getRow(0).getValueInColumn(0)).isEqualTo("F1");
assertThat(zeTable.getRow(0).getValueInColumn(1)).isEqualTo("The description of Filing space #1");
assertThat(zeTable.getRow(1).getValueInColumn(0)).isEqualTo("F2");
assertThat(zeTable.getRow(1).getValueInColumn(1)).isEqualTo("The description of Filing space #2");
assertThat(zeTable.getRow(8).getValueInColumn(0)).isEqualTo("F9");
assertThat(zeTable.getRow(8).getValueInColumn(1)).isEqualTo("The description of Filing space #9");
assertThat(zeTable.getFirstRowWithValueInColumn("F12", 0).getIndex()).isEqualTo(11);
assertThat(zeTable.getFirstRowWithValueInColumn("The description of Filing space #6", 1).getValueInColumn(0))
.isEqualTo("F6");
try {
zeTable.getFirstRowWithValueInColumn("X10", 0);
fail("RecordContainerWebElementRuntimeException_NoSuchRowWithValueInColumn expected");
} catch (RecordContainerWebElementRuntimeException_NoSuchRowWithValueInColumn e) {
//OK
}
assertThat(zeTable.hasRowWithValueInColumn("F4", 0)).isTrue();
assertThat(zeTable.hasRowWithValueInColumn("F4", 1)).isFalse();
RecordContainerWebElement anotherTable = new RecordContainerWebElement(driver.find("anotherTable"));
assertThat(anotherTable.getHeaderTitles()).containsOnly("Code", "Titre", PROPERTY_BUTTONS_2);
assertThat(anotherTable.getRow(0)).isNotNull();
assertThat(anotherTable.getRow(0).getValueInColumn(0)).isEqualTo("A1");
assertThat(anotherTable.getRow(0).getValueInColumn(1)).isEqualTo("The description of Administrative unit #1");
assertThat(anotherTable.getRow(1).getValueInColumn(0)).isEqualTo("A2");
assertThat(anotherTable.getRow(1).getValueInColumn(1)).isEqualTo("The description of Administrative unit #2");
assertThat(anotherTable.getRow(8).getValueInColumn(0)).isEqualTo("A9");
assertThat(anotherTable.getRow(8).getValueInColumn(1)).isEqualTo("The description of Administrative unit #9");
assertThat(anotherTable.getFirstRowWithValueInColumn("A12", 0).getIndex()).isEqualTo(11);
assertThat(anotherTable.getFirstRowWithValueInColumn("The description of Administrative unit #6", 1).getValueInColumn(0))
.isEqualTo("A6");
// waitUntilICloseTheBrowsers();
}
@Test
public void given2RecordContainersThenCanClickOnEditAndRemoveButtons()
throws Exception {
driver.navigateTo().url(dummyPage);
RecordContainerWebElement zeTable = new RecordContainerWebElement(driver.find("zeTable"));
zeTable.getRow(0).clickButton(DisplayButton.BUTTON_STYLE);
zeTable.getRow(1).clickButtonAndConfirm(DeleteButton.BUTTON_STYLE);
// waitUntilICloseTheBrowsers();
zeTable.getRow(2).clickButton(EditButton.BUTTON_STYLE);
zeTable.getRow(6).clickButton(EditButton.BUTTON_STYLE);
zeTable.getRow(7).clickButton(DisplayButton.BUTTON_STYLE);
zeTable.getRow(8).clickButtonAndConfirm(DeleteButton.BUTTON_STYLE);
RecordContainerWebElement anotherTable = new RecordContainerWebElement(driver.find("anotherTable"));
anotherTable.getRow(4).clickButton(DisplayButton.BUTTON_STYLE);
anotherTable.getRow(5).clickButton(EditButton.BUTTON_STYLE);
anotherTable.getRow(6).clickButtonAndConfirm(DeleteButton.BUTTON_STYLE);
InOrder inOrder = inOrder(presenter, anotherPresenter);
inOrder.verify(presenter).displayButtonClick(0);
inOrder.verify(presenter).deleteButtonClick(1);
inOrder.verify(presenter).editButtonClick(2);
inOrder.verify(presenter).editButtonClick(6);
inOrder.verify(presenter).displayButtonClick(7);
inOrder.verify(presenter).deleteButtonClick(8);
inOrder.verify(anotherPresenter).displayButtonClick(4);
inOrder.verify(anotherPresenter).editButtonClick(5);
inOrder.verify(anotherPresenter).deleteButtonClick(6);
}
//---------------------------------------------------------------
private void given200AdministrativeUnits() {
Transaction transaction = new Transaction();
for (int i = 0; i < 200; i++) {
AdministrativeUnit administrativeUnit = new AdministrativeUnit(
recordServices.newRecordWithSchema(administrativeUnitSchema), schemaTypes);
administrativeUnit.setCode("A" + (i + 1));
administrativeUnit.setTitle("Administrative unit #" + (i + 1));
administrativeUnit.setTitle("The description of Administrative unit #" + (i + 1));
transaction.add(administrativeUnit.getWrappedRecord());
}
try {
recordServices.execute(transaction);
} catch (RecordServicesException e) {
throw new RuntimeException(e);
}
}
private void given200FilingSpaces() {
Transaction transaction = new Transaction();
for (int i = 0; i < 200; i++) {
FilingSpace filingSpace = new FilingSpace(recordServices.newRecordWithSchema(filingSpaceSchema), schemaTypes);
filingSpace.setCode("F" + (i + 1));
filingSpace.setTitle("Filing space #" + (i + 1));
filingSpace.setTitle("The description of Filing space #" + (i + 1));
transaction.add(filingSpace.getWrappedRecord());
}
try {
recordServices.execute(transaction);
} catch (RecordServicesException e) {
throw new RuntimeException(e);
}
}
private static class DummyViewPresenter implements Serializable {
protected void displayButtonClick(Object itemId) {
System.err.println("Display : " + itemId);
}
protected void editButtonClick(Object itemId) {
System.err.println("Edit : " + itemId);
}
protected void deleteButtonClick(Object itemId) {
System.err.println("Delete : " + itemId);
}
protected void enableButtonClick(Object itemId) {
System.err.println("Enable : " + itemId);
}
protected void disableButtonClick(Object itemId) {
System.err.println("Disable : " + itemId);
}
protected void customButtonClick(Object itemId) {
System.err.println("Custom : " + itemId);
}
protected void customConfirmButtonClick(Object itemId) {
System.err.println("Custom confirm : " + itemId);
}
}
@SuppressWarnings("serial")
public class DummyView extends BaseViewImpl implements View {
public DummyView() {
super();
}
@Override
protected String getTitle() {
return "RecordContainerAcceptanceTest";
}
@Override
protected Component buildMainComponent(ViewChangeEvent event) {
System.out.println("session id > " + ConstellioUI.getCurrent().getSession().getSession().getId());
VerticalLayout verticalLayout = new VerticalLayout();
Table zeTable = new Table("zeTable", newAllRecordsContainer(filingSpaceSchema, presenter, PROPERTY_BUTTONS_1));
Table anotherTable = new Table("anotherTable",
newAllRecordsContainer(administrativeUnitSchema, anotherPresenter, PROPERTY_BUTTONS_2));
zeTable.addStyleName("zeTable");
verticalLayout.addComponent(zeTable);
anotherTable.addStyleName("anotherTable");
verticalLayout.addComponent(anotherTable);
return verticalLayout;
}
private Container newAllRecordsContainer(MetadataSchema schema, final DummyViewPresenter tablePresenter,
String buttonsLabel) {
Container recordsContainer = new RecordVOLazyContainer(getAllRecordsDataProvider(schema));
final ButtonsContainer<?> buttonsContainer = new ButtonsContainer(recordsContainer, buttonsLabel);
buttonsContainer.addButton(new ContainerButton() {
@Override
protected Button newButtonInstance(final Object itemId, ButtonsContainer<?> buttonsContainer) {
return new DisplayButton() {
@Override
protected void buttonClick(ClickEvent event) {
tablePresenter.displayButtonClick(itemId);
}
};
}
});
buttonsContainer.addButton(new ContainerButton() {
@Override
protected Button newButtonInstance(final Object itemId, ButtonsContainer<?> buttonsContainer) {
return new EditButton() {
@Override
protected void buttonClick(ClickEvent event) {
tablePresenter.editButtonClick(itemId);
}
};
}
});
buttonsContainer.addButton(new ContainerButton() {
@Override
protected Button newButtonInstance(final Object itemId, ButtonsContainer<?> buttonsContainer) {
return new DeleteButton() {
@Override
protected void confirmButtonClick(ConfirmDialog dialog) {
tablePresenter.deleteButtonClick(itemId);
}
};
}
});
buttonsContainer.addButton(new ContainerButton() {
@Override
protected Button newButtonInstance(final Object itemId, ButtonsContainer<?> buttonsContainer) {
return new DisableButton() {
@Override
protected void confirmButtonClick(ConfirmDialog dialog) {
tablePresenter.disableButtonClick(itemId);
}
};
}
});
buttonsContainer.addButton(new ContainerButton() {
@Override
protected Button newButtonInstance(final Object itemId, ButtonsContainer<?> buttonsContainer) {
return new EnableButton() {
@Override
protected void confirmButtonClick(ConfirmDialog dialog) {
tablePresenter.enableButtonClick(itemId);
}
};
}
});
buttonsContainer.addButton(new ContainerButton() {
@Override
protected Button newButtonInstance(final Object itemId, ButtonsContainer<?> buttonsContainer) {
Button customIconButton = new IconButton(new ThemeResource("images/commun/permission.gif"), "Test") {
@Override
protected void buttonClick(ClickEvent event) {
tablePresenter.customButtonClick(itemId);
}
};
customIconButton.addStyleName(CUSTOM_ICON_BUTTON_STYLE);
return customIconButton;
}
});
buttonsContainer.addButton(new ContainerButton() {
@Override
protected Button newButtonInstance(final Object itemId, ButtonsContainer<?> buttonsContainer) {
Button customConfirmButton = new ConfirmDialogButton(new ThemeResource("images/commun/infobulle.gif"),
"Test") {
@Override
protected String getConfirmDialogMessage() {
return "Confirmer ceci?";
}
@Override
protected void confirmButtonClick(ConfirmDialog dialog) {
tablePresenter.customConfirmButtonClick(itemId);
}
};
customConfirmButton.addStyleName(CUSTOM_CONFIRM_BUTTON_STYLE);
return customConfirmButton;
}
});
return buttonsContainer;
}
private RecordVODataProvider getAllRecordsDataProvider(MetadataSchema schema) {
List<String> metadataCodes = new ArrayList<String>();
metadataCodes.add(schema.getMetadata("id").getCode());
metadataCodes.add(schema.getMetadata("code").getCode());
metadataCodes.add(schema.getMetadata("title").getCode());
final MetadataSchemaVO schemaVO = new MetadataSchemaToVOBuilder()
.build(schema, VIEW_MODE.TABLE, metadataCodes, sessionContext);
RecordToVOBuilder voBuilder = new RecordToVOBuilder();
return new RecordVODataProvider(schemaVO, voBuilder, modelLayerFactory) {
@Override
protected LogicalSearchQuery getQuery() {
String collection = schemaVO.getCollection();
String schemaCode = schemaVO.getCode();
MetadataSchemasManager metadataSchemasManager = modelLayerFactory.getMetadataSchemasManager();
MetadataSchema schema = metadataSchemasManager.getSchemaTypes(collection).getSchema(schemaCode);
return new LogicalSearchQuery(LogicalSearchQueryOperators.from(schema).returnAll());
}
};
}
}
}