package com.constellio.app.ui.pages.management.schemas.schema;
import static com.constellio.app.ui.i18n.i18n.$;
import static com.constellio.sdk.tests.schemas.TestsSchemasSetup.whichIsEnabled;
import static com.constellio.sdk.tests.schemas.TestsSchemasSetup.whichIsMultivalue;
import static com.constellio.sdk.tests.schemas.TestsSchemasSetup.whichIsSearchable;
import static com.constellio.sdk.tests.schemas.TestsSchemasSetup.whichIsSortable;
import static org.assertj.core.api.Assertions.assertThat;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import java.util.HashMap;
import java.util.Map;
import com.constellio.app.entities.schemasDisplay.SchemaTypeDisplayConfig;
import com.constellio.app.services.schemasDisplay.SchemasDisplayManager;
import org.junit.Before;
import org.junit.Test;
import org.mockito.Mock;
import com.constellio.app.ui.application.NavigatorConfigurationService;
import com.constellio.app.ui.entities.FormMetadataSchemaVO;
import com.constellio.app.ui.params.ParamUtils;
import com.constellio.model.entities.Language;
import com.constellio.model.entities.schemas.MetadataSchemasRuntimeException;
import com.constellio.model.services.schemas.MetadataSchemasManager;
import com.constellio.sdk.tests.ConstellioTest;
import com.constellio.sdk.tests.FakeSessionContext;
import com.constellio.sdk.tests.MockedNavigation;
import com.constellio.sdk.tests.schemas.TestsSchemasSetup;
import com.constellio.sdk.tests.schemas.TestsSchemasSetup.ZeCustomSchemaMetadatas;
import com.constellio.sdk.tests.schemas.TestsSchemasSetup.ZeSchemaMetadatas;
public class AddEditSchemaPresenterAcceptTest extends ConstellioTest {
TestsSchemasSetup setup = new TestsSchemasSetup(zeCollection);
ZeSchemaMetadatas zeSchema = setup.new ZeSchemaMetadatas();
ZeCustomSchemaMetadatas zeCustomSchema = setup.new ZeCustomSchemaMetadatas();
AddEditSchemaPresenter presenter;
MetadataSchemasManager metadataSchemasManager;
SchemasDisplayManager metadataSchemasDisplayManager;
Map<String, String> parameters;
@Mock AddEditSchemaView view;
MockedNavigation navigator;
String language;
@Before
public void setUp()
throws Exception {
prepareSystem(
withZeCollection()
);
navigator = new MockedNavigation();
defineSchemasManager()
.using(setup.andCustomSchema().withAStringMetadataInCustomSchema(whichIsMultivalue, whichIsSearchable)
.withAStringMetadata(whichIsSortable, whichIsEnabled).withABooleanMetadata(whichIsEnabled)
.withADateMetadata(whichIsEnabled));
metadataSchemasManager = getModelLayerFactory().getMetadataSchemasManager();
metadataSchemasDisplayManager = getAppLayerFactory().getMetadataSchemasDisplayManager();
when(view.getSessionContext()).thenReturn(FakeSessionContext.adminInCollection(zeCollection));
when(view.getCollection()).thenReturn(zeCollection);
when(view.getConstellioFactories()).thenReturn(getConstellioFactories());
when(view.navigate()).thenReturn(navigator);
language = FakeSessionContext.adminInCollection(zeCollection).getCurrentLocale().getLanguage();
presenter = new AddEditSchemaPresenter(view);
parameters = new HashMap<>();
parameters.put("schemaTypeCode", setup.zeCustomSchemaTypeCode());
}
@Test
public void givenSchemaCodeWhenSetParametersThenEditMode()
throws Exception {
parameters.put("schemaCode", zeSchema.code());
presenter.setParameters(parameters);
assertThat(presenter.isEditMode()).isTrue();
}
@Test
public void givenNoSchemaCodeWhenSetParametersThenAddMode()
throws Exception {
presenter.setParameters(parameters);
assertThat(presenter.isEditMode()).isFalse();
}
@Test
public void givenAddModeWhenSaveButtonClickedThenCustomSchema()
throws Exception {
presenter.setParameters(parameters);
FormMetadataSchemaVO formMetadataSchemaVO = new FormMetadataSchemaVO(FakeSessionContext.adminInCollection(zeCollection));
formMetadataSchemaVO.setLocalCode("newSchema");
formMetadataSchemaVO.addLabel(language, "new schema Label");
presenter.setSchemaVO(formMetadataSchemaVO);
presenter.saveButtonClicked();
assertThat(metadataSchemasManager.getSchemaTypes(zeCollection).getSchema("zeSchemaType_USRnewSchema")
.getLabel(Language.French))
.isEqualTo(
"new schema Label");
String params = ParamUtils.addParams(NavigatorConfigurationService.DISPLAY_SCHEMA, parameters);
verify(view.navigate().to()).listSchema(params);
}
@Test(expected=MetadataSchemasRuntimeException.NoSuchSchema.class)
public void givenCodeWithSpaceWhenSaveButtonClickedThenErrorAndSchemaNotCreated()
throws Exception {
presenter.setParameters(parameters);
FormMetadataSchemaVO formMetadataSchemaVO = new FormMetadataSchemaVO(FakeSessionContext.adminInCollection(zeCollection));
formMetadataSchemaVO.setLocalCode("new Schema");
formMetadataSchemaVO.addLabel(language, "new schema Label");
presenter.setSchemaVO(formMetadataSchemaVO);
presenter.saveButtonClicked();
verify(view).showErrorMessage($("AddEditSchemaView.schemaCodeContainsSpace"));
metadataSchemasManager.getSchemaTypes(zeCollection).getSchema("zeSchemaType_USRnewSchema");
}
@Test(expected=MetadataSchemasRuntimeException.NoSuchSchema.class)
public void givenCodeStartingWithNumberWhenSaveButtonClickedThenErrorAndSchemaNotCreated()
throws Exception {
presenter.setParameters(parameters);
FormMetadataSchemaVO formMetadataSchemaVO = new FormMetadataSchemaVO(FakeSessionContext.adminInCollection(zeCollection));
formMetadataSchemaVO.setLocalCode("3newSchema");
formMetadataSchemaVO.addLabel(language, "new schema Label");
presenter.setSchemaVO(formMetadataSchemaVO);
presenter.saveButtonClicked();
verify(view).showErrorMessage($("AddEditSchemaView.schemaCodeStartsWithNumber"));
metadataSchemasManager.getSchemaTypes(zeCollection).getSchema("zeSchemaType_USRnewSchema");
}
@Test
public void givenEditModeWhenSaveButtonClickedThenCustomSchema()
throws Exception {
parameters.put("schemaCode", zeSchema.code());
presenter.setParameters(parameters);
FormMetadataSchemaVO formMetadataSchemaVO = new FormMetadataSchemaVO(zeSchema.code(), zeCollection, new HashMap<String, String>());
formMetadataSchemaVO.addLabel(language, "new schema Label");
presenter.setSchemaVO(formMetadataSchemaVO);
presenter.saveButtonClicked();
assertThat(metadataSchemasManager.getSchemaTypes(zeCollection).getSchema(zeSchema.code()).getLabel(Language.French))
.isEqualTo(
"new schema Label");
String params = ParamUtils.addParams(NavigatorConfigurationService.DISPLAY_SCHEMA, parameters);
verify(view.navigate().to()).listSchema(params);
}
@Test
public void givenEditModeWhenSaveButtonClickedThenCustomSchemaTypeDisplay()
throws Exception {
parameters.put("schemaCode", zeSchema.code());
parameters.put("schemaTypeCode", zeSchema.type().getCode());
presenter.setParameters(parameters);
assertThat(metadataSchemasDisplayManager.getType(zeCollection, zeSchema.type().getCode()).isAdvancedSearch())
.isEqualTo(
Boolean.FALSE);
FormMetadataSchemaVO formMetadataSchemaVO = new FormMetadataSchemaVO(zeSchema.code(), zeCollection, new HashMap<String, String>());
formMetadataSchemaVO.setAdvancedSearch(true);
presenter.setSchemaVO(formMetadataSchemaVO);
presenter.saveButtonClicked();
SchemaTypeDisplayConfig schemaTypeDisplayConfig = metadataSchemasDisplayManager.getType(zeCollection, zeSchema.type().getCode());
assertThat(metadataSchemasDisplayManager.getType(zeCollection, zeSchema.type().getCode()).isAdvancedSearch())
.isEqualTo(
Boolean.TRUE);
String params = ParamUtils.addParams(NavigatorConfigurationService.DISPLAY_SCHEMA, parameters);
verify(view.navigate().to()).listSchema(params);
}
@Test
public void whenCancelButtonClickedThenNavigateToListSchemas()
throws Exception {
presenter.setParameters(parameters);
presenter.cancelButtonClicked();
String params = ParamUtils.addParams(NavigatorConfigurationService.DISPLAY_SCHEMA, parameters);
verify(view.navigate().to()).listSchema(params);
}
@Test
public void whenAddModeThenCodeEditable()
throws Exception {
presenter.setParameters(parameters);
assertThat(presenter.isCodeEditable()).isTrue();
}
@Test
public void givenCustomSchemaWhenEditModeThenCodeEditable()
throws Exception {
parameters.put("schemaCode", zeCustomSchema.code());
presenter.setParameters(parameters);
assertThat(presenter.isCodeEditable()).isTrue();
}
@Test
public void givenDefaultSchemaWhenEditModeThenCodeNotEditable()
throws Exception {
parameters.put("schemaCode", zeSchema.code());
presenter.setParameters(parameters);
assertThat(presenter.isCodeEditable()).isFalse();
}
}