package com.constellio.app.services.migrations.scripts;
import static com.constellio.data.conf.HashingEncoding.BASE64;
import static com.constellio.sdk.tests.TestUtils.asMap;
import static java.util.Arrays.asList;
import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.data.MapEntry.entry;
import java.io.File;
import java.io.IOException;
import java.security.NoSuchAlgorithmException;
import java.security.spec.InvalidKeySpecException;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.regex.Pattern;
import org.junit.Before;
import org.junit.Test;
import com.constellio.app.entities.schemasDisplay.SchemaTypeDisplayConfig;
import com.constellio.app.modules.rm.wrappers.Folder;
import com.constellio.app.services.schemasDisplay.SchemasDisplayManager;
import com.constellio.data.conf.DigitSeparatorMode;
import com.constellio.data.conf.PropertiesDataLayerConfiguration.InMemoryDataLayerConfiguration;
import com.constellio.data.dao.managers.config.ConfigManagerException;
import com.constellio.model.entities.Language;
import com.constellio.model.entities.schemas.MetadataSchemaTypes;
import com.constellio.model.entities.schemas.MetadataValueType;
import com.constellio.model.entities.schemas.RegexConfig;
import com.constellio.model.entities.schemas.Schemas;
import com.constellio.model.services.schemas.MetadataList;
import com.constellio.model.services.schemas.MetadataSchemaTypesAlteration;
import com.constellio.model.services.schemas.MetadataSchemasManager;
import com.constellio.model.services.schemas.MetadataSchemasManagerException;
import com.constellio.model.services.schemas.builders.MetadataSchemaTypesBuilder;
import com.constellio.sdk.tests.ConstellioTest;
import com.constellio.sdk.tests.DataLayerConfigurationAlteration;
import com.constellio.sdk.tests.SDKFoldersLocator;
public class CoreMigrationTo_6_3AcceptanceTest extends ConstellioTest {
@Before
public void setup() {
MetadataSchemasManager.cacheEnabled = false;
}
@Test
public void whenMigratingFromASystemWithPopulatorsThanPopulatorsReadWriteCorrectly()
throws ConfigManagerException.OptimisticLockingConfiguration, NoSuchAlgorithmException, IOException, InvalidKeySpecException, MetadataSchemasManagerException.OptimisticLocking {
givenSystemAtVersion5_1_2withTokens();
MetadataSchemasManager schemasManager = getModelLayerFactory().getMetadataSchemasManager();
MetadataSchemaTypes types = schemasManager.getSchemaTypes(zeCollection);
MetadataList populated = types.getAllMetadatas().onlyPopulated();
assertThat(populated).extracting("localCode")
.containsOnly("author", "emailObject", "emailCCTo", "subject", "company", "emailTo", "emailFrom", "emailBCCTo");
MetadataSchemaTypesBuilder builder = getModelLayerFactory().getMetadataSchemasManager().modify(zeCollection);
builder.getMetadata("document_default_author")
.setLabels(asMap(Language.French, "zAuthor fr", Language.English, "zAuthor en"));
schemasManager.saveUpdateSchemaTypes(builder);
MetadataList allMetadata = schemasManager.getSchemaTypes(zeCollection).getAllMetadatas();
assertThat(allMetadata.onlyPopulated()).extracting("localCode")
.containsOnly("author", "emailObject", "emailCCTo", "subject", "company", "emailTo", "emailFrom", "emailBCCTo");
assertThat(allMetadata.getMetadataWithLocalCode("author").getLabels()).containsOnly(
entry(Language.French, "zAuthor fr"),
entry(Language.English, "zAuthor en")
);
schemasManager.modify(zeCollection, new MetadataSchemaTypesAlteration() {
@Override
public void alter(MetadataSchemaTypesBuilder types) {
types.getSchema(Folder.DEFAULT_SCHEMA).create("zMeta").setType(MetadataValueType.STRING)
.getPopulateConfigsBuilder()
.setStyles(asList("zStyle")).setRegexes(
asList(new RegexConfig(Schemas.TITLE_CODE, Pattern.compile("title"), "zTitle",
RegexConfig.RegexConfigType.SUBSTITUTION)));
types.getMetadata(Folder.DEFAULT_SCHEMA + "_" + Folder.BORROW_USER).getPopulateConfigsBuilder()
.setStyles(asList("zStyle"));
}
});
allMetadata = schemasManager.getSchemaTypes(zeCollection).getAllMetadatas();
assertThat(allMetadata.onlyPopulated()).extracting("localCode")
.containsOnly("author", "emailObject", "emailCCTo", "subject", "company", "emailTo", "emailFrom", "emailBCCTo",
"borrowUser", "zMeta");
}
@Test
public void whenMigratingFromASystemWithSingleLanguageMetadataGroupsThenContinueToWorkNormally()
throws ConfigManagerException.OptimisticLockingConfiguration, NoSuchAlgorithmException, IOException, InvalidKeySpecException, MetadataSchemasManagerException.OptimisticLocking {
givenSystemAtVersion5_1_2withTokens();
SchemasDisplayManager manager = getAppLayerFactory().getMetadataSchemasDisplayManager();
SchemaTypeDisplayConfig typeDisplay = manager.getType(zeCollection, "user");
assertThat(typeDisplay.getMetadataGroup()).hasSize(1);
assertThat(typeDisplay.getMetadataGroup().keySet()).containsOnly("Métadonnées");
typeDisplay = typeDisplay
.withMetadataGroup(configureLabels(Arrays.asList("zeGroup", "zeRequiredGroup", "zeOptionalGroup")));
manager.saveType(typeDisplay);
typeDisplay = manager.getType(zeCollection, "user");
assertThat(typeDisplay.getMetadataGroup()).hasSize(3);
assertThat(typeDisplay.getMetadataGroup().keySet()).containsOnly("zeGroup", "zeRequiredGroup", "zeOptionalGroup");
typeDisplay = typeDisplay
.withMetadataGroup(configureLabels(Arrays.asList("group1", "group2", "group3", "group4")));
manager.saveType(typeDisplay);
typeDisplay = manager.getType(zeCollection, "user");
assertThat(typeDisplay.getMetadataGroup()).hasSize(4);
assertThat(typeDisplay.getMetadataGroup().keySet()).containsOnly("group1", "group2", "group3", "group4");
}
@Test
public void whenMigratingFromAPreviousSystemThenDoNotUseBase64Url()
throws ConfigManagerException.OptimisticLockingConfiguration, NoSuchAlgorithmException, IOException, InvalidKeySpecException, MetadataSchemasManagerException.OptimisticLocking {
configure(new DataLayerConfigurationAlteration() {
@Override
public void alter(InMemoryDataLayerConfiguration configuration) {
configuration.setHashingEncoding(null);
configuration.setContentDaoFileSystemDigitsSeparatorMode(null);
}
});
givenSystemAtVersion5_1_2withTokens();
assertThat(getModelLayerFactory().getDataLayerFactory().getDataLayerConfiguration().getHashingEncoding())
.isEqualTo(BASE64);
assertThat(getModelLayerFactory().getDataLayerFactory().getDataLayerConfiguration()
.getContentDaoFileSystemDigitsSeparatorMode()).isEqualTo(DigitSeparatorMode.TWO_DIGITS);
}
private void givenSystemAtVersion5_1_2withTokens() {
givenTransactionLogIsEnabled();
File statesFolder = new File(new SDKFoldersLocator().getInitialStatesFolder(), "olds");
File state = new File(statesFolder, "given_system_in_5.1.2.2_with_tasks,rm_modules__with_tokens.zip");
getCurrentTestSession().getFactoriesTestFeatures().givenSystemInState(state);
}
private Map<String, Map<Language, String>> configureLabels(List<String> values) {
Map<String, Map<Language, String>> groups = new HashMap<>();
Map<Language, String> labels;
for (String value : values) {
labels = new HashMap<>();
labels.put(Language.French, value);
groups.put(value, labels);
}
return groups;
}
}